子集負載平衡策略 (proto)

此擴展的完整名稱為 envoy.load_balancing_policies.subset

注意

此擴展旨在對不受信任的下游和上游流量都具有強大的抵抗能力。

提示

此擴展擴展並可用於以下擴展類別

此擴展必須使用以下其中一種 type URL 來配置

extensions.load_balancing_policies.subset.v3.Subset

[extensions.load_balancing_policies.subset.v3.Subset proto]

可以選擇將此叢集中的端點劃分為由端點元數據定義的子集,並由路由和加權叢集元數據選擇。

{
  "fallback_policy": ...,
  "default_subset": {...},
  "subset_selectors": [],
  "allow_redundant_keys": ...,
  "locality_weight_aware": ...,
  "scale_locality_weight": ...,
  "panic_mode_any": ...,
  "list_as_any": ...,
  "metadata_fallback_policy": ...,
  "subset_lb_policy": {...}
}
fallback_policy

(extensions.load_balancing_policies.subset.v3.Subset.LbSubsetFallbackPolicy) 當沒有端點子集與選定的路由元數據匹配時使用的行為。該值預設為 NO_FALLBACK

default_subset

(Struct) 如果 fallback_policy 為 DEFAULT_SUBSET,則指定在回退期間使用的預設端點子集。default_subset 中的每個欄位都會與 envoy.lb 命名空間下的匹配 LbEndpoint.Metadata 進行比較。沒有主機匹配是有效的,在這種情況下,其行為與 fallback_policy 為 NO_FALLBACK 相同。

subset_selectors

(repeated extensions.load_balancing_policies.subset.v3.Subset.LbSubsetSelector) 對於每個條目,將遍歷 LbEndpoint.Metadata 的 envoy.lb 命名空間,並為鍵和值的每個唯一組合建立子集。例如

{ "subset_selectors": [
    { "keys": [ "version" ] },
    { "keys": [ "stage", "hardware_type" ] }
]}

當選定路由和加權叢集的元數據包含與子集元數據相同的鍵和值時,則會匹配子集。相同的主機可能會出現在多個子集中。

allow_redundant_keys

(bool) 預設情況下,只有當請求元數據與其中一個子集選擇器的鍵完全相同,並且相關鍵的值匹配時,負載平衡器才會具有針對該請求的有效子集。例如,給定以下子集選擇器

{ "subset_selectors": [
    { "keys": [ "version" ] },
    { "keys": [ "stage", "version" ] }
]}

具有元數據 {"redundant-key": "redundant-value", "stage": "prod", "version": "v1"}{"redundant-key": "redundant-value", "version": "v1"} 的請求將沒有有效的子集,即使鍵 stageversion 的值匹配,因為請求元數據中存在多餘的鍵/值對。

如果將此欄位設定為 true,則會根據子集選擇器從請求元數據中篩選出最合適的鍵。然後,將篩選後的鍵和相關值進行匹配,以找到有效的主機子集。透過這種方式,請求元數據中允許有多餘的鍵/值對。請求元數據的鍵可以是子集選擇器鍵的超集,而無需與子集選擇器的鍵完全相同。

更具體地說,如果請求元數據的鍵是其中一個子集選擇器的超集,則只會匹配選擇器鍵中鍵的值。以上述範例為例,如果請求元數據為 {"redundant-key": "redundant-value", "stage": "prod", "version": "v1"},則負載平衡器只會比對 stageversion 的值,以找到合適的子集,因為 stage version 包含在第二個子集選擇器中,並且會忽略多餘的 redundant-key

注意

如果請求元數據的鍵是多個不同子集選擇器鍵的超集,則擁有最多鍵的子集選擇器獲勝。例如,給定子集選擇器 {"subset_selectors": ["keys": ["A", "B", "C"], ["A", "B"]]} 和請求元數據 {"A": "-", "B": "-", "C": "-", "D": "-"},則將評估鍵 ABC。如果請求元數據的鍵是多個不同子集選擇器鍵的超集,並且選擇器鍵的數量相同,則前面的一個獲勝。例如,給定子集選擇器 {"subset_selectors": ["keys": ["A", "B"], ["C", "D"]]} 和請求元數據 {"A": "-", "B": "-", "C": "-", "D": "-"},則將評估鍵 AB

locality_weight_aware

(bool) 如果為 true,則在進行路由決策時,路由到子集時會考慮端點的區域性和區域性權重。

啟用此功能存在一些潛在的陷阱,因為在應用子集匹配和區域性權重之後產生的流量分配可能不盡理想。

例如,考慮這樣一種情況:您在兩個區域性 X/Y 之間有 50/50 的分配,它們各有 100 個主機,而沒有進行子集劃分。如果子集 LB 導致 X 只選擇了 1 個主機,而 Y 選擇了 100 個主機,則 X 中單個主機上的負載量比最初透過 EDS 交付的負載平衡分配中預期的要多得多。

scale_locality_weight

(bool) 與 locality_weight_aware 一起使用時,會根據子集中主機與原始子集中主機的比率來縮放每個區域性的權重。這樣做的目的是為了均衡去往單個區域性的負載,如果該區域性受到子集謂詞的影響過大。

panic_mode_any

(bool) 如果為 true,當配置了回退策略且其對應的子集找不到主機時,將導致改為選擇任何主機。

當使用預設子集作為回退策略時,這非常有用,因為預設子集可能會變空。如果啟用此選項,如果發生這種情況,LB 將嘗試從整個叢集中選擇一個主機。

list_as_any

(bool) 如果為 true,則針對元數據鍵指定的元數據將與對應的端點元數據進行匹配,如果端點元數據與該值完全匹配,或者它是清單值且清單中的任何元素與條件匹配。

metadata_fallback_policy

(extensions.load_balancing_policies.subset.v3.Subset.LbSubsetMetadataFallbackPolicy) 回退機制,允許嘗試不同的路由中繼資料,直到找到主機為止。如果負載平衡過程,包括其所有機制 (如 fallback_policy) 無法選擇主機,則此策略會決定是否以及如何使用其他中繼資料重複該過程。

該值預設為 METADATA_NO_FALLBACK

subset_lb_policy

(config.cluster.v3.LoadBalancingPolicy, 必要) 用於在選定的子集中進行端點選擇的子負載平衡策略。

extensions.load_balancing_policies.subset.v3.Subset.LbSubsetSelector

[extensions.load_balancing_policies.subset.v3.Subset.LbSubsetSelector proto]

子集的規格。

{
  "keys": [],
  "single_host_per_subset": ...,
  "fallback_policy": ...,
  "fallback_keys_subset": []
}
keys

(repeated string) 要與加權叢集中繼資料匹配的鍵列表。

single_host_per_subset

(bool) 選擇一種操作模式,其中每個子集只有一個主機。此模式使用相同的規則選擇主機,但更新主機的速度更快,尤其是在主機數量較多的情況下。

如果找到與主機匹配的項目,則無論優先順序如何,都將使用該主機。

啟用此模式後,對於 keys 中的單一鍵,包含多個具有相同中繼資料值的主機的組態,將只使用具有給定鍵的主機之一;不會將請求路由到其他主機。叢集計量表 lb_subsets_single_host_per_subset_duplicate 指示目前組態中有多少重複項。

fallback_policy

(extensions.load_balancing_policies.subset.v3.Subset.LbSubsetSelector.LbSubsetSelectorFallbackPolicy) 當沒有端點子集與選定路由的中繼資料匹配時使用的行為。

fallback_keys_subset

(repeated string) keys 的子集,由 KEYS_SUBSET 回退策略使用。如果選擇 KEYS_SUBSET 回退策略,則它必須是非空的列表。對於任何其他回退策略,都不會使用此參數,也不應設定。只允許使用也出現在 keys 中的值,但 fallback_keys_subset 不能等於 keys

列舉 extensions.load_balancing_policies.subset.v3.Subset.LbSubsetSelector.LbSubsetSelectorFallbackPolicy

[extensions.load_balancing_policies.subset.v3.Subset.LbSubsetSelector.LbSubsetSelectorFallbackPolicy proto]

允許覆寫每個選取器的頂層回退策略。

NOT_DEFINED

(預設) ⁣如果使用 NOT_DEFINED,則會改用頂層組態回退策略。

NO_FALLBACK

⁣如果選擇 NO_FALLBACK,則會回報相當於沒有健全主機的結果。

ANY_ENDPOINT

⁣如果選擇 ANY_ENDPOINT,則可能會傳回任何叢集端點 (視策略、健全狀況檢查等而定)。

DEFAULT_SUBSET

⁣如果選擇 DEFAULT_SUBSET,則會對與 default_subset 欄位中的值匹配的端點執行負載平衡。

KEYS_SUBSET

⁣如果選擇 KEYS_SUBSET,則會使用減少為 fallback_keys_subset 的中繼資料鍵再次執行子集選取器匹配。如果選取器的一些鍵被視為可選,則允許回退到不同的、較不具體的選取器。

列舉 extensions.load_balancing_policies.subset.v3.Subset.LbSubsetFallbackPolicy

[extensions.load_balancing_policies.subset.v3.Subset.LbSubsetFallbackPolicy proto]

如果選擇 NO_FALLBACK,則會回報相當於沒有健全主機的結果。如果選擇 ANY_ENDPOINT,則可能會傳回任何叢集端點 (視策略、健全狀況檢查等而定)。如果選擇 DEFAULT_SUBSET,則會對與 default_subset 欄位中的值匹配的端點執行負載平衡。

NO_FALLBACK

(預設)

ANY_ENDPOINT

DEFAULT_SUBSET

列舉 extensions.load_balancing_policies.subset.v3.Subset.LbSubsetMetadataFallbackPolicy

[extensions.load_balancing_policies.subset.v3.Subset.LbSubsetMetadataFallbackPolicy proto]

METADATA_NO_FALLBACK

(預設) ⁣沒有回退。路由中繼資料將按原樣使用。

FALLBACK_LIST

⁣將使用特殊的中繼資料鍵 fallback_list 來提供要嘗試的中繼資料變體。fallback_list 鍵的值必須是列表。每個列表元素都必須是結構 - 它將與路由中繼資料合併,並覆寫同時出現在兩個位置的鍵。將按順序使用 fallback_list 項目,直到找到主機為止。

在執行子集負載平衡之前,會從中繼資料中移除 fallback_list 鍵本身。

範例

對於中繼資料

version: 1.0
fallback_list:
  - version: 2.0
    hardware: c64
  - hardware: c32
  - version: 3.0

首先,將使用中繼資料

{"version": "2.0", "hardware": "c64"}

進行負載平衡。如果沒有找到主機,則會嘗試下一個中繼資料

{"version": "1.0", "hardware": "c32"}

。如果仍然沒有主機,則最後會使用中繼資料

{"version": "3.0"}