本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 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 會使用判定映射
注意
即使 nftables 後端是 GA,由於相容性原因, iptables仍會維持預設kube-proxy模式。您必須明確選擇加入 nftables 模式。
與 IPVS 後端
要求
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)