拓撲感知路由
Kubernetes v1.23 [beta]
注意
在 Kubernetes 1.27 之前,此功能被稱為 拓撲感知提示。拓撲感知路由 調整路由行為以優先將流量保持在其源自的區域內。在某些情況下,這有助於降低成本或提高網路效能。
動機
Kubernetes 叢集越來越多地部署在多區域環境中。拓撲感知路由 提供了一種機制,有助於將流量保持在其源自的區域內。在為 Service 計算端點時,EndpointSlice 控制器會考慮每個端點的拓撲(區域和可用區),並填充提示欄位以將其分配給某個可用區。然後,諸如 kube-proxy 等叢集元件可以使用這些提示來影響流量的路由方式(偏向拓撲上更近的端點)。
啟用拓撲感知路由
注意
在 Kubernetes 1.27 之前,此行為由service.kubernetes.io/topology-aware-hints
註解控制。你可以透過將 service.kubernetes.io/topology-mode
註解設定為 Auto
來為 Service 啟用拓撲感知路由。當每個可用區中都有足夠的端點可用時,拓撲提示將填充到 EndpointSlice 上,將單個端點分配給特定的可用區,從而使流量更接近其源頭進行路由。
何時效果最佳
此功能在以下情況下效果最佳:
1. 入站流量均勻分佈
如果大部分流量源自單個可用區,該流量可能會使分配給該可用區的端點子集過載。當預期入站流量源自單個可用區時,不建議使用此功能。
2. Service 在每個可用區有 3 個或更多端點
在一個三可用區叢集中,這意味著有 9 個或更多端點。如果每個可用區的端點少於 3 個,則 EndpointSlice 控制器無法均勻分配端點的可能性很高(≈50%),並且會回退到預設的叢集範圍路由方式。
工作原理
“自動”啟發式演算法試圖按比例將一定數量的端點分配給每個可用區。請注意,此啟發式演算法最適用於具有大量端點的 Service。
EndpointSlice 控制器
啟用此啟發式演算法時,EndpointSlice 控制器負責在 EndpointSlice 上設定提示。控制器將按比例分配端點到每個可用區。此比例基於在該可用區中執行的節點的可分配 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 將選擇叢集中任何地方的端點,而無論可用區如何。
端點數量不足: 如果叢集中的端點少於可用區數量,控制器將不會分配任何提示。
無法實現均衡分配: 在某些情況下,無法在可用區之間實現端點的均衡分配。例如,如果 zone-a 比 zone-b 大兩倍,但只有 2 個端點,則分配給 zone-a 的端點可能會收到兩倍於 zone-b 的流量。如果控制器無法將此“預期過載”值降至每個可用區可接受的閾值以下,則不會分配提示。重要的是,這並非基於即時反饋。單個端點仍然可能過載。
一個或多個節點資訊不足: 如果任何節點沒有
topology.kubernetes.io/zone
標籤或沒有報告可分配 CPU 值,控制平面將不會設定任何拓撲感知端點提示,因此 kube-proxy 不會按可用區過濾端點。一個或多個端點沒有可用區提示: 發生這種情況時,kube-proxy 假定拓撲感知提示正在轉換中。在這種狀態下過濾 Service 的端點將是危險的,因此 kube-proxy 將回退到使用所有端點。
提示中未表示某個可用區: 如果 kube-proxy 無法找到至少一個帶有指向其執行可用區的提示的端點,它將回退到使用所有可用區的端點。這種情況最有可能發生在您將新可用區新增到現有叢集時。
限制
當 Service 上將
internalTrafficPolicy
設定為Local
時,不使用拓撲感知提示。可以在同一個叢集中的不同 Service 上使用這兩個功能,但不能在同一個 Service 上使用。對於大部分流量源自部分可用區的 Service,此方法效果不佳。相反,這假設入站流量將大致與每個可用區中節點的容量成比例。
EndpointSlice 控制器在計算每個可用區的比例時會忽略未就緒的節點。如果大部分節點未就緒,這可能會產生意想不到的後果。
EndpointSlice 控制器會忽略設定了
node-role.kubernetes.io/control-plane
或node-role.kubernetes.io/master
標籤的節點。如果工作負載也執行在這些節點上,這可能會出現問題。EndpointSlice 控制器在部署或計算每個可用區的比例時,不考慮容忍度。如果 Service 背後的 Pods 僅限於叢集中的節點子集,則不會考慮這一點。
這可能與自動擴縮不協調。例如,如果大量流量源自單個可用區,則只有分配給該可用區的端點會處理該流量。這可能導致 Horizontal Pod Autoscaler 未檢測到此事件,或者新新增的 Pods 在不同的可用區啟動。
自定義啟發式演算法
Kubernetes 以多種不同方式部署,沒有一種單一的啟發式演算法可以適用於所有用例。此功能的一個關鍵目標是,如果內建啟發式演算法不適用於您的用例,則允許開發自定義啟發式演算法。在 1.27 版本中包含了啟用自定義啟發式演算法的第一步。這是一個有限的實現,可能尚未涵蓋某些相關且合理的情況。
下一步
- 請參閱使用 Service 連線應用程式教程
- 瞭解與
service.kubernetes.io/topology-mode
註解密切相關的trafficDistribution
欄位,它為 Kubernetes 中的流量路由提供了靈活的選項。