負載平衡器子集
可以設定 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'