负载均衡器子集
Envoy 可以配置为根据附加到主机上的元数据将上游集群中的主机划分为子集。然后,路由可以指定主机必须匹配的元数据,以便被负载均衡器选择,可以选择回退到一组预定义的主机,包括任何主机。
子集使用集群指定的负载均衡器策略。原始目标策略不能与子集一起使用,因为上游主机事先未知。子集与区域感知路由兼容,但请注意,子集的使用可能会很容易地违反上述最小主机条件。
如果子集被 配置 并且路由没有指定元数据或不存在与元数据匹配的子集,则子集负载均衡器会启动其回退策略。默认策略是 NO_FALLBACK
,在这种情况下,请求会失败,就好像集群没有主机一样。相反,ANY_ENDPOINT
回退策略会在集群中的所有主机上进行负载均衡,而不管主机元数据。最后,DEFAULT_SUBSET
会导致回退到匹配特定元数据集的主机上的负载均衡。可以为特定子集选择器覆盖回退策略。
子集必须预定义,以允许子集负载均衡器有效地选择正确的主机子集。每个定义是一组键,它对应于零个或多个子集。从概念上讲,每个具有定义中所有键的元数据值的主机都会被添加到特定于其键值对的子集中。如果没有任何主机具有所有键,则定义不会产生任何子集。可以提供多个定义,如果单个主机匹配多个定义,则该主机可能会出现在多个子集中。
在路由期间,路由的元数据匹配配置用于查找特定子集。如果存在一个子集具有路由指定的完全相同的键和值,则该子集将用于负载均衡。否则,将使用回退策略。因此,集群的子集配置必须包含一个与给定路由具有相同键的定义,以便进行子集负载均衡。
子集可以配置为每个子集只有一个主机,这可以在类似于 Maglev 或 环形哈希 的用例中使用,例如基于 cookie 的负载均衡,但即使在将新主机添加到集群后也必须选择相同的主机。如果启用了 single_host_per_subset,则端点配置更改可能会使用更少的 CPU。
主机元数据仅在使用 ClusterLoadAssignments 定义主机时受支持。ClusterLoadAssignments 可通过 EDS 或集群 load_assignment 字段获得。用于子集负载均衡的主机元数据必须放置在过滤器名称 "envoy.lb"
下。同样,路由元数据匹配条件使用 "envoy.lb"
过滤器名称。主机元数据可以是分层的(例如,顶级键的值可能是结构化值或列表),但子集负载均衡器只比较顶级键和值。因此,在使用结构化值时,路由的匹配条件只有在主机元数据中出现相同的结构化值时才会匹配。
最后,请注意,子集负载均衡不适用于 CLUSTER_PROVIDED 负载均衡器策略。
示例
我们将使用所有值都是字符串的简单元数据。假设以下主机已定义并与集群相关联
主机 |
元数据 |
---|---|
host1 |
v: 1.0, stage: prod |
host2 |
v: 1.0, stage: prod |
host3 |
v: 1.1, stage: canary |
host4 |
v: 1.2-pre, stage: dev |
集群可以这样启用子集负载均衡
---
name: cluster-name
type: EDS
eds_cluster_config:
eds_config:
path: '.../eds.conf'
connect_timeout:
seconds: 10
lb_policy: LEAST_REQUEST
lb_subset_config:
fallback_policy: DEFAULT_SUBSET
default_subset:
stage: prod
subset_selectors:
- keys:
- v
- stage
- keys:
- stage
fallback_policy: NO_FALLBACK
下表描述了一些路由及其应用于集群的结果。通常,匹配条件将与匹配请求特定方面的路由一起使用,例如路径或标题信息。
匹配条件 |
在...上进行均衡 |
原因 |
---|---|---|
stage: canary |
host3 |
所选主机的子集 |
v: 1.2-pre, stage: dev |
host4 |
所选主机的子集 |
v: 1.0 |
host1, host2 |
回退:没有单独的“v”子集选择器 |
other: x |
host1, host2 |
回退:没有“other”子集选择器 |
(无) |
host1, host2 |
回退:未请求子集 |
stage: test |
空集群 |
由于回退策略被每个选择器与“NO_FALLBACK”值覆盖 |
元数据匹配条件也可以在路由的加权集群上指定。从选定的加权集群中获取的元数据匹配条件将与从路由中获取的条件合并并覆盖它们
路由匹配条件 |
加权集群匹配条件 |
最终匹配条件 |
---|---|---|
stage: canary |
stage: prod |
stage: prod |
v: 1.0 |
stage: prod |
v: 1.0, stage: prod |
v: 1.0, stage: prod |
stage: canary |
v: 1.0, stage: canary |
v: 1.0, stage: prod |
v: 1.1, stage: canary |
v: 1.1, stage: canary |
(无) |
v: 1.0 |
v: 1.0 |
v: 1.0 |
(无) |
v: 1.0 |
带有元数据的示例主机
带有主机元数据的 EDS LbEndpoint
---
endpoint:
address:
socket_address:
protocol: TCP
address: 127.0.0.1
port_value: 8888
metadata:
filter_metadata:
envoy.lb:
version: '1.0'
stage: 'prod'
带有元数据条件的示例路由
带有元数据匹配条件的 RDS Route
---
match:
prefix: /
route:
cluster: cluster-name
metadata_match:
filter_metadata:
envoy.lb:
version: '1.0'
stage: 'prod'