调整 Kubernetes kube-proxy 模式以提升网络转发性能的核心解决方案是将默认模式从 iptables 切换为 IPVS 模式。在大规模集群场景下,iptables 模式会因为规则数量指数级增长导致内核繁忙甚至集群崩溃,而 IPVS 模式基于哈希表实现 O(1) 复杂度查询,支持多种负载均衡算法,性能显著优于 iptables。用户可通过修改 kube-proxy 配置文件或使用 kubeadm 初始化参数指定--proxy-mode=ipvs 来启用该模式,同时需确保节点内核支持 IPVS 模块,从而实现服务转发性能的倍增。
Kube-proxy 核心原理与优化指南
Kube-proxy 的核心作用 Kube-proxy 是 Kubernetes 集群中的网络代理组件,运行在每个节点上,负责维护节点上的网络规则,确保 Pod 之间的网络通信能够正常进行。它的主要功能是实现 Kubernetes Service 的抽象,将 Service 的虚拟 IP 地址和端口映射到后端 Pod 的实际 IP 地址和端口。Kube-proxy 通过监听 API Server 中 Service 和 Endpoint 的变化,动态更新节点上的 iptables 规则或 IPVS 规则,实现负载均衡和流量转发。它支持三种工作模式:userspace 模式、iptables 模式和 IPVS 模式,其中 iptables 模式是默认模式,IPVS 模式在大规模集群中性能更优。Kube-proxy 的工作模式 userspace 模式:最早的实现方式,kube-proxy 在用户空间监听 Service 端口,将请求转发到后端 Pod。这种模式性能较差,因为数据包需要在用户空间和内核空间之间多次拷贝。iptables 模式:kube-proxy 通过维护 iptables 规则来实现 Service 的负载均衡。这种模式性能较好,但在大规模集群中,iptables 规则可能会变得非常庞大,影响性能。IPVS 模式:kube-proxy 使用 Linux 内核的 IPVS 模块来实现负载均衡。IPVS 专为负载均衡设计,支持多种调度算法,性能优于 iptables 模式,特别适合大规模集群。
kube-proxy 的三种工作模式
一、kube-proxy 的核心使命 kube-proxy 承担着 Service 流量转发的重任,主要实现两大核心功能:服务发现:将 Service 的虚拟 IP(ClusterIP) 映射到后端 Pod 负载均衡:在多个 Pod 实例间分配流量 二、三种工作模式深度对比 1. Userspace 模式 (历史模式) 工作原理:Client -> iptables 重定向 -> kube-proxy 监听端口 -> 用户空间转发 -> Pod 生产痛点:频繁的用户态/内核态切换导致高延迟 单线程处理成为性能瓶颈 已在 K8s 1.2+ 版本中被废弃 2. iptables 模式 (经典模式) 工作原理:# 查看生成的 iptables 规则示例 iptables -t nat -L KUBE-SERVICES 优势:基于内核级转发,性能较 Userspace 提升 40%+ 支持随机、轮询等基础负载均衡算法 生产瓶颈:万级服务时规则数量指数级增长 规则更新采用全量刷新,导致网络抖动 连接跟踪表 (conntrack) 易成性能瓶颈 3. IPVS 模式 (生产推荐) 工作原理:# 查看 IPVS 配置 ipvsadm -Ln 核心优势:支持加权轮询、最小连接等 10+ 种算法 基于哈希表实现 O(1) 时间复杂度查询 增量式规则更新,毫秒级生效 性能数据:
| 场景 | iptables 延迟 | IPVS 延迟 | 提升幅度 |
|---|---|---|---|
| 100 服务 | 2.1ms | 1.3ms | 38% |
| 1000 服务 | 11.4ms | 2.9ms | 75% |
| 10000 服务 | 超时 | 3.2ms | 100% |
Kubernetes 为 kube-proxy 开启 ipvs 模式提升集群网络性能 - 开发者社区 - 阿里云
kk8s 的 kube-proxy 支持三种网络负载均衡模式 1、userspace 代理模式 2、iptables 代理模式 3、ipvs 代理模式 userspace 抛开不说,kubernetes 自 1.8 版本开始强推 ipvs,之前版本默认使用 iptables,这个 iptables 大家应该比较熟悉的,Linux 默认防火墙嘛,它是比较古老的一种网络模式。kubernetes 在版本 v1.6 中已经支持 5000 个节点,但使用 iptables 的 kube-proxy 实际上是将集群扩展到 5000 个节点的瓶颈。在 5000 节点集群中使用 NodePort 服务,如果有 2000 个服务并且每个服务有 10 个 pod,这将在每个工作节点上至少产生 20000 个 iptable 记录,这可能使内核非常繁忙。因此,如果是大集群的话,iptables 可能会造成集群崩溃。ipvs 也称之为 lvs,以往写过一个简单的 lvs 服务实现,LVS-NAT 集群的搭建以及快速验证负载均衡_zsk_john 的博客-CSDN 博客那么,它的优点是哪些呢?1、底层 hash 算法,查找复杂度为 O(1) 事先将所有路由存储到 hash 表,不像 iptables 底层 O(0) 的复杂度,需要一条条规则从上到下匹配,这样随着 service 的增多 (nat 规则增多),内核越来越忙,集群性能越来越差。2、支持多种负载均衡策略加权、最少连接、最小负载等 3、支持健康检查和重试 (后端 pod 异常重试去访问另一个后端 pod) 也就是说 ipvs 在同等资源占用下拥有最佳的性能在这种模式下 kube-proxy 会监视 k8s 集群中的对象和端点 (endpoint),调用 netlink 接口以相应地创建 ipvs 规则并定期与 k8s 中的 service 对象和 endpoints 同步 ipvs 规则,以确保 ipvs 状态与期望一致。当访问 svc 时流量就会被重定向到后端的一个 pod。与 iptables 类似,ipvs 于 netfilter 的 hook 功能,但使用哈希表作为底层数据结构并在内核空间中工作。这说明 ipvs 可以更快地重定向流量,并且在同步代理规则时具有更好的性能。此外,ipvs 为负载均衡算法提供了更多选项,例如:rr :轮询调度 lc :最小连接数 dh :目标哈希 sh :源哈希 sed :最短期望延迟 nq : 不排队调度 其实说了这么多,总结一哈要表达的意思,1,ipvs 比 iptables 性能更好,这个更好指的是大集群多节点的情况下,小集群可以忽略不计,因此,生产上还是需要开启 ipvs 的,如果是测试的集群,那无所谓喽,爱谁谁喽。
从 0 开始搞 K8S:修改 kube-porxy 模式
kube-proxy 在 Kubernetes 集群中负责服务发现和负载均衡的功能,它支持多种工作模式,包括:Userspace 模式:工作方式:kube-proxy 通过在主机上创建一个用户空间的进程来实现服务代理。这个进程拦截所有服务流量,并根据服务配置信息将流量转发到后端的 Pod。劣势:由于每个数据包都要经过用户空间的 kube-proxy 进程,因此性能相对较低。使用版本:在 Kubernetes 的早期版本中,Userspace 模式是支持的,但随着时间的推移,由于性能问题,它逐渐被淘汰。iptables 模式:工作方式:kube-proxy 使用 iptables 规则来实现服务代理。当创建或删除服务时,kube-proxy 会动态更新主机上的 iptables 规则,以将服务的虚拟 IP 地址映射到后端 Pod 的 IP 地址。优势:相比于 Userspace 模式,iptables 模式避免了用户空间和内核空间的切换,从而提高了性能。劣势:当服务数量增加到一定程度时 (例如 1000+),iptables 的性能可能会下降,因为它使用数组遍历方式处理规则。使用版本:iptables 模式从 Kubernetes 1.2 版本开始引入,并在 v1.12 之前作为默认的 kube-proxy 操作模式。IPVS 模式:工作方式:IPVS(IP Virtual Server) 是一个 Linux 内核模块,用于实现负载均衡。在 IPVS 模式下,kube-proxy 使用 IPVS 规则来实现服务代理。与 iptables 类似,当创建或删除服务时,kube-proxy 会动态更新 IPVS 规则。但 IPVS 使用 hash 表作为底层数据结构来查找路由规则,从而在处理大量规则时具有更高的性能。优势:与 iptables 相比,IPVS 在处理大量服务时具有更高的性能。劣势:需要高版本的内核支持。如果节点上的内核版本较低,没有 IPVS 模块,kube-proxy 会自动降级到 iptables 模式。使用版本:IPVS 模式在 Kubernetes 1.8 版本中引入,并在 v1.11 中正式使用。现在,很多 Kubernetes 集群都倾向于使用 IPVS 模式来提高服务代理的性能。变化趋势:最初版本:在 Kubernetes 的早期版本中,Userspace 模式是默认的 kube-proxy 操作模式。但随着 Kubernetes 的发展和对性能要求的提高,Userspace 模式逐渐被淘汰。现在的变化趋势:目前,iptables 模式是大多数 Kubernetes 集群中 kube-proxy 的默认操作模式。然而,随着服务数量的增加和对更高性能的需求,越来越多的 Kubernetes 集群开始采用 IPVS 模式。IPVS 模式在处理大量服务时具有更高的性能,因此它成为了一种趋势。模式修改 在使用 kubeadm init 进行初始化控制平面 (control-plane) 时,默认情况下 kube-proxy 的 ProxyMode 值为空 (未指定),如果代理模式未被指定,将使用最佳可用的代理模式 (目前在 Linux 上是 iptables,在 Windows 上是
FAQ
为什么大规模集群推荐使用 IPVS 模式?
因为在大规模集群中,iptables 规则数量会指数级增长导致内核繁忙,而 IPVS 基于哈希表实现 O(1) 复杂度,性能更优且支持多种负载均衡算法。
如何确认节点是否支持 IPVS 模式?
需要检查节点内核版本是否较高且加载了 IPVS 模块,如果内核版本较低没有 IPVS 模块,kube-proxy 会自动降级到 iptables 模式。
kube-proxy 支持哪些工作模式?
支持 userspace 模式、iptables 模式和 IPVS 模式,其中 userspace 已废弃,iptables 是默认模式,IPVS 适合大规模集群。