拓撲感知路由
Kubernetes v1.23 [beta]
注意
在 Kubernetes 1.27 之前,此功能稱為拓撲感知提示。拓撲感知路由 調整路由行為,優先將流量保持在流量來源的區域。在某些情況下,這有助於降低成本或提高網路效能。
動機
Kubernetes 叢集越來越多地部署在多區域環境中。拓撲感知路由 提供一種機制,可協助將流量保持在流量來源的區域內。當計算 服務 的端點時,EndpointSlice 控制器會考量每個端點的拓撲(區域與地區),並填入提示欄位以將其配置到一個區域。叢集元件(例如 kube-proxy)接著可以取用這些提示,並使用它們來影響流量的路由方式(偏好拓撲上更接近的端點)。
啟用拓撲感知路由
注意
在 Kubernetes 1.27 之前,此行為是使用service.kubernetes.io/topology-aware-hints
註解來控制的。您可以透過將 service.kubernetes.io/topology-mode
註解設定為 Auto
,為服務啟用拓撲感知路由。當每個區域中有足夠的端點可用時,拓撲提示將會填入 EndpointSlices 上,以將個別端點配置到特定區域,從而使流量路由到更接近其來源的位置。
何時運作最佳
當符合以下條件時,此功能運作最佳
1. 輸入流量均勻分佈
如果大部分流量來自單一區域,則該流量可能會使已配置到該區域的端點子集過載。當預期輸入流量來自單一區域時,不建議使用此功能。
2. 服務在每個區域中有 3 個或更多端點
在三個區域的叢集中,這表示 9 個或更多端點。如果每個區域的端點少於 3 個,則 EndpointSlice 控制器將無法均勻配置端點,而是會退回到預設的叢集範圍路由方法,其機率很高(≈50%)。
運作方式
「Auto」啟發式方法嘗試按比例將一定數量的端點配置給每個區域。請注意,此啟發式方法最適用於具有大量端點的服務。
EndpointSlice 控制器
當啟用此啟發式方法時,EndpointSlice 控制器負責在 EndpointSlices 上設定提示。控制器會按比例將一定數量的端點配置給每個區域。此比例基於在該區域中執行的節點的 可配置 CPU 核心。例如,如果一個區域有 2 個 CPU 核心,而另一個區域只有 1 個 CPU 核心,則控制器會將兩倍數量的端點配置給具有 2 個 CPU 核心的區域。
以下範例顯示當提示已填入時,EndpointSlice 的外觀
apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
name: example-hints
labels:
kubernetes.io/service-name: example-svc
addressType: IPv4
ports:
- name: http
protocol: TCP
port: 80
endpoints:
- addresses:
- "10.1.2.3"
conditions:
ready: true
hostname: pod-1
zone: zone-a
hints:
forZones:
- name: "zone-a"
kube-proxy
kube-proxy 元件會根據 EndpointSlice 控制器設定的提示,篩選其路由到的端點。在大多數情況下,這表示 kube-proxy 能夠將流量路由到相同區域中的端點。有時,控制器會配置來自不同區域的端點,以確保區域之間更均勻地分佈端點。這會導致一些流量路由到其他區域。
安全措施
Kubernetes 控制平面與每個節點上的 kube-proxy 在使用拓撲感知提示之前,會套用一些安全措施規則。如果這些規則未通過檢查,則 kube-proxy 會從叢集中的任何位置選擇端點,而與區域無關。
端點數量不足: 如果端點數量少於叢集中的區域數量,則控制器不會指派任何提示。
無法達成平衡的配置: 在某些情況下,將無法在區域之間達成端點的平衡配置。例如,如果區域 a 的大小是區域 b 的兩倍,但只有 2 個端點,則配置給區域 a 的端點可能會接收兩倍於區域 b 的流量。如果控制器無法將每個區域的「預期過載」值降至可接受的閾值以下,則控制器不會指派提示。重要的是,這不是基於即時回饋。個別端點仍然有可能變得過載。
一個或多個節點的資訊不足: 如果任何節點沒有
topology.kubernetes.io/zone
標籤,或未報告可配置 CPU 的值,則控制平面不會設定任何拓撲感知端點提示,因此 kube-proxy 不會按區域篩選端點。一個或多個端點沒有區域提示: 當發生這種情況時,kube-proxy 會假設正在進行從拓撲感知提示到或從拓撲感知提示的轉換。在此狀態下篩選服務的端點將會很危險,因此 kube-proxy 會退回到使用所有端點。
提示中未表示區域: 如果 kube-proxy 無法找到至少一個具有針對其執行所在區域的提示的端點,則它會退回到使用來自所有區域的端點。當您將新區域新增到現有叢集中時,最有可能發生這種情況。
約束
當服務上的
internalTrafficPolicy
設定為Local
時,不會使用拓撲感知提示。可以在相同叢集中的不同服務上使用這兩個功能,但不能在相同的服務上使用。此方法不適用於大部分流量來自區域子集的服務。相反地,這假設輸入流量將大致與每個區域中節點的容量成比例。
EndpointSlice 控制器在計算每個區域的比例時,會忽略未就緒的節點。如果很大一部分節點未就緒,則可能會產生意想不到的後果。
EndpointSlice 控制器會忽略設定了
node-role.kubernetes.io/control-plane
或node-role.kubernetes.io/master
標籤的節點。如果工作負載也在這些節點上執行,則可能會產生問題。EndpointSlice 控制器在部署或計算每個區域的比例時,不會將容忍性納入考量。如果支援服務的 Pod 僅限於叢集中節點的子集,則這將不會被納入考量。
這可能無法良好地與自動擴展協同運作。例如,如果大量流量來自單一區域,則只有分配到該區域的端點會處理該流量。這可能會導致水平 Pod 自動擴展器無法偵測到此事件,或者新加入的 Pod 在不同的區域啟動。
自訂啟發法
Kubernetes 以許多不同的方式部署,沒有單一的啟發法可將端點分配到區域,並適用於所有使用案例。此功能的主要目標是啟用自訂啟發法的開發,以應對內建啟發法不適用於您的使用案例的情況。啟用自訂啟發法的第一步已包含在 1.27 版本中。這是一個有限的實作,可能尚未涵蓋某些相關且合理的狀況。
接下來呢
- 請參考使用服務連接應用程式教學
- 瞭解 trafficDistribution 欄位,該欄位與
service.kubernetes.io/topology-mode
註釋密切相關,並為 Kubernetes 內部的流量路由提供彈性選項。