本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 nftables 模式下运行 kube-proxy
kube-proxy在 nftables 模式下,亚马逊 EKS 可以解决大型集群中常见的网络延迟问题,这些集群拥有 1,000 多个以 iptables 模式运行 kube-proxy 的服务。Iptables 模式按顺序处理每个连接的第一个数据包的包过滤规则,这会导致此性能问题。nftables 是 iptables 的继任者,无论集群大小如何,nftables kube-proxy 后端都通过近乎恒定的时间处理数据包来解决此延迟问题。要避免此问题,请将您的集群配置为kube-proxy在 nftables 模式下运行。
概述
自 Kubernetes 版本 1.33 以来,nftables kube-proxy 后端已正式上线 (GA)。
注意
尽管 nftables 后端是 GA,但出于兼容性原因,它iptables仍然是默认kube-proxy模式。你必须明确选择加入 nftables 模式。
与 IPVS 后端不同
要求
nftables kube-proxy 后端需要在工作节点上安装 Linux 内核 5.13 或更高版本。亚马逊 Linux 2023 和当前版本的 Ubuntu 符合这个最低要求。由于kube-proxy程序 nftables 直接通过内核的 netfilter 子系统进行规则,因此除了支持的内核之外,您无需加载任何其他用户空间包(例如ipvsadm)或内核模块。
注意
内核 5.13 是运行 nftables 模式所需的最低内核。为了提高大型集群中的规则同步性能,我们建议使用更新的内核和kube-proxy版本。有关更多信息,请参阅性能注意事项。
重要
nftables 后端可能与所有网络插件不兼容。启用 nftables 模式之前,请查阅您的 CNI 提供商的文档。从版本开始,亚马逊 VPC CNI 与 nftables 模式兼容。v1.23.0
实施
通过将设置为,将您的集群配置kube-proxy DaemonSet 为在 nftables 模式下运行。kube-proxy mode nftables
警告
这是一种颠覆性的变化。我们建议在非工作时间或在初次创建 EKS 集群期间执行此操作,以最大限度地减少影响。
您可以发出 AWS 命令行接口 (AWS CLI) 命令,通过更新 EKS 来启用 nftables。kube-proxy Add-on这需要运行 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
性能注意事项
尽管 nftables 模式通常从 Kubernetes 版本开始可用v1.33,但我们建议仅从开始使用此模式。v1.36在 kube-proxy v1.36.0 中,Kubernetes 项目对 nftables 地图和规则的构造方式进行了许多性能增强。这些变化显著减少了链和jump/goto规则的数量,极大地提高了大规模同步性能。
这些增强主要使具有大量终端节点(支持您的服务的 Pod)的集群受益。在 kube-proxy v1.36.0 之前,具有数十万个终端节点的集群可能会遇到非常慢的 nftables 规则同步时间和 CPU 软锁定。发生这种情况是因为 Linux 内核验证kube-proxy生成的链和跳转不包含循环。
此行为还受到 Linux 内核版本的影响。基础内核改进包含在 Linux 内核中6.18(并正在向后移植到一些早期的稳定内核)。在较早的 Linux 内核版本中使用 nftables 模式可能会导致规则同步时间变慢,并可能导致 CPU 软锁定。为了在大型集群中获得最佳性能,我们建议将最新的 Linux 内核与 kube-proxy v1.36.0 或更高版本一起运行。有关更多信息,请参阅网站上的 kube-proxy nftables 性能问题 (kubernetes/kubernetes#135639)