IPVS

IPVS模式使用场景

kube-proxy 是 Kubernetes 部署中的关键组件。它的作用是将目标为service的流量负载均衡到正确的后端 Pod。Kube-proxy 可以以iptablesIPVS模式运行。

iptables 是 Linux 内核的一个功能,设计为高效的防火墙,具有足够的灵活性来处理各种常见的数据包操作和过滤需求。

然而,kube-proxy 编程 iptables 规则的方式意味着它名义上是一个 O(n) 风格的算法,其中 n 大致与集群大小成比例增长(或更准确地说,与服务数量和每个服务背后的后端 Pod 数量成比例)。

IPVS 代理模式

IPVS 是专为负载均衡设计的 Linux 内核功能。这种方式有效,同样使用成熟的内核功能,而且 IPVS 是专为负载均衡大量服务而设计的;它有优化的 API 和优化的查找例程,而不是一系列顺序规则。

结果是,kube-proxy 在 IPVS 模式下的连接处理具有名义上的 O(1) 计算复杂度。换句话说,在大多数情况下,其连接处理性能将保持恒定,与集群大小无关。

此外,作为专用负载均衡器,IPVS 拥有多种不同的调度算法,如轮询、最短期望延迟、最少连接以及各种哈希方法。

IPVS 为将流量均衡到后端 Pod 提供了更多选择:

  • rr(轮询):流量被平均分发给后端服务器。

  • wrr(加权轮询):流量基于服务器的权重被路由到后端服务器。 高权重的服务器接收新的连接并处理比低权重服务器更多的请求。

  • lc(最少连接):将更多流量分配给活跃连接数较少的服务器。

  • wlc(加权最少连接):将更多流量按照服务器权重分配给连接数较少的服务器,即基于连接数除以权重。

另外,当服务规模远超 1,000 个时,kube-proxy 的 IPVS 模式可以带来一些不错的性能提升

现有 EKS 集群使用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

image-20250427112921494

确保拥有必要的 IPVS 内核模块:

sudo lsmod | egrep -i "ip_vs|ip_vs_rr|ip_vs_wrr|ip_vs_sh|nf_conntrack"

image-20250427112959089

如果输出中缺少 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)

在控制台也能看到配置:

image-20250427135545801

要验证是否已配置 ipvs 模式,运行以下命令:

sudo ipvsadm -L

输出示例:

image-20250427140234264

对于自管理的kube-proxy, 参考 :https://repost.aws/zh-Hans/knowledge-center/eks-configure-ipvs-kube-proxy


参考: https://kubernetes.io/zh-cn/docs/reference/networking/virtual-ips/