集群配置 (proto)
config.cluster.v3.Cluster
[config.cluster.v3.Cluster proto]
单个上游集群的配置。
{
"transport_socket_matches": [],
"name": ...,
"alt_stat_name": ...,
"type": ...,
"cluster_type": {...},
"eds_cluster_config": {...},
"connect_timeout": {...},
"per_connection_buffer_limit_bytes": {...},
"lb_policy": ...,
"load_assignment": {...},
"health_checks": [],
"max_requests_per_connection": {...},
"circuit_breakers": {...},
"upstream_http_protocol_options": {...},
"common_http_protocol_options": {...},
"http_protocol_options": {...},
"http2_protocol_options": {...},
"typed_extension_protocol_options": {...},
"dns_refresh_rate": {...},
"dns_jitter": {...},
"dns_failure_refresh_rate": {...},
"respect_dns_ttl": ...,
"dns_lookup_family": ...,
"dns_resolvers": [],
"use_tcp_for_dns_lookups": ...,
"dns_resolution_config": {...},
"typed_dns_resolver_config": {...},
"wait_for_warm_on_init": {...},
"outlier_detection": {...},
"cleanup_interval": {...},
"upstream_bind_config": {...},
"lb_subset_config": {...},
"ring_hash_lb_config": {...},
"maglev_lb_config": {...},
"original_dst_lb_config": {...},
"least_request_lb_config": {...},
"round_robin_lb_config": {...},
"common_lb_config": {...},
"transport_socket": {...},
"metadata": {...},
"protocol_selection": ...,
"upstream_connection_options": {...},
"close_connections_on_host_health_failure": ...,
"ignore_health_on_host_removal": ...,
"filters": [],
"load_balancing_policy": {...},
"lrs_report_endpoint_metrics": [],
"track_timeout_budgets": ...,
"upstream_config": {...},
"track_cluster_stats": {...},
"preconnect_policy": {...},
"connection_pool_per_downstream_connection": ...
}
- transport_socket_matches
(repeated config.cluster.v3.Cluster.TransportSocketMatch) 用于为不同端点使用不同传输套接字的配置。在 LbEndpoint.Metadata 中
envoy.transport_socket_match
的条目用于与传输套接字匹配,因为它们出现在列表中。如果未找到匹配项,则在 LocalityLbEndpoints.Metadata 中继续搜索。使用第一个 match。例如,使用以下匹配项transport_socket_matches: - name: "enableMTLS" match: acceptMTLS: true transport_socket: name: envoy.transport_sockets.tls config: { ... } # tls socket configuration - name: "defaultToPlaintext" match: {} transport_socket: name: envoy.transport_sockets.raw_buffer
连接到端点,这些端点在
envoy.transport_socket_match
下的元数据值具有“acceptMTLS”/“true”键/值对,使用“enableMTLS”套接字配置。如果提供了具有空匹配条件的 socket match,则该匹配项始终与任何端点匹配。例如,上面情况下的“defaultToPlaintext”套接字匹配项。
如果端点元数据在
envoy.transport_socket_match
下的值与任何TransportSocketMatch
不匹配,则会检查区域元数据以查找匹配项。如果端点或区域元数据中没有任何匹配项,套接字配置将回退到使用此集群中指定的tls_context
或transport_socket
。此字段允许逐步灵活地更改传输套接字配置。
EDS 中端点的元数据可以指示传输套接字功能。例如,端点的元数据可以具有两个键值对,如“acceptMTLS”:“true”,“acceptPlaintext”:“true”。而其他一些端点,只接受明文流量,具有“acceptPlaintext”:“true”元数据信息。
然后,xDS 服务器可以将 CDS 配置到客户端 Envoy A,以便为具有“acceptMTLS”:“true”的端点发送双向 TLS 流量,方法是在此字段中添加相应的
TransportSocketMatch
。其他客户端 Envoy 接收不设置transport_socket_match
的 CDS,并继续向同一集群发送明文流量。此字段可用于通过在健康检查的 transport socket match criteria 字段中添加匹配的键/值对来指定健康检查的自定义传输套接字配置。
- name
(string, REQUIRED) 提供集群的名称,该名称在所有集群中必须是唯一的。如果未提供 alt_stat_name,则在发出 统计信息 时将使用集群名称。集群名称中的任何
:
在发出统计信息时将转换为_
。
- alt_stat_name
(string) 用于可观察性的集群名称的可选替代项。此名称用于发出集群的统计信息和访问日志记录集群名称。这将显示为集群当前状态的配置转储中的附加信息,作为 observability_name,并在跟踪时作为附加标签“upstream_cluster.name”。注意:名称中的任何
:
在发出统计信息时将转换为_
。不要将其与 Router Filter Header 混淆。
- type
(config.cluster.v3.Cluster.DiscoveryType) 用于解析集群的 服务发现类型。
只能设置 type、cluster_type 中的一个。
- cluster_type
(config.cluster.v3.Cluster.CustomClusterType) 自定义集群类型。
只能设置 type、cluster_type 中的一个。
- eds_cluster_config
(config.cluster.v3.Cluster.EdsClusterConfig) 用于集群的 EDS 更新的配置。
- connect_timeout
(Duration) 建立与集群中主机的新网络连接的超时时间。如果未设置,将使用默认值 5 秒。
- per_connection_buffer_limit_bytes
(UInt32Value) 集群连接读写缓冲区大小的软限制。如果未指定,将应用实现定义的默认值 (1MiB)。
注意
此字段应在存在不可信上游的情况下配置。
不可信环境的示例配置
per_connection_buffer_limit_bytes: 32768.0
- lb_policy
(config.cluster.v3.Cluster.LbPolicy) 从集群中选择主机时使用的 负载均衡器类型。
- load_assignment
(config.endpoint.v3.ClusterLoadAssignment) 为指定 STATIC、STRICT_DNS 或 LOGICAL_DNS 集群的成员设置此项是必需的。此字段取代了 v2 API 中的
hosts
字段。注意
设置此项允许非 EDS 集群类型包含嵌入的 EDS 等效 端点分配。
- health_checks
(repeated config.core.v3.HealthCheck) 集群的可选 主动健康检查 配置。如果未指定配置,则不会执行健康检查,并且所有集群成员始终被视为健康。
- max_requests_per_connection
(UInt32Value) 单个上游连接的可选最大请求数。此参数由 HTTP/1.1 和 HTTP/2 连接池实现都遵守。如果未指定,则没有限制。将此参数设置为 1 将有效地禁用保持活动状态。
注意
此字段已弃用,取而代之的是 max_requests_per_connection 字段。
- circuit_breakers
(config.cluster.v3.CircuitBreakers) 集群的可选 断路。
- upstream_http_protocol_options
(config.core.v3.UpstreamHttpProtocolOptions) 仅应用于上游 HTTP 连接的 HTTP 协议选项。这些选项适用于所有 HTTP 版本。此选项已弃用,取而代之的是 upstream_http_protocol_options,它位于 http_protocol_options 消息中。upstream_http_protocol_options 可以通过集群的 extension_protocol_options 设置。有关示例用法,请参阅 upstream_http_protocol_options。
- common_http_protocol_options
(config.core.v3.HttpProtocolOptions) 在上游处理 HTTP 请求时的其他选项。这些选项将适用于 HTTP1 和 HTTP2 请求。此选项已弃用,取而代之的是 common_http_protocol_options,它位于 http_protocol_options 消息中。common_http_protocol_options 可以通过集群的 extension_protocol_options 设置。有关示例用法,请参阅 upstream_http_protocol_options。
- http_protocol_options
(config.core.v3.Http1ProtocolOptions) 处理 HTTP1 请求时的其他选项。此选项已弃用,取而代之的是 http_protocol_options 消息中的 http_protocol_options 字段。http_protocol_options 可以通过集群的 extension_protocol_options 设置。有关示例用法,请参阅 upstream_http_protocol_options。
- http2_protocol_options
(config.core.v3.Http2ProtocolOptions) 即使需要默认的 HTTP/2 协议选项,也必须设置此字段,以便 Envoy 在建立新的 HTTP 连接池连接时假定上游支持 HTTP/2。 目前,Envoy 仅支持上游连接的先验知识。 即使使用 ALPN 的 TLS,也必须指定
http2_protocol_options
。 顺便说一下,这允许在纯文本上进行 HTTP/2 连接。 此功能已弃用,取而代之的是 http_protocol_options 消息中的 http2_protocol_options 字段。 http2_protocol_options 可以通过集群的 extension_protocol_options 设置。 请参阅 upstream_http_protocol_options 以了解示例用法。注意
此字段应在存在不可信上游的情况下配置。
不可信环境的示例配置
http2_protocol_options: initial_connection_window_size: 1048576.0 initial_stream_window_size: 65536.0
- typed_extension_protocol_options
(repeated map<string, Any>) extension_protocol_options 字段用于为上游连接提供特定于扩展的协议选项。 键应与扩展过滤器名称匹配,例如“envoy.filters.network.thrift_proxy”。 请参阅扩展的文档以了解有关特定选项的详细信息。
- dns_refresh_rate
(Duration) 如果指定了 DNS 刷新速率,并且集群类型为 STRICT_DNS 或 LOGICAL_DNS,则此值用作集群的 DNS 刷新速率。 配置的值必须至少为 1 毫秒。 如果未指定此设置,则默认值为 5000 毫秒。 对于除 STRICT_DNS 和 LOGICAL_DNS 以外的集群类型,此设置将被忽略。
- dns_jitter
(Duration) 如果集群类型为 STRICT_DNS 或 LOGICAL_DNS,则可以选择指定 DNS 抖动。 DNS 抖动会导致集群通过随机时间延迟刷新 DNS 条目,以避免 DNS 请求的集中涌入。 此值设置随机量上限(不含)。 如果省略此值,则不会进行抖动。 对于除 STRICT_DNS 和 LOGICAL_DNS 以外的集群类型,此设置将被忽略。
- dns_failure_refresh_rate
(config.cluster.v3.Cluster.RefreshRate) 如果指定了 DNS 故障刷新速率,并且集群类型为 STRICT_DNS 或 LOGICAL_DNS,则在请求失败时用作集群的 DNS 刷新速率。 如果未指定此设置,则故障刷新速率默认为 DNS 刷新速率。 对于除 STRICT_DNS 和 LOGICAL_DNS 以外的集群类型,此设置将被忽略。
- respect_dns_ttl
(bool) 用于设置集群 DNS 刷新速率的可选配置。 如果将该值设置为 true,则集群的 DNS 刷新速率将设置为来自 DNS 解析的资源记录的 TTL。
- dns_lookup_family
(config.cluster.v3.Cluster.DnsLookupFamily) DNS IP 地址解析策略。 如果未指定此设置,则默认值为 AUTO。
- dns_resolvers
(repeated config.core.v3.Address) 如果指定了 DNS 解析器,并且集群类型为 STRICT_DNS 或 LOGICAL_DNS,则此值用于指定集群的 DNS 解析器。 如果未指定此设置,则默认值为默认解析器,该解析器使用 /etc/resolv.conf 进行配置。 对于除 STRICT_DNS 和 LOGICAL_DNS 以外的集群类型,此设置将被忽略。 此字段已弃用,取而代之的是
dns_resolution_config
,它将所有 DNS 解析器配置汇总到单个消息中。
- use_tcp_for_dns_lookups
(bool) 始终使用 TCP 查询而不是 UDP 查询进行 DNS 查找。 此字段已弃用,取而代之的是
dns_resolution_config
,它将所有 DNS 解析器配置汇总到单个消息中。
- dns_resolution_config
(config.core.v3.DnsResolutionConfig) DNS 解析配置,包括底层 DNS 解析器地址和选项。 此字段已弃用,取而代之的是 typed_dns_resolver_config。
- typed_dns_resolver_config
(config.core.v3.TypedExtensionConfig) DNS 解析器类型配置扩展。 此扩展可用于配置 c-ares、apple 或任何其他 DNS 解析器类型以及相关参数。 例如,CaresDnsResolverConfig 的对象可以打包到此
typed_dns_resolver_config
中。 此配置替换了 dns_resolution_config 配置。 在同时存在dns_resolution_config
和typed_dns_resolver_config
的过渡期间,当typed_dns_resolver_config
存在时,Envoy 将使用它并忽略dns_resolution_config
。 当typed_dns_resolver_config
缺失时,将使用默认行为。
- wait_for_warm_on_init
(BoolValue) 用于让集群准备就绪状态阻塞在预热上的可选配置。 目前,仅适用于 STRICT_DNS 或 LOGICAL_DNS 或 Redis 集群。 如果为 true,则集群准备就绪状态将阻塞在预热上。 如果为 false,则无论预热是否已完成,集群都将完成初始化。 默认值为 true。
- outlier_detection
(config.cluster.v3.OutlierDetection) 如果指定,则将为此上游集群启用异常值检测。 每个配置值都可以通过 运行时值 覆盖。
- cleanup_interval
(Duration) 用于从集群类型 ORIGINAL_DST 中删除陈旧主机的间隔。 如果在该间隔内未用作上游目标,则主机将被视为陈旧。 随着新连接被重定向到 Envoy,新主机将按需添加到原始目标集群,从而导致集群中的主机数量随着时间的推移而增长。 未被视为陈旧(它们被用作活动目标)的主机将保留在集群中,这使得与它们的连接保持打开状态,从而节省了原本用于打开新连接的延迟。 如果未指定此设置,则默认值为 5000 毫秒。 对于除 ORIGINAL_DST 以外的集群类型,此设置将被忽略。
- upstream_bind_config
(config.core.v3.BindConfig) 用于绑定新建立的上游连接的可选配置。 此配置会覆盖引导程序协议中指定的任何 bind_config。 如果地址和端口为空,则不会执行绑定。
- lb_subset_config
(config.cluster.v3.Cluster.LbSubsetConfig) 用于负载均衡子集的配置。
- ring_hash_lb_config
(config.cluster.v3.Cluster.RingHashLbConfig) 环形哈希负载均衡策略的可选配置。
LbPolicy 选择的负载均衡算法的可选配置。 目前,只有 RING_HASH、MAGLEV 和 LEAST_REQUEST 具有其他配置选项。 在未设置相应的 LbPolicy 的情况下指定 ring_hash_lb_config 或 maglev_lb_config 或 least_request_lb_config 将在运行时生成错误。
只能设置一个 ring_hash_lb_config、maglev_lb_config、original_dst_lb_config、least_request_lb_config、round_robin_lb_config。
- maglev_lb_config
(config.cluster.v3.Cluster.MaglevLbConfig) Maglev 负载均衡策略的可选配置。
LbPolicy 选择的负载均衡算法的可选配置。 目前,只有 RING_HASH、MAGLEV 和 LEAST_REQUEST 具有其他配置选项。 在未设置相应的 LbPolicy 的情况下指定 ring_hash_lb_config 或 maglev_lb_config 或 least_request_lb_config 将在运行时生成错误。
只能设置一个 ring_hash_lb_config、maglev_lb_config、original_dst_lb_config、least_request_lb_config、round_robin_lb_config。
- original_dst_lb_config
(config.cluster.v3.Cluster.OriginalDstLbConfig) 原始目标负载均衡策略的可选配置。
LbPolicy 选择的负载均衡算法的可选配置。 目前,只有 RING_HASH、MAGLEV 和 LEAST_REQUEST 具有其他配置选项。 在未设置相应的 LbPolicy 的情况下指定 ring_hash_lb_config 或 maglev_lb_config 或 least_request_lb_config 将在运行时生成错误。
只能设置一个 ring_hash_lb_config、maglev_lb_config、original_dst_lb_config、least_request_lb_config、round_robin_lb_config。
- least_request_lb_config
(config.cluster.v3.Cluster.LeastRequestLbConfig) 最少请求负载均衡策略的可选配置。
LbPolicy 选择的负载均衡算法的可选配置。 目前,只有 RING_HASH、MAGLEV 和 LEAST_REQUEST 具有其他配置选项。 在未设置相应的 LbPolicy 的情况下指定 ring_hash_lb_config 或 maglev_lb_config 或 least_request_lb_config 将在运行时生成错误。
只能设置一个 ring_hash_lb_config、maglev_lb_config、original_dst_lb_config、least_request_lb_config、round_robin_lb_config。
- round_robin_lb_config
(config.cluster.v3.Cluster.RoundRobinLbConfig) 轮询负载均衡策略的可选配置。
LbPolicy 选择的负载均衡算法的可选配置。 目前,只有 RING_HASH、MAGLEV 和 LEAST_REQUEST 具有其他配置选项。 在未设置相应的 LbPolicy 的情况下指定 ring_hash_lb_config 或 maglev_lb_config 或 least_request_lb_config 将在运行时生成错误。
只能设置一个 ring_hash_lb_config、maglev_lb_config、original_dst_lb_config、least_request_lb_config、round_robin_lb_config。
- common_lb_config
(config.cluster.v3.Cluster.CommonLbConfig) 所有负载均衡实现的通用配置。
- transport_socket
(config.core.v3.TransportSocket) 用于上游连接的可选自定义传输套接字实现。要设置 TLS,请设置一个名为
envoy.transport_sockets.tls
的传输套接字,并在typed_config
中设置 UpstreamTlsContexts。如果没有指定传输套接字配置,则将使用明文建立新连接。
- metadata
(config.core.v3.Metadata) Metadata 字段可用于提供有关集群的附加信息。它可用于统计信息、日志记录和更改过滤器行为。字段应使用反向 DNS 符号表示法来表示 Envoy 中哪个实体需要该信息。例如,如果元数据 предназначена для фильтра Router,则过滤器名称应指定为
envoy.filters.http.router
。
- protocol_selection
(config.cluster.v3.Cluster.ClusterProtocolSelection) 确定 Envoy 如何选择用于与上游主机通信的协议。此选项已弃用,取而代之的是在 http_protocol_options 消息中设置显式协议选择。http_protocol_options 可以通过集群的 extension_protocol_options 设置。
- upstream_connection_options
(config.cluster.v3.UpstreamConnectionOptions) 上游连接的可选选项。
- close_connections_on_host_health_failure
(bool) 如果上游主机变得不健康(由配置的运行状况检查或异常值检测确定),请立即关闭与失败主机的所有连接。
注意
目前仅支持由 tcp_proxy 创建的连接。
注意
此功能的当前实现会在检测到不健康状态时立即关闭所有连接。如果存在大量打开到变得不健康的远程主机的连接,Envoy 可能会花费大量时间专门关闭这些连接,而不会处理任何其他流量。
- ignore_health_on_host_removal
(bool) 如果设置为 true,Envoy 将在处理从服务发现中删除主机时忽略主机的运行状况值。这意味着,如果使用主动运行状况检查,Envoy 不会 等待端点变为不健康,然后再将其删除。
- filters
(repeated config.cluster.v3.Filter) 一个(可选的)网络过滤器链,按应应用过滤器的顺序列出。该链将应用于 Envoy 对该集群的上游服务器进行的所有传出连接。
- load_balancing_policy
(config.cluster.v3.LoadBalancingPolicy) 如果设置了此字段并且受客户端支持,它将优先于 lb_policy 的值。
- lrs_report_endpoint_metrics
(repeated string) 从 ORCA 负载报告 传播到 LRS 的指标名称列表。
如果未指定,则不会将 ORCA 负载报告传播到 LRS。
对于 ORCA proto 中的映射字段,字符串将采用
<map_field_name>.<map_key>
的形式。例如,字符串named_metrics.foo
将意味着在 ORCA 的 named_metrics 字段中查找键foo
。特殊映射键
*
表示报告映射中的所有条目(例如,named_metrics.*
表示报告 ORCA named_metrics 字段中的所有条目)。请注意,这应仅与受信任的后端一起使用。LRS 中的指标名称将遵循与该字段相同的语义。换句话说,如果该字段包含
named_metrics.foo
,则 LRS 负载报告将包含以该字符串作为键的数据。
- track_timeout_budgets
(bool) 如果 track_timeout_budgets 为 true,则将为每个请求发布 超时预算直方图。这些直方图显示请求的每个尝试和全局超时的百分比。值为 0 表示未使用超时,或者超时无限大。值为 100 表示请求使用了其所有超时。
注意
此字段已弃用,取而代之的是
timeout_budgets
,它是 track_cluster_stats 的一部分。
- upstream_config
(config.core.v3.TypedExtensionConfig) 上游连接池和上游类型的可选自定义和配置。
目前,此字段仅适用于 HTTP 流量,但旨在最终用于自定义 TCP 上游。
对于 HTTP 流量,Envoy 通常会将下游 HTTP 作为上游 HTTP 发送,使用 http 连接池和来自
http2_protocol_options
的编解码器。对于配置了 CONNECT 终止的路由,Envoy 将接收下游 CONNECT 请求并使用 tcp 连接池通过原始 TCP 将 CONNECT 负载转发到上游。
使用的默认池是通用连接池,该池为大多数 HTTP 请求创建 HTTP 上游,以及如果配置了 CONNECT 终止,则创建 TCP 上游。
如果用户希望自定义连接池或上游行为(例如,仅当自定义过滤器指示合适时才终止 CONNECT),则可以在这里注册和配置自定义工厂。
- track_cluster_stats
(config.cluster.v3.TrackClusterStats) 用于跟踪可选集群统计信息的配置。
- preconnect_policy
(config.cluster.v3.Cluster.PreconnectPolicy) 此集群的预连接配置。
- connection_pool_per_downstream_connection
(bool) 如果
connection_pool_per_downstream_connection
为 true,则集群将为每个下游连接使用单独的连接池。
config.cluster.v3.Cluster.TransportSocketMatch
[config.cluster.v3.Cluster.TransportSocketMatch proto]
TransportSocketMatch 指定满足匹配条件时将使用哪个传输套接字配置。
{
"name": ...,
"match": {...},
"transport_socket": {...}
}
- name
(string, REQUIRED) 匹配的名称,用于统计信息生成。
- match
(Struct) 可选的元数据匹配条件。与该字段中设置的内容匹配的元数据的端点连接将使用此处指定的传输套接字配置。端点在
envoy.transport_socket_match
中的元数据条目用于匹配该字段中指定的值。
- transport_socket
(config.core.v3.TransportSocket) 传输套接字的配置。
提示
此扩展类别具有以下已知扩展
config.cluster.v3.Cluster.CustomClusterType
[config.cluster.v3.Cluster.CustomClusterType proto]
扩展集群类型。
{
"name": ...,
"typed_config": {...}
}
- name
(string, REQUIRED) 要实例化的集群的类型。名称必须与支持的集群类型匹配。
- typed_config
(Any) 依赖于要实例化的集群的集群特定配置。有关更多文档,请参阅支持的集群。
config.cluster.v3.Cluster.EdsClusterConfig
[config.cluster.v3.Cluster.EdsClusterConfig proto]
仅在发现类型为 EDS 时有效。
{
"eds_config": {...},
"service_name": ...
}
- eds_config
(config.core.v3.ConfigSource) 此集群的 EDS 更新来源的配置。
- service_name
(string) 对 EDS 显示的可选集群名称替代方案。它没有与集群名称相同的限制,即它可以是任意长度。它可以是 xdstp:// URL。
config.cluster.v3.Cluster.LbSubsetConfig
[config.cluster.v3.Cluster.LbSubsetConfig proto]
可选地将此集群中的端点划分为由端点元数据定义的子集,并由路由和加权集群元数据选择。
{
"fallback_policy": ...,
"default_subset": {...},
"subset_selectors": [],
"locality_weight_aware": ...,
"scale_locality_weight": ...,
"panic_mode_any": ...,
"list_as_any": ...,
"metadata_fallback_policy": ...
}
- fallback_policy
(config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetFallbackPolicy) 当没有端点子集与所选路由的元数据匹配时使用的行为。该值默认为 NO_FALLBACK。
- default_subset
(Struct) 指定 fallback_policy 为 DEFAULT_SUBSET 时使用的默认端点子集。default_subset 中的每个字段都会与匹配的 LbEndpoint.Metadata 在
envoy.lb
命名空间下的值进行比较。如果没有任何主机匹配,则也是有效的,在这种情况下,行为与 fallback_policy 为 NO_FALLBACK 相同。
- subset_selectors
(repeated config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector) 对于每个条目,都会遍历 LbEndpoint.Metadata 的
envoy.lb
命名空间,并为每个键值组合创建子集。例如{ "subset_selectors": [ { "keys": [ "version" ] }, { "keys": [ "stage", "hardware_type" ] } ]}
当选定路由和加权集群中的元数据包含与子集元数据相同的键和值时,就会匹配子集。同一主机可能出现在多个子集中。
- locality_weight_aware
(bool) 如果为 true,则路由到子集时会在进行路由决策时考虑端点的区域和区域权重。
启用此功能存在一些潜在的陷阱,因为在应用子集匹配和区域权重后,最终的流量分配可能会不符合预期。
例如,假设在两个区域 X/Y 之间存在 50/50 的分配,这两个区域各有 100 个主机,并且没有使用子集。如果子集负载均衡导致 X 仅选择 1 个主机,而 Y 选择 100 个主机,那么在 X 中的单个主机上的负载量将远大于通过 EDS 传递的负载均衡分配中最初预期的负载量。
- scale_locality_weight
(bool) 当与 locality_weight_aware 一起使用时,会根据子集中主机与原始子集中主机的比率来缩放每个区域的权重。如果某个区域受到子集谓词的影响过大,此操作旨在均衡发送到该区域的负载。
- panic_mode_any
(bool) 如果为 true,则当配置了回退策略并且其对应的子集无法找到主机时,这会导致选择任何主机。
当使用默认子集作为回退策略时,这很有用,因为默认子集可能会变为空。如果启用了此选项,并且这种情况发生,负载均衡将尝试从整个集群中选择主机。
- list_as_any
(bool) 如果为 true,则将对指定为元数据键的元数据与相应的端点元数据进行匹配,前提是端点元数据完全匹配该值,或者它是列表值,并且列表中的任何元素都匹配该条件。
- metadata_fallback_policy
(config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetMetadataFallbackPolicy) 回退机制,允许尝试不同的路由元数据,直到找到主机为止。如果负载均衡过程(包括其所有机制(如 fallback_policy))无法选择主机,此策略将决定是否以及如何使用其他元数据重复该过程。
默认值为 METADATA_NO_FALLBACK.
config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector
[config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector proto]
子集的规范。
{
"keys": [],
"single_host_per_subset": ...,
"fallback_policy": ...,
"fallback_keys_subset": []
}
- keys
(repeated string) 要与加权集群元数据匹配的键列表。
- single_host_per_subset
(bool) 选择一种操作模式,其中每个子集只有一个主机。此模式使用相同的规则选择主机,但更新主机速度更快,特别是对于大量主机而言。
如果找到与主机的匹配项,则将使用该主机,而与优先级级别无关。
启用此模式时,包含多个具有相同元数据值的配置(针对
keys
中的单个键)将仅使用其中一个主机;不会将任何请求路由到其他主机。集群指标 lb_subsets_single_host_per_subset_duplicate 指示当前配置中存在多少个重复项。
- fallback_policy
(config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector.LbSubsetSelectorFallbackPolicy) 当没有端点子集与选定路由的元数据匹配时使用的行为。
- fallback_keys_subset
(repeated string) keys 的子集,由 KEYS_SUBSET 回退策略使用。如果选择了 KEYS_SUBSET 回退策略,则它必须是一个非空列表。对于任何其他回退策略,该参数都不会使用,也不应该设置。仅允许在 keys 中也存在的 value,但
fallback_keys_subset
不能等于keys
。
Enum config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector.LbSubsetSelectorFallbackPolicy
[config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector.LbSubsetSelectorFallbackPolicy proto]
允许按选择器覆盖顶层回退策略。
- NOT_DEFINED
(DEFAULT) 如果 NOT_DEFINED,则使用顶层配置回退策略。
- NO_FALLBACK
如果选择了 NO_FALLBACK,则会报告等效于没有健康主机的结果。
- ANY_ENDPOINT
如果选择了 ANY_ENDPOINT,则可能会返回任何集群端点(受策略、健康检查等影响)。
- DEFAULT_SUBSET
如果选择了 DEFAULT_SUBSET,则将在匹配 default_subset 字段中的值的端点上执行负载均衡。
- KEYS_SUBSET
如果选择了 KEYS_SUBSET,则使用减少为 fallback_keys_subset 的元数据键再次执行子集选择器匹配。如果选择器的一些键被认为是可选的,则允许回退到不同的、不太具体的选择器。
Enum config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetFallbackPolicy
[config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetFallbackPolicy proto]
如果选择了 NO_FALLBACK,则会报告等效于没有健康主机的结果。如果选择了 ANY_ENDPOINT,则可能会返回任何集群端点(受策略、健康检查等影响)。如果选择了 DEFAULT_SUBSET,则将在匹配 default_subset 字段中的值的端点上执行负载均衡。
- NO_FALLBACK
(DEFAULT)
- ANY_ENDPOINT
- DEFAULT_SUBSET
Enum config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetMetadataFallbackPolicy
[config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetMetadataFallbackPolicy proto]
- METADATA_NO_FALLBACK
(DEFAULT) 没有回退。将按原样使用路由元数据。
- FALLBACK_LIST
将使用一个特殊的元数据键
fallback_list
来提供要尝试的元数据变体。fallback_list
键的值必须是列表。每个列表元素必须是结构体 - 它将与路由元数据合并,覆盖出现在两者的键。fallback_list
条目将按顺序使用,直到找到主机为止。在执行子集负载均衡之前,会从元数据中删除
fallback_list
键本身。示例
对于元数据
version: 1.0 fallback_list: - version: 2.0 hardware: c64 - hardware: c32 - version: 3.0
首先,将使用元数据
{"version": "2.0", "hardware": "c64"}
进行负载均衡。如果未找到主机,则将使用元数据
{"version": "1.0", "hardware": "c32"}
进行下一次尝试。如果仍然找不到主机,最后将使用元数据
{"version": "3.0"}
。
config.cluster.v3.Cluster.SlowStartConfig
[config.cluster.v3.Cluster.SlowStartConfig proto]
用于 慢启动模式 的配置。
{
"slow_start_window": {...},
"aggression": {...},
"min_weight_percent": {...}
}
- slow_start_window
(Duration) 表示慢启动窗口的大小。如果设置,则新创建的主机将从其创建时间开始进入慢启动模式,持续时间为慢启动窗口。
- aggression
(config.core.v3.RuntimeDouble) 此参数控制慢启动窗口内流量增加的速度。默认为 1.0,因此端点将获得线性增加的流量量。当增加此参数的值时,流量斜坡上升的速度会非线性增加。aggression 参数的值应大于 0.0。通过调整参数,可以实现斜坡上升曲线的多项式或指数形状。
在慢启动窗口期间,端点的有效权重将按时间因子和侵略性进行缩放:
new_weight = weight * max(min_weight_percent, time_factor ^ (1 / aggression))
,其中time_factor=(time_since_start_seconds / slow_start_time_seconds)
。随着时间的推移,会将越来越多的流量发送到处于慢启动窗口的端点。一旦主机退出慢启动,时间因子和侵略性就不再影响其权重。
- min_weight_percent
(type.v3.Percent) 配置原始权重的最小百分比,以避免过小的新权重,这可能会导致处于慢启动模式的端点在慢启动窗口内接收不到流量。如果未指定,则默认为 10%。
config.cluster.v3.Cluster.RoundRobinLbConfig
[config.cluster.v3.Cluster.RoundRobinLbConfig proto]
轮询负载均衡策略的特定配置。
{
"slow_start_config": {...}
}
- slow_start_config
(config.cluster.v3.Cluster.SlowStartConfig) 慢启动模式的配置。如果未设置此配置,则不会启用慢启动。
config.cluster.v3.Cluster.LeastRequestLbConfig
[config.cluster.v3.Cluster.LeastRequestLbConfig proto]
最少请求负载均衡策略的特定配置。
{
"choice_count": {...},
"active_request_bias": {...},
"slow_start_config": {...}
}
- choice_count
(UInt32Value) 从中选择具有最少活动请求的主机的随机健康主机的数量。默认为 2,因此如果未设置此字段,我们将执行二选一选择。
- active_request_bias
(config.core.v3.RuntimeDouble) 当主机具有不同的负载均衡权重时,使用以下公式计算动态权重
weight = load_balancing_weight / (active_requests + 1)^active_request_bias
当所有主机权重不相等时,活跃请求偏差越大,活跃请求对有效权重的降低就越积极。
active_request_bias
必须大于或等于 0.0。当
active_request_bias == 0.0
时,最少请求负载均衡器在选择主机时不会考虑活动请求数量,并且行为类似于轮询负载均衡器。当
active_request_bias > 0.0
时,最少请求负载均衡器会根据选择主机时活动请求的数量来缩放负载均衡权重。出于性能原因,该值被缓存并每当负载均衡器的任何主机集发生更改时刷新,例如,每当主机成员资格更新或主机负载均衡权重更改时。
注意
此设置仅在所有主机权重不相等时生效。
- slow_start_config
(config.cluster.v3.Cluster.SlowStartConfig) 慢启动模式的配置。如果未设置此配置,则不会启用慢启动。
config.cluster.v3.Cluster.RingHashLbConfig
[config.cluster.v3.Cluster.RingHashLbConfig proto]
针对 RingHash 负载均衡策略的特定配置。
{
"minimum_ring_size": {...},
"hash_function": ...,
"maximum_ring_size": {...}
}
- minimum_ring_size
(UInt64Value) 最小哈希环大小。环越大(即,为每个提供的主机提供更多的哈希值),请求分发就越能反映所需的权重。默认为 1024 个条目,限制为 8M 个条目。另请参阅 maximum_ring_size。
- hash_function
(config.cluster.v3.Cluster.RingHashLbConfig.HashFunction) 用于将主机哈希到 ketama 环上的哈希函数。该值默认为 XX_HASH。
- maximum_ring_size
(UInt64Value) 最大哈希环大小。默认为 8M 个条目,限制为 8M 个条目,但可以降低以进一步限制资源使用。另请参阅 minimum_ring_size。
Enum config.cluster.v3.Cluster.RingHashLbConfig.HashFunction
[config.cluster.v3.Cluster.RingHashLbConfig.HashFunction proto]
用于将主机哈希到 ketama 环上的哈希函数。
- XX_HASH
(DEFAULT) 使用 xxHash,这是默认哈希函数。
- MURMUR_HASH_2
使用 MurmurHash2,这与 GNU libstdc++ 3.4.20 或更高版本中的 std:hash<string> 兼容。这通常是在 Linux 上编译而不是在 macOS 上编译时的情况。
config.cluster.v3.Cluster.MaglevLbConfig
[config.cluster.v3.Cluster.MaglevLbConfig proto]
针对 Maglev 负载均衡策略的特定配置。
{
"table_size": {...}
}
- table_size
(UInt64Value) Maglev 哈希的表大小。Maglev 旨在实现“最小干扰”,而不是绝对保证。最小干扰意味着,当上游主机集发生变化时,连接很可能被发送到与之前相同的上游。增加表大小会减少干扰量。表大小必须是素数,限制为 5000011。如果未指定,则默认为 65537。
config.cluster.v3.Cluster.OriginalDstLbConfig
[config.cluster.v3.Cluster.OriginalDstLbConfig proto]
针对 原始目标 负载均衡策略的特定配置。
此扩展的限定名称为 envoy.clusters.original_dst
注意
此扩展旨在对不可信的下游和上游流量都具有鲁棒性。
{
"use_http_header": ...,
"http_header_name": ...,
"upstream_port_override": {...},
"metadata_key": {...}
}
- use_http_header
(bool) 当为 true 时,可以使用 HTTP 标头覆盖原始 dst 地址。默认标头为 x-envoy-original-dst-host。
注意
此标头默认情况下不会被清理,因此启用此功能允许 HTTP 客户端将流量路由到任意主机和/或端口,这可能会带来严重的安全性问题。
注意
如果标头出现多次,则仅使用第一个值。
- http_header_name
(string) 如果 use_http_header 设置为 true,则用于覆盖目标地址的 http 标头。如果值为空,则将使用 x-envoy-original-dst-host。
- upstream_port_override
(UInt32Value) 用于覆盖原始 dst 地址的端口。此端口将优先于过滤器状态和标头覆盖端口
- metadata_key
(type.metadata.v3.MetadataKey) 用于覆盖目标地址的动态元数据键。首先考虑请求元数据,然后考虑连接元数据。
config.cluster.v3.Cluster.CommonLbConfig
[config.cluster.v3.Cluster.CommonLbConfig proto]
所有负载均衡器实现的通用配置。
{
"healthy_panic_threshold": {...},
"zone_aware_lb_config": {...},
"locality_weighted_lb_config": {...},
"update_merge_window": {...},
"ignore_new_hosts_until_first_hc": ...,
"close_connections_on_host_set_change": ...,
"consistent_hashing_lb_config": {...},
"override_host_status": {...}
}
- healthy_panic_threshold
(type.v3.Percent) 配置 健康恐慌阈值。如果未指定,则默认为 50%。要禁用恐慌模式,请设置为 0%。
注意
指定的百分比将被截断为最接近的 1%。
- zone_aware_lb_config
(config.cluster.v3.Cluster.CommonLbConfig.ZoneAwareLbConfig)
只能设置 zone_aware_lb_config 或 locality_weighted_lb_config 中的一个。
- locality_weighted_lb_config
(config.cluster.v3.Cluster.CommonLbConfig.LocalityWeightedLbConfig)
只能设置 zone_aware_lb_config 或 locality_weighted_lb_config 中的一个。
- update_merge_window
(Duration) 如果设置,则在此持续时间内发生的所有健康检查/权重/元数据更新都将合并,并在持续时间到期后一次性传递。持续时间的开始是第一个更新发生的时间。这对于大型集群很有用,这些集群可能会有很多噪声部署,这些部署可能会由于健康检查状态变化或元数据更新的持续流而触发过度的 CPU 使用率。要看到的第一个更新集将立即应用(例如:一个新的集群)。请始终牢记沙盒技术的应用可能会改变这种行为。
如果未设置,我们将默认为 1000ms 的合并窗口。要禁用它,请将合并窗口设置为 0。
注意:合并不适用于集群成员资格更改(例如:添加/删除);这是因为合并这些更新目前并不安全。见 https://github.com/envoyproxy/envoy/pull/3941。
- ignore_new_hosts_until_first_hc
(bool) 如果设置为 true,Envoy 将 排除 在计算负载均衡权重时新主机,直到它们首次进行健康检查。除非还配置了活动健康检查,否则这将不起作用。
- close_connections_on_host_set_change
(bool) 如果设置为
true
,则集群管理器将在每当向集群添加或删除主机时,清空对上游主机的所有现有连接。
- consistent_hashing_lb_config
(config.cluster.v3.Cluster.CommonLbConfig.ConsistentHashingLbConfig) 所有一致性哈希负载均衡器的通用配置(MaglevLb、RingHashLb 等)
- override_host_status
(config.core.v3.HealthStatusSet) 这控制在使用 主机覆盖 时哪些主机被视为有效,某些过滤器使用它来修改负载均衡决策。
如果未设置,则默认情况下将应用 [UNKNOWN、HEALTHY、DEGRADED]。如果用空状态集设置,则负载均衡将忽略主机覆盖。
config.cluster.v3.Cluster.CommonLbConfig.ZoneAwareLbConfig
[config.cluster.v3.Cluster.CommonLbConfig.ZoneAwareLbConfig proto]
针对 区域感知路由 的配置。
{
"routing_enabled": {...},
"min_cluster_size": {...},
"fail_traffic_on_panic": ...
}
- routing_enabled
(type.v3.Percent) 配置如果配置了区域感知路由,将被视为区域感知路由的请求百分比。如果未指定,则默认为 100%。 * 运行时值。 * 区域感知路由支持。
- min_cluster_size
(UInt64Value) 配置区域感知路由所需的最小上游集群大小。如果上游集群大小小于指定大小,则即使配置了区域感知路由,也不会执行区域感知路由。如果未指定,则默认为 6。 * 运行时值。 * 区域感知路由支持。
config.cluster.v3.Cluster.CommonLbConfig.LocalityWeightedLbConfig
[config.cluster.v3.Cluster.CommonLbConfig.LocalityWeightedLbConfig proto]
用于 区域加权负载均衡 的配置
config.cluster.v3.Cluster.CommonLbConfig.ConsistentHashingLbConfig
[config.cluster.v3.Cluster.CommonLbConfig.ConsistentHashingLbConfig proto]
所有一致哈希负载均衡器(MaglevLb、RingHashLb 等)的通用配置
{
"use_hostname_for_hashing": ...,
"hash_balance_factor": {...}
}
- use_hostname_for_hashing
(bool) 如果设置为
true
,集群将使用主机名而不是解析的地址作为一致哈希到上游主机的键。仅对解析为单个 IP 地址的主机名的 StrictDNS 集群有效。
- hash_balance_factor
(UInt32Value) 配置每个上游主机绑定的平均集群负载百分比。例如,值为 150 时,任何上游主机的负载都不会超过集群中所有主机的平均负载的 1.5 倍。如果未指定,则不会对任何上游主机进行负载绑定。此参数的典型值为 120 到 200。最小值为 100。
适用于环形哈希和 Maglev 负载均衡器。
这是基于论文 https://arxiv.org/abs/1608.01350 中描述的方法实现的。对于指定的
hash_balance_factor
,对任何上游主机的请求都限制在hash_balance_factor/100
倍于整个集群的平均请求数。当对当前正在以最大容量提供服务的某个上游主机的请求到达时,将使用线性探测来识别合格的主机。此外,线性探测是使用主机环/表中的随机跳跃来实现的,以识别合格的主机(此技术如论文 https://arxiv.org/abs/1908.08762 中所述 - 随机跳跃避免了在选择环/表中的下一个主机时出现的级联溢出效应)。如果在主机上指定了权重,则会尊重它们。
这是一个 O(N) 算法,与其他负载均衡器不同。使用较低的
hash_balance_factor
会导致更多主机被探测,因此如果您需要更好的性能,请使用更高的值。
config.cluster.v3.Cluster.RefreshRate
[config.cluster.v3.Cluster.RefreshRate proto]
{
"base_interval": {...},
"max_interval": {...}
}
- base_interval
(Duration, REQUIRED) 指定刷新之间的基本间隔。此参数是必需的,并且必须大于零且小于 max_interval。
- max_interval
(Duration) 指定刷新之间的最大间隔。此参数是可选的,但如果设置,则必须大于或等于 base_interval。默认值为 base_interval 的 10 倍。
config.cluster.v3.Cluster.PreconnectPolicy
[config.cluster.v3.Cluster.PreconnectPolicy proto]
{
"per_upstream_preconnect_ratio": {...},
"predictive_preconnect_ratio": {...}
}
- per_upstream_preconnect_ratio
(DoubleValue) 指示每个传入流可以预期每个上游有多少个流(向上取整)。这对于高 QPS 或延迟敏感型服务很有用。仅当上游处于健康状态且集群有流量时,才会执行预连接。
例如,如果此值为 2,则对于传入的 HTTP/1.1 流,将建立 2 个连接,一个用于新的传入流,另一个用于假定的后续流。对于 HTTP/2,默认情况下只会建立一个连接,因为一个连接可以同时为原始流和假定的后续流提供服务。
在非多路复用连接的稳定状态下,值为 1.5 意味着如果存在 100 个活动流,则将使用 100 个连接,并且有 50 个连接处于预连接状态。这对于短期使用的单次连接(例如,如果 keep-alive 为假,并且每个流都会导致连接终止,则代理 HTTP/1.1)可能是有用的值。对于长期连接(例如,TCP 代理 SMTP 或具有 keep-alive 的常规 HTTP/1.1),这很可能过分了。对于长期流量,值为 1.05 比较合理,对于每 100 个连接,队列中将有 5 个预连接连接,以防意外断开连接(无法重用连接)。
如果未设置此值,或明确设置为 1,则 Envoy 将获取尽可能多的连接来为正在飞行的流提供服务。这意味着在稳定状态下,如果连接断开,则后续流将为连接建立等待上游 rtt 延迟损失。
这在一定程度上任意地限制为 3,因为过分激进的预连接会损害延迟,而不是预连接带来的帮助更大。
- predictive_preconnect_ratio
(DoubleValue) 指示每个流在整个集群中可以预期有多少个流,这对于低 QPS 服务很有用。目前,这支持一部分确定性非哈希负载均衡算法(加权轮循、随机)。与
per_upstream_preconnect_ratio
不同,这会在整个集群的上游实例中进行预连接,尽力预测下一个要选择的上游并预先建立连接。预连接将限制为集群中每个配置的上游进行一次预连接,并且仅在有健康的上游且集群有流量时才会执行。
例如,如果为轮循 HTTP/2 集群设置预连接为 2,则在第一个传入流上,将预连接 2 个连接 - 一个连接到此集群的第一个上游,另一个连接到第二个上游,假设会有后续流。
如果未设置此值,或明确设置为 1,则 Envoy 将获取尽可能多的连接来为正在飞行的流提供服务,因此在预热期间以及在稳定状态下,如果连接关闭(且未设置 per_upstream_preconnect_ratio),则连接建立将会有延迟损失。
如果同时设置了此值和 preconnect_ratio,则 Envoy 将确保满足这两个预测需求,基本上是为每个上游预连接 max(predictive-preconnect, per-upstream-preconnect)。
Enum config.cluster.v3.Cluster.DiscoveryType
[config.cluster.v3.Cluster.DiscoveryType proto]
有关每种类型的说明,请参阅 服务发现类型。
- STATIC
(DEFAULT) 有关说明,请参阅 静态发现类型。
- STRICT_DNS
有关说明,请参阅 严格 DNS 发现类型。
- LOGICAL_DNS
有关说明,请参阅 逻辑 DNS 发现类型。
- EDS
有关说明,请参阅 服务发现类型。
- ORIGINAL_DST
有关说明,请参阅 原始目标发现类型。
Enum config.cluster.v3.Cluster.LbPolicy
[config.cluster.v3.Cluster.LbPolicy proto]
有关每种类型的说明,请参阅 负载均衡器类型 架构概述部分。
- ROUND_ROBIN
(DEFAULT) 有关说明,请参阅 轮循负载均衡策略。
- LEAST_REQUEST
有关说明,请参阅 最少请求负载均衡策略。
- RING_HASH
有关说明,请参阅 环形哈希负载均衡策略。
- RANDOM
有关说明,请参阅 随机负载均衡策略。
- MAGLEV
有关说明,请参阅 Maglev 负载均衡策略。
- CLUSTER_PROVIDED
如果配置的集群提供特定于集群的负载均衡器,则必须指定此负载均衡器类型。请咨询配置的集群的文档,以了解是否设置此选项。
- LOAD_BALANCING_POLICY_CONFIG
使用新的 load_balancing_policy 字段来确定 LB 策略。这已被弃用,建议使用 load_balancing_policy 字段,而无需在 lb_policy 中设置任何值。
Enum config.cluster.v3.Cluster.DnsLookupFamily
[config.cluster.v3.Cluster.DnsLookupFamily proto]
当选择 V4_ONLY 时,DNS 解析器将只执行 IPv4 族地址的查找。如果选择 V6_ONLY,DNS 解析器将只执行 IPv6 族地址的查找。如果指定 AUTO,DNS 解析器将首先执行 IPv6 族地址的查找,然后回退到执行 IPv4 族地址的查找。这在语义上等同于一个不存在的 V6_PREFERRED 选项。AUTO 是一个遗留名称,比必要时更不透明,将在 API 的未来主要版本中弃用,而支持 V6_PREFERRED。如果指定 V4_PREFERRED,DNS 解析器将首先执行 IPv4 族地址的查找,然后回退到执行 IPv6 族地址的查找。即,如果返回的 v4 地址为空,则回调目标只会获取 v6 地址。如果指定 ALL,DNS 解析器将执行 IPv4 和 IPv6 家族的查找,并返回所有已解析的地址。当使用此选项时,将为上游连接启用 Happy Eyeballs。有关更多信息,请参阅 Happy Eyeballs 支持。对于除 STRICT_DNS 和 LOGICAL_DNS 之外的其他集群类型,此设置将被忽略。
- AUTO
(DEFAULT)
- V4_ONLY
- V6_ONLY
- V4_PREFERRED
- ALL
枚举 config.cluster.v3.Cluster.ClusterProtocolSelection
[config.cluster.v3.Cluster.ClusterProtocolSelection proto]
- USE_CONFIGURED_PROTOCOL
(默认) 集群只能在一种可能的向上游协议(HTTP1.1、HTTP2)上运行。如果 http2_protocol_options 存在,将使用 HTTP2,否则将使用 HTTP1.1。
- USE_DOWNSTREAM_PROTOCOL
使用 HTTP1.1 或 HTTP2,具体取决于在向下游连接上使用哪种协议。
config.cluster.v3.LoadBalancingPolicy
[config.cluster.v3.LoadBalancingPolicy proto]
可扩展的负载均衡策略配置。
通过此机制定义的每个 LB 策略都将通过使用反向 DNS 表示法的唯一名称进行标识。如果策略需要配置参数,它必须为其自己的配置定义一个消息,该消息将存储在 config 字段中。策略的名称将告诉客户端它们应该在 config 字段中看到哪种类型的消息。
请注意,在某些情况下,能够独立选择 LB 策略来选择一个区域以及在该区域内选择一个端点非常有用。例如,给定部署可能始终使用相同的策略来选择区域,但在选择区域内的端点时,某些集群可能使用加权轮询,而另一些集群可能使用某种基于会话的均衡。
这可以通过分层 LB 策略来实现,其中父 LB 策略为每个区域创建一个子 LB 策略。对于每个请求,父节点选择区域,然后委托给该区域的子策略在该区域内选择端点。
为了方便这一点,顶级 LB 策略的 config 消息可能包含一个 LoadBalancingPolicy 类型的字段,该字段指定子策略。
{
"policies": []
}
- policies
(repeated config.cluster.v3.LoadBalancingPolicy.Policy) 每个客户端将按顺序遍历列表,并在它支持的第一个策略处停止。这提供了一种机制,可以开始使用尚未被所有客户端支持的新 LB 策略。
config.cluster.v3.LoadBalancingPolicy.Policy
[config.cluster.v3.LoadBalancingPolicy.Policy proto]
{
"typed_extension_config": {...}
}
- typed_extension_config
config.cluster.v3.UpstreamConnectionOptions
[config.cluster.v3.UpstreamConnectionOptions proto]
{
"tcp_keepalive": {...},
"set_local_interface_name_on_upstream_connections": ...,
"happy_eyeballs_config": {...}
}
- tcp_keepalive
(config.core.v3.TcpKeepalive) 如果设置,则在套接字上设置 SO_KEEPALIVE 以启用 TCP Keepalives。
- set_local_interface_name_on_upstream_connections
(bool) 如果启用,将本地地址的接口名称与上游连接相关联。扩展可以在处理请求期间使用此功能。关联机制是特定于实现的。默认情况下为 false,因为存在性能问题。
- happy_eyeballs_config
(config.cluster.v3.UpstreamConnectionOptions.HappyEyeballsConfig) Happy Eyeballs 算法的配置。在对目标 IP 地址进行排序时,添加 first_address_family_version 和 first_address_family_count 的配置。
config.cluster.v3.UpstreamConnectionOptions.HappyEyeballsConfig
[config.cluster.v3.UpstreamConnectionOptions.HappyEyeballsConfig proto]
{
"first_address_family_version": ...,
"first_address_family_count": {...}
}
- first_address_family_version
(config.cluster.v3.UpstreamConnectionOptions.FirstAddressFamilyVersion) 根据 RFC8305#section-4 指定在 Happy Eyeballs 算法中首先尝试连接的 IP 地址族。
- first_address_family_count
(UInt32Value) 指定在尝试其他地址族之前尝试连接的 first_address_family_version 地址的数量。
枚举 config.cluster.v3.UpstreamConnectionOptions.FirstAddressFamilyVersion
[config.cluster.v3.UpstreamConnectionOptions.FirstAddressFamilyVersion proto]
- DEFAULT
(默认) 尊重从 DNS 解析返回的目标 IP 地址的本机排名。
- V4
- V6
config.cluster.v3.TrackClusterStats
[config.cluster.v3.TrackClusterStats proto]
{
"timeout_budgets": ...,
"request_response_sizes": ...,
"per_endpoint_stats": ...
}
- timeout_budgets
(bool) 如果 timeout_budgets 为 true,则将为每个请求发布 超时预算直方图。这些直方图显示了请求每次尝试和全局超时的使用百分比。值为 0 表示未使用任何超时或超时是无限的。值为 100 表示请求使用了给定的全部超时时间。
- per_endpoint_stats
(bool) 如果为 true,则将按每个端点发出一些统计信息,类似于 admin
/clusters
输出中的统计信息。这目前在热重启期间不会输出正确的统计信息。
这目前并非所有统计信息接收器都实现。
这些统计信息不遵循 StatsConfig 中的过滤规则或标签提取规则(但支持固定值标签)。支持管理端点过滤。
这不能与 load_stats_config 同时使用。