在 Linux 系统与 Kubernetes(K8s)集群中,负载均衡是保障服务高可用与高并发的核心技术。iptables 与 IPVS 作为两种主流的内核级代理方案,常被用于流量调度,但二者在技术本质、性能表现与适用场景上差异显著。本文将先对比二者核心区别,再详解 K8s 中切换代理模式的实操步骤,精准选择适合的方案。

一、iptables 与 IPVS 核心区别:一张表看懂关键差异

iptables 本质是基于 Netfilter 框架的**数据包过滤工具**,负载均衡是其附加功能;而 IPVS 是专为负载均衡设计的**内核级模块**,聚焦流量调度效率。二者核心差异如下表所示:

| 对比维度 | iptables 代理 | IPVS 代理 |

| 技术本质 | 基于 Netfilter 的通用数据包处理工具,可实现防火墙、NAT、负载均衡等多种功能 | Linux 内核原生的负载均衡模块,仅专注于流量调度,无额外功能 |

| 转发效率 | 低:处理数据包需遍历完整规则链,涉及用户态与内核态切换,高并发下易出现性能瓶颈 | 高:直接在内核空间完成流量调度,无需状态切换,支持百万级并发连接 |

| 负载均衡算法 | 基础:仅支持随机(--random)、轮询(--round-robin)2 种核心算法,无法满足复杂调度需求 | 丰富:支持轮询(RR)、加权轮询(WRR)、最少连接(LC)、加权最少连接(WLC)等 10+ 种算法,适配不同服务优先级与负载场景 |

| 适用场景 | 小规模场景:单机容器、小型 K8s 集群(节点数<100),需兼顾防火墙、NAT 等综合功能时 | 大规模高并发场景:大型 K8s 集群(节点数≥100)、高流量 Web 服务,需极致转发性能与灵活调度策略时 |

| K8s 默认选择 | 是:K8s Service 资源默认使用 iptables 实现负载均衡,部署门槛低 | 否:需手动开启,适合集群规模扩大后优化性能 |

二、K8s 中切换 iptables 与 IPVS 代理模式:实操步骤

K8s 中 Service 的负载均衡由 kube-proxy 组件实现,默认使用 iptables 模式,当集群节点数增多或并发流量上升时,可切换为 IPVS 模式提升性能。以下是完整切换步骤(以 K8s 1.20+ 版本为例):

1. 前置检查:确认节点支持 IPVS 模块

IPVS 依赖 Linux 内核模块,需先在所有 K8s 节点(Master + Worker)上检查并加载模块:

# 1. 检查节点是否已加载 IPVS 相关模块

lsmod | grep ip_vs

# 2. 若未加载,执行以下命令加载(临时生效,重启后需重新加载)

modprobe --ip_vs --ip_vs_rr --ip_vs_wrr --ip_vs_lc --ip_vs_wlc

# 3. (可选)设置开机自动加载模块,编辑 /etc/modules-load.d/ipvs.conf 文件

cat > /etc/modules-load.d/ipvs.conf << EOF

ip_vs

ip_vs_rr

ip_vs_wrr

ip_vs_lc

ip_vs_wlc

EOF

# 4. 安装 IPVS 管理工具(可选,用于后续查看 IPVS 规则)

yum install -y ipvsadm  # CentOS/RHEL 系统

apt install -y ipvsadm  # Ubuntu/Debian 系统

2. 切换 kube-proxy 为 IPVS 模式(两种方式)

kube-proxy 的代理模式通过配置文件或命令行参数指定,推荐通过 ConfigMap 全局配置(适用于已有集群),或在部署时直接指定(适用于新集群)。

方式一:已有 K8s 集群(通过 ConfigMap 修改)

1. 编辑 kube-proxy 的 ConfigMap

   K8s 中 kube-proxy 的配置存储在 `kube-system` 命名空间下的 `kube-proxy` ConfigMap 中:

   kubectl edit configmap kube-proxy -n kube-system

2. 修改 mode 字段为 ipvs

   在 ConfigMap 的 `data.config.conf` 部分,找到 `mode: "iptables"`,将其改为 `mode: "ipvs"`,保存退出:

   data:

     config.conf: |-

       apiVersion: kubeproxy.config.k8s.io/v1alpha1

       kind: KubeProxyConfiguration

       mode: "ipvs"  # 关键修改:从 iptables 改为 ipvs

       # 其他配置保持不变...

3. 重启所有 kube-proxy Pod 使配置生效

   ConfigMap 修改后不会自动触发 Pod 重启,需删除现有 kube-proxy Pod,K8s 会自动重建并加载新配置:

   kubectl delete pods -l k8s-app=kube-proxy -n kube-system

方式二:新部署 K8s 集群(初始化时指定)

若通过 kubeadm 部署新集群,可在初始化 Master 节点时,通过 `--pod-network-cidr` 与 `--proxy-mode` 直接指定 IPVS 模式:

# 初始化 Master 节点,同时指定代理模式为 ipvs

kubeadm init --pod-network-cidr=10.244.0.0/16 --proxy-mode=ipvs

后续加入的 Worker 节点会自动继承 Master 的代理模式,无需额外配置。

3. 验证切换结果

切换完成后,需验证 kube-proxy 是否成功运行在 IPVS 模式:

# 1. 查看任意 kube-proxy Pod 的日志,确认模式为 ipvs

kubectl logs -n kube-system <kube-proxy-pod-name> | grep "Using ipvs Proxier"

# 2. 查看节点上的 IPVS 规则(需提前安装 ipvsadm)

ipvsadm -Ln

# 输出结果中会显示 K8s Service 的虚拟 IP(VIP)与后端 Pod 的真实 IP,说明 IPVS 已生效

三、总结:如何选择适合的代理模式?

- 选 iptables:集群规模小(节点数<100)、并发流量低,或需同时使用防火墙、NAT 等功能,追求部署简单时;

- 选 IPVS:集群规模大(节点数≥100)、并发流量高(如秒杀、大促场景),需极致转发性能与灵活调度算法时。

K8s 从 iptables 切换到 IPVS 的操作成本低,但性能提升显著,是集群扩容后的重要优化手段。根据实际业务场景选择合适的代理模式,才能让负载均衡真正发挥“稳流”与“提速”的作用。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐