View a markdown version of this page

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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 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)。它在 1.29 版本中作为 alpha 版本提供,在 1.31 版本中作为 beta 版本提供。iptables 后端为每个服务安装一条规则,并按顺序评估规则。这会导致 O (n) 数据包处理时间随着服务数量的增加而增加。相比之下,nftables使用判定映射在大约O(1)时间内分发数据包。即使在拥有成千上万个服务的集群中,这也使每个数据包的延迟几乎保持不变,从而为拥有数千个节点和服务的集群提供了效率。

注意

尽管 nftables 后端是 GA,但出于兼容性原因,它iptables仍然是默认kube-proxy模式。你必须明确选择加入 nftables 模式。

IPVS 后端不同,IPVS 后端设计为负载均衡器并公开了轮询和最少连接数等调度算法,而 nftables 后端不提供可配置的调度算法。当一个服务有多个支持 Pod 时,nftables 模式会随机选择一个后端 Pod。

要求

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.36kube-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) 。 GitHub