拓撲感知路由

拓撲感知路由 提供一種機制,可協助將網路流量保持在流量來源的區域內。在叢集中的 Pod 之間優先使用相同區域的流量,有助於提高可靠性、效能(網路延遲與吞吐量)或降低成本。
功能狀態: Kubernetes v1.23 [beta]

拓撲感知路由 調整路由行為,優先將流量保持在流量來源的區域。在某些情況下,這有助於降低成本或提高網路效能。

動機

Kubernetes 叢集越來越多地部署在多區域環境中。拓撲感知路由 提供一種機制,可協助將流量保持在流量來源的區域內。當計算 服務 的端點時,EndpointSlice 控制器會考量每個端點的拓撲(區域與地區),並填入提示欄位以將其配置到一個區域。叢集元件(例如 kube-proxy)接著可以取用這些提示,並使用它們來影響流量的路由方式(偏好拓撲上更接近的端點)。

啟用拓撲感知路由

您可以透過將 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 會從叢集中的任何位置選擇端點,而與區域無關。

  1. 端點數量不足: 如果端點數量少於叢集中的區域數量,則控制器不會指派任何提示。

  2. 無法達成平衡的配置: 在某些情況下,將無法在區域之間達成端點的平衡配置。例如,如果區域 a 的大小是區域 b 的兩倍,但只有 2 個端點,則配置給區域 a 的端點可能會接收兩倍於區域 b 的流量。如果控制器無法將每個區域的「預期過載」值降至可接受的閾值以下,則控制器不會指派提示。重要的是,這不是基於即時回饋。個別端點仍然有可能變得過載。

  3. 一個或多個節點的資訊不足: 如果任何節點沒有 topology.kubernetes.io/zone 標籤,或未報告可配置 CPU 的值,則控制平面不會設定任何拓撲感知端點提示,因此 kube-proxy 不會按區域篩選端點。

  4. 一個或多個端點沒有區域提示: 當發生這種情況時,kube-proxy 會假設正在進行從拓撲感知提示到或從拓撲感知提示的轉換。在此狀態下篩選服務的端點將會很危險,因此 kube-proxy 會退回到使用所有端點。

  5. 提示中未表示區域: 如果 kube-proxy 無法找到至少一個具有針對其執行所在區域的提示的端點,則它會退回到使用來自所有區域的端點。當您將新區域新增到現有叢集中時,最有可能發生這種情況。

約束

  • 當服務上的 internalTrafficPolicy 設定為 Local 時,不會使用拓撲感知提示。可以在相同叢集中的不同服務上使用這兩個功能,但不能在相同的服務上使用。

  • 此方法不適用於大部分流量來自區域子集的服務。相反地,這假設輸入流量將大致與每個區域中節點的容量成比例。

  • EndpointSlice 控制器在計算每個區域的比例時,會忽略未就緒的節點。如果很大一部分節點未就緒,則可能會產生意想不到的後果。

  • EndpointSlice 控制器會忽略設定了 node-role.kubernetes.io/control-planenode-role.kubernetes.io/master 標籤的節點。如果工作負載也在這些節點上執行,則可能會產生問題。

  • EndpointSlice 控制器在部署或計算每個區域的比例時,不會將容忍性納入考量。如果支援服務的 Pod 僅限於叢集中節點的子集,則這將不會被納入考量。

  • 這可能無法良好地與自動擴展協同運作。例如,如果大量流量來自單一區域,則只有分配到該區域的端點會處理該流量。這可能會導致水平 Pod 自動擴展器無法偵測到此事件,或者新加入的 Pod 在不同的區域啟動。

自訂啟發法

Kubernetes 以許多不同的方式部署,沒有單一的啟發法可將端點分配到區域,並適用於所有使用案例。此功能的主要目標是啟用自訂啟發法的開發,以應對內建啟發法不適用於您的使用案例的情況。啟用自訂啟發法的第一步已包含在 1.27 版本中。這是一個有限的實作,可能尚未涵蓋某些相關且合理的狀況。

接下來呢

最後修改於 2024年6月04日下午11:40 PST:修復 topology-aware-routing.md 中的損壞連結 (b0b5779581)