View a markdown version of this page

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

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

在 IPVS 模式下运行 kube-proxy

重要

Kubernetes v1.35 弃用了 kube-proxy 的 IPVS 模式。相反,在 Kuber netes 网站上使用 nftables 模式。自 v1.33 版本起,nftables 模式已正式推出。有关 v1.35 版本的更多信息,请参阅 Kubernetes v1.35 版本发布公告。

IP 虚拟服务器 (IPVS) 模式下的 EKS 解决了在传统 iptables 模式下运行包含 1,000 多个服务的大型集群时经常出现的网络延迟问题。此性能问题是顺序处理每个数据包的 iptables 数据包过滤规则的结果。这个延迟问题已在 iptables 的继任者 nftables 中得到解决。或者,您可以将集群配置为kube-proxy在 IPVS 模式下运行。

概述

IPVS 从 Kubernetes 版本 1.11 开始正式发布,它使用哈希表而不是线性搜索来处理数据包,从而为拥有数千个节点和服务的集群提高了效率。IPVS 专为负载平衡而设计,使其成为解决 Kubernetes 网络性能问题的合适解决方案。

IPVS 提供了多种向后端 pod 分配流量的选项。每个选项的详细信息可以在官方的 Kubernetes 文档中找到,但下面显示了一个简单的列表。循环和最少连接是 Kubernetes 中 IPVS 负载平衡选项中最受欢迎的选择之一。

- rr (Round Robin)
- wrr (Weighted Round Robin)
- lc (Least Connections)
- wlc (Weighted Least Connections)
- lblc (Locality Based Least Connections)
- lblcr (Locality Based Least Connections with Replication)
- sh (Source Hashing)
- dh (Destination Hashing)
- sed (Shortest Expected Delay)
- nq (Never Queue)

实施

只需几个步骤即可在 EKS 集群中启用 IPVS。您需要做的第一件事是确保您的 EKS 工作节点映像已安装 Linux 虚拟服务器管理ipvsadm包。要将此软件包安装在基于 Fedora 的镜像上,例如亚马逊 Linux 2023,你可以在工作节点实例上运行以下命令。

sudo dnf install -y ipvsadm

在基于 Debian 的镜像(例如 Ubuntu)上,安装命令将如下所示。

sudo apt-get install ipvsadm

接下来,您需要为上面列出的 IPVS 配置选项加载内核模块。我们建议将这些模块写入/etc/modules-load.d/目录内的文件中,这样它们才能在重启后继续运行。

sudo sh -c 'cat << EOF > /etc/modules-load.d/ipvs.conf ip_vs ip_vs_rr ip_vs_wrr ip_vs_lc ip_vs_wlc ip_vs_lblc ip_vs_lblcr ip_vs_sh ip_vs_dh ip_vs_sed ip_vs_nq nf_conntrack EOF'

您可以运行以下命令将这些模块加载到已在运行的计算机上。

sudo modprobe ip_vs sudo modprobe ip_vs_rr sudo modprobe ip_vs_wrr sudo modprobe ip_vs_lc sudo modprobe ip_vs_wlc sudo modprobe ip_vs_lblc sudo modprobe ip_vs_lblcr sudo modprobe ip_vs_sh sudo modprobe ip_vs_dh sudo modprobe ip_vs_sed sudo modprobe ip_vs_nq sudo modprobe nf_conntrack
注意

强烈建议通过用户数据脚本或为构建自定义工作节点 AMI 而执行的任何构建脚本将这些工作节点步骤作为工作节点引导过程的一部分来执行。

接下来,您将配置集群kube-proxy DaemonSet 以在 IPVS 模式下运行。这是通过将to ipvs 和设置kube-proxymode为上面列出的负载平衡选项之一ipvs scheduler来完成的,例如:F rr or Round Robin。

警告

这是一项破坏性更改,应在非工作时间执行。我们建议在初始创建 EKS 集群时进行这些更改,以最大限度地减少影响。

您可以发出 AWS CLI 命令通过更新 kube-proxy E Add-on KS 来启用 IPVS。

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

或者,您可以通过修改集群kube-proxy-config ConfigMap 中的来实现此目的。

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

在下方找到scheduler设置,ipvs并将该值设置为上面列出的 ipvs 负载平衡选项之一,rr例如:循环调度。找到默认为的mode设置iptables,然后将值更改为ipvs。任一选项的结果都应与以下配置类似。

iptables: masqueradeAll: false masqueradeBit: 14 minSyncPeriod: 0s syncPeriod: 30s ipvs: excludeCIDRs: null minSyncPeriod: 0s scheduler: "rr" syncPeriod: 30s kind: KubeProxyConfiguration metricsBindAddress: 0.0.0.0:10249 mode: "ipvs" nodePortAddresses: null oomScoreAdj: -998 portRange: "" udpIdleTimeout: 250ms

如果您的工作节点在进行这些更改之前已加入集群,则需要重启 kube-pro DaemonSet xy。

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

验证

您可以通过在其中一个工作节点上发出以下命令来验证您的集群和工作节点是否在 IPVS 模式下运行。

sudo ipvsadm -L

至少,你应该看到与下图类似的结果,其中显示了 Kubernetes API 服务器服务的条目10.100.0.1和位于 CoreDNS 服务的条目。10.100.0.10

IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP ip-10-100-0-1.us-east-1. rr -> ip-192-168-113-81.us-eas Masq 1 0 0 -> ip-192-168-162-166.us-ea Masq 1 1 0 TCP ip-10-100-0-10.us-east-1 rr -> ip-192-168-104-215.us-ea Masq 1 0 0 -> ip-192-168-123-227.us-ea Masq 1 0 0 UDP ip-10-100-0-10.us-east-1 rr -> ip-192-168-104-215.us-ea Masq 1 0 0 -> ip-192-168-123-227.us-ea Masq 1 0 0
注意

此示例输出来自服务 IP 地址范围为 EKS 集群10.100.0.0/16