流量轉移/分割
Envoy 的路由器可以將虛擬主機中路由的流量分割到兩個或多個上游叢集。有兩個常見的使用案例。
1. 版本升級:路由的流量會從一個叢集逐步轉移到另一個叢集。流量轉移章節將更詳細地描述此情境。
2. A/B 測試或多變數測試:同時測試同一服務的 兩個 或 多個 版本
。路由的流量必須在執行同一服務不同版本的叢集之間 *分割*。流量分割章節將更詳細地描述此情境。
兩個上游之間的流量轉移
路由組態中的 執行階段物件決定選擇特定路由(以及因此選擇其叢集)的機率。透過使用 *runtime_fraction* 組態,虛擬主機中特定路由的流量可以從一個叢集逐步轉移到另一個叢集。考慮以下範例組態,其中名為 helloworld
的服務的兩個版本 helloworld_v1
和 helloworld_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 值來完成流量轉移。以下是完成此任務所需的大概動作順序。
首先,將
routing.traffic_shift.helloworld
設定為100
,以便對helloworld
虛擬主機的所有請求都與 v1 路由匹配,並由helloworld_v1
叢集提供服務。要開始將流量轉移到
helloworld_v2
叢集,請將routing.traffic_shift.helloworld
設定為0 < x < 100
的值。例如,在90
時,對helloworld
虛擬主機的每 10 個請求中,將有 1 個請求不會與 v1 路由匹配,並且會落到 v2 路由。逐漸減少在
routing.traffic_shift.helloworld
中設定的值,以便更大比例的請求與 v2 路由匹配。當
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_v1
、routing.traffic_split.helloworld.helloworld_v2
和 routing.traffic_split.helloworld.helloworld_v3
。