子集负载均衡策略 (proto)

此扩展的限定名称为 envoy.load_balancing_policies.subset

注意

此扩展旨在对不可信的下游和上游流量具有鲁棒性。

小技巧

此扩展扩展了以下扩展类别并可与其一起使用

此扩展必须使用以下类型 URL 之一进行配置

extensions.load_balancing_policies.subset.v3.Subset

[extensions.load_balancing_policies.subset.v3.Subset proto]

可以选择通过端点元数据定义的子集并将路由和加权集群元数据选择的子集来划分此集群中的端点。

{
  "fallback_policy": ...,
  "default_subset": {...},
  "subset_selectors": [],
  "allow_redundant_keys": ...,
  "locality_weight_aware": ...,
  "scale_locality_weight": ...,
  "panic_mode_any": ...,
  "list_as_any": ...,
  "metadata_fallback_policy": ...,
  "subset_lb_policy": {...}
}
fallback_policy

(extensions.load_balancing_policies.subset.v3.Subset.LbSubsetFallbackPolicy) 当没有端点子集与所选路由的元数据匹配时使用的行为。该值默认为 NO_FALLBACK.

default_subset

(Struct) 指定在 fallback_policy 为 DEFAULT_SUBSET 时回退期间使用的默认端点子集。default_subset 中的每个字段都与匹配的 LbEndpoint.Metadata 在 envoy.lb 命名空间下进行比较。对于没有主机匹配是有效的,在这种情况下,行为与 fallback_policy 为 NO_FALLBACK 相同。

subset_selectors

(repeated extensions.load_balancing_policies.subset.v3.Subset.LbSubsetSelector) 对于每个条目,都会遍历 LbEndpoint.Metadata 的 envoy.lb 命名空间,并为键和值的每个唯一组合创建一个子集。例如

{ "subset_selectors": [
    { "keys": [ "version" ] },
    { "keys": [ "stage", "hardware_type" ] }
]}

当所选路由和加权集群的元数据中的键和值与子集的元数据中的键和值相同时,就会匹配子集。同一主机可能会出现在多个子集中。

allow_redundant_keys

(bool) 默认情况下,只有当请求元数据具有与子集选择器之一 **完全相同** 的键,并且相关键的值匹配时,负载均衡器才会有一个有效的请求子集。例如,给定以下子集选择器

{ "subset_selectors": [
    { "keys": [ "version" ] },
    { "keys": [ "stage", "version" ] }
]}

具有元数据 {"redundant-key": "redundant-value", "stage": "prod", "version": "v1"}{"redundant-key": "redundant-value", "version": "v1"} 的请求将不会拥有一个有效的子集,即使键 stageversion 的值匹配,因为请求元数据中存在冗余的键/值对。

通过将此字段设置为 true,负载均衡器将根据子集选择器从请求元数据中过滤掉最合适的键。然后,将过滤后的键和相关值与匹配项进行匹配,以找到有效的子集主机。这样一来,请求元数据中允许出现冗余的键/值对。请求元数据的键可以是子集选择器键的超集,不必与子集选择器键完全相同。

更准确地说,如果请求元数据的键是子集选择器之一的键的超集,那么只会匹配选择器键中的键的值。以上面的例子为例,如果请求元数据为 {"redundant-key": "redundant-value", "stage": "prod", "version": "v1"},负载均衡器只会匹配 stageversion 的值以查找合适的子集,因为 stage version 被第二个子集选择器包含,并且冗余的 redundant-key 将被忽略。

注意

如果请求元数据的键是多个不同子集选择器键的超集,则具有最多键的子集选择器获胜。例如,给定子集选择器 {"subset_selectors": ["keys": ["A", "B", "C"], ["A", "B"]]} 和请求元数据 {"A": "-", "B": "-", "C": "-", "D": "-"},键 ABC 将被评估。如果请求元数据的键是多个不同子集选择器键的超集,并且选择器键的数量相同,那么前面放置的键获胜。例如,给定子集选择器 {"subset_selectors": ["keys": ["A", "B"], ["C", "D"]]} 和请求元数据 {"A": "-", "B": "-", "C": "-", "D": "-"},键 AB 将被评估。

locality_weight_aware

(bool) 如果为 true,则路由到子集时会考虑在进行路由决策时端点的地域和地域权重。

启用此功能存在一些潜在的陷阱,因为在应用子集匹配和地域权重后,最终的流量分割可能不受欢迎。

例如,考虑这样一种情况:在两个地域 X/Y 之间进行 50/50 分割,每个地域都有 100 个主机,没有子集划分。如果子集 LB 导致 X 仅选择 1 个主机,而 Y 选择 100 个主机,那么与最初通过 EDS 传递的负载均衡分配预期相比,X 中的单个主机将承载更多的负载。

scale_locality_weight

(bool) 与 locality_weight_aware 一起使用时,将每个地域的权重按子集中主机的数量与原始子集中主机的数量的比率进行缩放。如果某个地域因子集谓词而受到不成比例的影响,这将有助于平均流向该地域的负载。

panic_mode_any

(bool) 如果为 true,当配置回退策略及其相应的子集未能找到主机时,这将导致选择任何主机。

当使用默认子集作为回退策略时,这很有用,因为默认子集可能变为空。如果启用此选项,如果发生这种情况,LB 将尝试从整个集群中选择一个主机。

list_as_any

(bool) 如果为 true,则如果端点元数据与值完全匹配,或者它是列表值并且列表中的任何元素都匹配条件,则为元数据键指定的元数据将与相应的端点元数据进行匹配。

metadata_fallback_policy

(extensions.load_balancing_policies.subset.v3.Subset.LbSubsetMetadataFallbackPolicy) 回退机制,允许尝试不同的路由元数据,直到找到主机为止。如果负载均衡过程(包括所有机制(如 fallback_policy))未能选择主机,则此策略决定是否以及如何使用其他元数据重复该过程。

该值默认为 METADATA_NO_FALLBACK.

subset_lb_policy

(config.cluster.v3.LoadBalancingPolicy, REQUIRED) 为在所选子集中选择端点而创建的子 LB 策略。

extensions.load_balancing_policies.subset.v3.Subset.LbSubsetSelector

[extensions.load_balancing_policies.subset.v3.Subset.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

(extensions.load_balancing_policies.subset.v3.Subset.LbSubsetSelector.LbSubsetSelectorFallbackPolicy) 当没有端点子集与所选路由的元数据匹配时使用的行为。

fallback_keys_subset

(repeated string) keys 的子集,由 KEYS_SUBSET 回退策略使用。如果选择了 KEYS_SUBSET 回退策略,则它必须是非空列表。对于任何其他回退策略,该参数都不会使用,也不应该设置。只允许在 keys 中也存在的 value,但是 fallback_keys_subset 不能等于 keys

枚举 extensions.load_balancing_policies.subset.v3.Subset.LbSubsetSelector.LbSubsetSelectorFallbackPolicy

[extensions.load_balancing_policies.subset.v3.Subset.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 的元数据键再次执行子集选择器匹配。如果选择器的一些键被认为是可选的,它允许回退到不同的、不太具体的选择器。

枚举 extensions.load_balancing_policies.subset.v3.Subset.LbSubsetFallbackPolicy

[extensions.load_balancing_policies.subset.v3.Subset.LbSubsetFallbackPolicy proto]

如果选择 NO_FALLBACK,则报告的结果等效于没有健康主机。如果选择 ANY_ENDPOINT,则可以返回任何集群端点(受策略、健康检查等的约束)。如果选择 DEFAULT_SUBSET,则在匹配 default_subset 字段中值的端点上执行负载均衡。

NO_FALLBACK

(DEFAULT)

ANY_ENDPOINT

DEFAULT_SUBSET

枚举 extensions.load_balancing_policies.subset.v3.Subset.LbSubsetMetadataFallbackPolicy

[extensions.load_balancing_policies.subset.v3.Subset.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"}

被使用。