流量轉移/分割

Envoy 的路由器可以將虛擬主機中路由的流量分割到兩個或多個上游叢集。有兩個常見的使用案例。

1. 版本升級:路由的流量會從一個叢集逐步轉移到另一個叢集。流量轉移章節將更詳細地描述此情境。

2. A/B 測試或多變數測試:同時測試同一服務的 兩個 多個 版本。路由的流量必須在執行同一服務不同版本的叢集之間 *分割*。流量分割章節將更詳細地描述此情境。

兩個上游之間的流量轉移

路由組態中的 執行階段物件決定選擇特定路由(以及因此選擇其叢集)的機率。透過使用 *runtime_fraction* 組態,虛擬主機中特定路由的流量可以從一個叢集逐步轉移到另一個叢集。考慮以下範例組態,其中名為 helloworld 的服務的兩個版本 helloworld_v1helloworld_v2 在 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