流量切换/拆分

Envoy 的路由器可以将流量拆分到虚拟主机中路由的两个或多个上游集群。有两个常见的用例。

1. 版本升级:路由流量从一个集群逐渐转移到另一个集群。 流量切换 部分更详细地描述了这种情况。

2. A/B 测试或多变量测试: two or more versions 同一个服务的版本同时进行测试。路由的流量必须在运行不同版本服务的集群之间拆分流量拆分 部分更详细地描述了这种情况。

在两个上游之间切换流量

路由配置中的 运行时 对象决定选择特定路由(及其集群)的概率。通过使用 runtime_fraction 配置,可以将发送到虚拟主机中特定路由的流量从一个集群逐渐转移到另一个集群。考虑以下示例配置,其中服务的两个版本 helloworld_v1helloworld_v2 名为 helloworld 在 Envoy 配置文件中声明。

virtual_hosts:
   - name: www2
     domains:
     - '*'
     routes:
       - match:
           prefix: /
           runtime_fraction:
             default_value:
               numerator: 50
               denominator: HUNDRED
             runtime_key: routing.traffic_shift.helloworld
         route:
           cluster: helloworld_v1
       - match:
           prefix: /
         route:
           cluster: helloworld_v2

Envoy 使用 首次匹配 策略匹配路由。如果路由具有 runtime_fraction 对象,则请求将根据 runtime_fraction (或默认值,如果没有指定值)进行额外匹配。因此,通过在上面的示例中将路由背靠背放置并在第一个路由中指定 runtime_fraction 对象,可以通过更改 runtime_fraction 值来实现流量切换。以下是完成任务所需的近似操作顺序。

  1. 一开始,将 routing.traffic_shift.helloworld 设置为 100,这样所有发送到 helloworld 虚拟主机的请求都将与 v1 路由匹配,并由 helloworld_v1 集群提供服务。

  2. 要开始将流量切换到 helloworld_v2 集群,将 routing.traffic_shift.helloworld 设置为值 0 < x < 100。例如,在 90 时,发送到 helloworld 虚拟主机的每 10 个请求中会有 1 个不会与 v1 路由匹配,并将继续匹配 v2 路由。

  3. 逐渐降低 routing.traffic_shift.helloworld 中设置的值,以便更大的百分比请求与 v2 路由匹配。

  4. routing.traffic_shift.helloworld 设置为 0 时,没有发送到 helloworld 虚拟主机的请求将与 v1 路由匹配。现在所有流量都将继续匹配 v2 路由,并由 helloworld_v2 集群提供服务。

跨多个上游拆分流量

再次考虑 helloworld 示例,现在有三个版本(v1、v2 和 v3)而不是两个。要将流量均匀地拆分到三个版本(即 33%, 33%, 34%),可以使用 weighted_clusters 选项为每个上游集群指定权重。

与之前的示例不同,只需要一个 路由 条目。 weighted_clusters 路由中的配置块可用于指定多个上游集群以及指示发送到每个上游集群的流量 百分比 的权重。

virtual_hosts:
   - name: www2
     domains:
     - '*'
     routes:
       - match: { prefix: / }
         route:
           weighted_clusters:
             runtime_key_prefix: routing.traffic_split.helloworld
             clusters:
               - name: helloworld_v1
                 weight: 33
               - name: helloworld_v2
                 weight: 33
               - name: helloworld_v3
                 weight: 34

权重总和必须大于 0。在 V2 API 中, 总权重 默认值为 100,但可以修改以允许更精细的粒度。 总权重 现在已弃用,将使用每个 集群权重 与所有集群权重总和的相对值。

可以使用以下运行时变量动态调整分配给每个集群的权重: routing.traffic_split.helloworld.helloworld_v1routing.traffic_split.helloworld.helloworld_v2routing.traffic_split.helloworld.helloworld_v3