View a markdown version of this page

在 nftables 模式下執行 kube-proxy - Amazon EKS

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 nftables 模式下執行 kube-proxy

在 nftables kube-proxy 模式下,Amazon EKS 可以透過在 iptables 模式下執行 kube-proxy 的 1,000 多項服務,解決大型叢集中常見的網路延遲問題。Iptables 模式會針對每個連線的第一個封包依序處理封包篩選規則,這會導致此效能問題。nftables 是 iptables 的後繼,而 nftables kube-proxy 後端會處理此延遲問題,無論叢集大小為何,都會在幾近持續的時間內處理封包。若要避免此問題,請將叢集設定為kube-proxy在 nftables 模式下執行。

概觀

Kubernetes 1.33 版起,可轉換kube-proxy後端已全面推出 (GA)。它在 1.29 中以 Alpha 形式提供,在 1.31 中以 Beta 形式提供。iptable 後端會為每個服務安裝一個規則,並依序評估規則。這會導致隨著服務數量增加的 O(n) 封包處理時間。相反地,nftables 會使用判定映射,在大約 O(1) 時間內傳送封包。即使在具有數萬個服務的叢集中,這也能保持每個封包延遲幾乎不變,為具有數千個節點和服務的叢集提供效率。

注意

即使 nftables 後端是 GA,由於相容性原因, iptables仍會維持預設kube-proxy模式。您必須明確選擇加入 nftables 模式。

IPVS 後端設計為負載平衡器並公開如循環配置和最小連線等排程演算法不同,nftables 後端不提供可設定的排程演算法。當服務有多個後端 Pod 時,nftables 模式會隨機選取後端 Pod。

要求

nftables kube-proxy後端需要工作者節點上的 Linux 核心 5.13 或更新版本。Amazon Linux 2023 和目前版本的 Ubuntu 符合此最低需求。由於kube-proxy程式會直接透過核心的網路篩選條件子系統篩選規則,因此您不需要任何額外的使用者空間套件 (例如 ipvsadm) 或核心模組載入超出支援的核心。

注意

核心 5.13 是執行 nftables 模式所需的最低需求。為了改善大型叢集中的規則同步效能,我們建議使用較新的核心和kube-proxy版本。如需詳細資訊,請參閱效能考量

重要

nftables 後端可能無法與所有網路外掛程式相容。在啟用 nftables 模式之前,請參閱 CNI 供應商的文件。Amazon VPC CNI 與從版本 開始的 nftables 模式相容v1.23.0

實作

將 設定為 ,將叢集的 kube-proxy DaemonSet 設定為在 nftables kube-proxy mode 模式下執行nftables

警告

這是破壞性變更。我們建議在非上班時間或在初始 EKS 叢集建立期間執行,以將影響降至最低。

您可以更新 EKS 附加元件,發出 AWS Command Line Interface (AWS CLI) kube-proxy 命令來啟用 nftable。這需要執行 Kubernetes 1.33 或更新版本的 EKS 叢集。

aws eks update-addon --cluster-name $CLUSTER_NAME --addon-name kube-proxy \ --configuration-values '{"mode": "nftables"}' \ --resolve-conflicts OVERWRITE

或者,您也可以修改叢集中的 kube-proxy-config ConfigMap 來執行此操作。

kubectl -n kube-system edit cm kube-proxy-config

尋找預設為 mode的設定iptables,並將值變更為 nftables。任一選項的結果看起來都應該類似於下列組態。

mode: "nftables" nftables: masqueradeAll: false masqueradeBit: 14 minSyncPeriod: 1s syncPeriod: 30s kind: KubeProxyConfiguration metricsBindAddress: 0.0.0.0:10249 nodePortAddresses: null oomScoreAdj: -998 portRange: ""

如果您的工作者節點在進行這些變更之前已加入叢集,請重新啟動 kube-proxy DaemonSet。

kubectl -n kube-system rollout restart ds kube-proxy

效能考量

雖然可從 Kubernetes 版本 開始全面使用 nftables 模式v1.33,但我們建議您只從 開始使用此模式v1.36。在 v1kube-proxy.36.0 中,Kubernetes 專案對可轉換映射和規則的建構方式進行了許多效能增強。這些變更可大幅減少鏈結和 jump/goto 規則的數量,大幅改善大規模的同步效能。

這些增強功能主要有益於具有大量端點的叢集 (支援您服務的 Pod)。在 v1kube-proxy.36.0 之前,具有數十萬個端點的叢集可能會遇到非常緩慢的 nftables 規則同步時間和 CPU 軟鎖定。這是因為 Linux 核心會驗證kube-proxy產生 的鏈和跳躍不包含迴圈。

此行為也會受到 Linux 核心版本的影響。基礎核心改進包含在 Linux 核心中 6.18(並且正回溯到一些較早的穩定核心)。搭配舊版 Linux 核心使用 nftables 模式可能會導致規則同步時間變慢,並可能導致 CPU 軟鎖定。為了在大型叢集中獲得最佳效能,我們建議搭配 v1.36kube-proxy.0 或更新版本執行最新的 Linux 核心。如需詳細資訊,請參閱 GitHub 網站上的 kube-proxy nftables 效能問題 (kubernetes/kubernetes#135639)