流量分割

查看本文大纲

Envoy 支持在同一虚拟主机内对不同路由进行流量分割,允许将流量分发到两个或多个上游集群。这对于版本升级和A/B测试等场景至关重要。

两个上游集群中分割流量

Envoy允许在两个上游集群之间进行流量转移,适用于逐步迁移版本。例如,假设有两个版本的服务 helloworld_v1helloworld_v2。通过使用 runtime_fraction 配置,你可以控制每个集群接收的请求比例。

以下是示例配置:

route_config:
  virtual_hosts:
  - name: hello_vhost
    domains: ["hello.io"]
    routes:
      - match:
          prefix: "/"
          runtime_fraction:
            default_value:
              numerator: 0
              denominator: HUNDRED
            runtime_key: routing.hello_io
        route:
          cluster: hello_v1
      - match:
          prefix: "/"
        route:
          cluster: hello_v2
...
layered_runtime:
  layers:
  - name: static_layer
    static_layer:
      routing.hello_io: 90

在此配置中,最初可以将 routing.traffic_shift.helloworld 设置为 100,以便所有请求都转发至 helloworld_v1。逐渐减少该值,例如设置为 90,将使 10% 的请求转发到 helloworld_v2,最终达到 0 时,所有流量将完全转向 helloworld_v2

说明

  • denominator 为枚举类型,其值只能是 HUNDREDTEN_THOUSANDMILLION 之一。
  • layered_runtime 用于动态管理和调整多个运行时参数,提供灵活性和可扩展性。它允许通过多个层次的值来覆盖配置,实现实时控制。详见 Envoy 文档

在多个上游集群间分割流量

当需要在多个版本(如 helloworld_v1helloworld_v2helloworld_v3)之间均匀分割流量时,使用 weighted_clusters 配置是一个有效的方案。以下是示例配置:

virtual_hosts:
   - name: www2
     domains:
     - '*'
     routes:
       - match: { prefix: / }
         route:
           weighted_clusters:
             runtime_key_prefix: routing.hello_io
             clusters:
               - name: helloworld_v1
                 weight: 1
               - name: helloworld_v2
                 weight: 2
               - name: helloworld_v3
                 weight: 3

在这个示例中,1/6 的流量被分配为到 helloworld_v1 ,2/6 的流量到 helloworld_v2,而 3/6 的流量分配给 helloworld_v3。权重可以动态调整,确保流量分发的灵活性。你还可以通过 layer_runtime 、和 runtime_key_prefix 动态配置权重。详见 Envoy 文档

最后更新于 2024/11/27