kube-proxy 是 Kubernetes 部署中的关键组件。它的作用是将目标为service的流量负载均衡到正确的后端 Pod。Kube-proxy 可以以iptables 或 IPVS模式运行。
iptables 是 Linux 内核的一个功能,设计为高效的防火墙,具有足够的灵活性来处理各种常见的数据包操作和过滤需求。
然而,kube-proxy 编程 iptables 规则的方式意味着它名义上是一个 O(n) 风格的算法,其中 n 大致与集群大小成比例增长(或更准确地说,与服务数量和每个服务背后的后端 Pod 数量成比例)。
IPVS 是专为负载均衡设计的 Linux 内核功能。这种方式有效,同样使用成熟的内核功能,而且 IPVS 是专为负载均衡大量服务而设计的;它有优化的 API 和优化的查找例程,而不是一系列顺序规则。
结果是,kube-proxy 在 IPVS 模式下的连接处理具有名义上的 O(1) 计算复杂度。换句话说,在大多数情况下,其连接处理性能将保持恒定,与集群大小无关。
此外,作为专用负载均衡器,IPVS 拥有多种不同的调度算法,如轮询、最短期望延迟、最少连接以及各种哈希方法。
IPVS 为将流量均衡到后端 Pod 提供了更多选择:
rr
(轮询):流量被平均分发给后端服务器。
wrr
(加权轮询):流量基于服务器的权重被路由到后端服务器。 高权重的服务器接收新的连接并处理比低权重服务器更多的请求。
lc
(最少连接):将更多流量分配给活跃连接数较少的服务器。
wlc
(加权最少连接):将更多流量按照服务器权重分配给连接数较少的服务器,即基于连接数除以权重。
另外,当服务规模远超 1,000 个时,kube-proxy 的 IPVS 模式可以带来一些不错的性能提升
登录到一台worker节点,执行:
sudo ipvsadm -L
当代理模式设置为默认的 iptables 时,输出结果类似于以下示例:
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
确保拥有必要的 IPVS 内核模块:
sudo lsmod | egrep -i "ip_vs|ip_vs_rr|ip_vs_wrr|ip_vs_sh|nf_conntrack"
如果输出中缺少 IPVS 模块,运行以下命令来安装缺失的内核模块:
sudo modprobe ip_vs
sudo modprobe ip_vs_rr
sudo modprobe ip_vs_wrr
sudo modprobe ip_vs_sh
sudo modprobe nf_conntrack
如果kube-proxy是用EKS add-on模式安装,执行以下命令(注意版本号和集群名根据当前的进行替换):
aws eks update-addon --cluster-name my-cluster --addon-name kube-proxy \
--addon-version v1.24.17-eksbuild.4 \
--configuration-values '{"ipvs": {"scheduler": "rr"}, "mode": "ipvs"}' \
--resolve-conflicts OVERWRITE
返回结果类似:
{
"update": {
"id": "418600d0-f44f-3c09-baf1-e5ff4f4c7851",
"status": "InProgress",
"type": "AddonUpdate",
"params": [
{
"type": "AddonVersion",
"value": "v1.30.0-eksbuild.3"
},
{
"type": "ResolveConflicts",
"value": "OVERWRITE"
},
{
"type": "ConfigurationValues",
"value": "{\"ipvs\": {\"scheduler\": \"rr\"}, \"mode\": \"ipvs\"}"
}
],
"createdAt": "2025-04-27T13:54:13.561000+08:00",
"errors": []
}
}
(END)
在控制台也能看到配置:
要验证是否已配置 ipvs 模式,运行以下命令:
sudo ipvsadm -L
输出示例:
对于自管理的kube-proxy, 参考 :https://repost.aws/zh-Hans/knowledge-center/eks-configure-ipvs-kube-proxy
参考: https://kubernetes.io/zh-cn/docs/reference/networking/virtual-ips/