Kubernetes 服务流量转发的幕后英雄:iptables 和 IPVS 的优缺点与选择指南

大家好,今天我们来聊聊 Kubernetes 中两个重要的流量“分拣员”——iptablesIPVS
无论是大流量高并发的场景,还是小而精的业务部署,它们都在幕后默默地保证服务请求能被精准转发到对应的后端 Pod。我们来看看它们的特点、各自适用的场景,以及怎么选择更合适的“分拣员”。


iptables 和 IPVS 都是干啥用的?

在 Kubernetes 中,iptablesIPVS 的主要作用是帮助服务(Service)把流量分发给后端 Pod。简单来说,它们是 kube-proxy 的“武器”,具体用哪一把,取决于你的集群规模和需求。

iptables 是啥?

iptables 是 Linux 系统自带的流量管理工具。它用一条条“规则链”来管理流量。规则链就像流水线上的分拣员,每条规则负责一种情况,依次检查是否匹配,直到找到对应的 Pod。

它有啥特点?

  • 操作简单,开箱即用。
  • 如果规则少,性能没问题。
  • 但规则多了就有点慢,毕竟它是按顺序匹配,效率会下降。

IPVS 又是啥?

IPVS(IP Virtual Server)是专门为高性能场景设计的流量分发工具。它的厉害之处在于用哈希表存储规则,查找效率贼高,而且还能玩出更多花样,比如不同的负载均衡算法。

它有什么优点?

  • 查找速度快,规则多也不怕。
  • 支持很多负载均衡算法,比如轮询、最小连接数啥的。
  • 还能自动健康检查,把不可用的 Pod 踢出队伍。

当然也有缺点:配置稍微复杂点,对内核环境有要求。


它俩有啥优缺点?

特点

iptables

IPVS

简单易用

直接用,几乎不用配置

配置稍复杂,需要加载内核模块

性能

规则少时很快,但多了会变慢

哈希表存储规则,不怕规则多

负载均衡能力

支持简单轮询

多种负载均衡算法,选择灵活

健康检查

不支持

自动健康检查,保证流量不跑到坏 Pod

适用场景

小型集群或快速部署

大规模集群或高并发场景

如果你的集群规模小、规则少,直接用 iptables 就够了;但如果 Pod 数量多、流量大,建议选 IPVS,更高效。


怎么切换到 IPVS?

默认情况下,Kubernetes 用的是 iptables 模式。如果你想用 IPVS,需要动点手脚。别担心,操作并不难。

1. 确保你的系统支持 IPVS

首先要检查 Linux 内核是否支持 IPVS。运行以下命令加载必要模块:

modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack

检查是否加载成功:

lsmod | grep ip_vs

如果能看到这些模块的名字,就说明没问题啦!


2. 配置 kube-proxy 使用 IPVS 模式

接下来,告诉 kube-proxy 用 IPVS 模式工作。你需要修改 kube-proxy 的配置:

kind: KubeProxyConfiguration
apiVersion: kubeproxy.config.k8s.io/v1alpha1
mode: "ipvs"  # 关键:切换模式
featureGates:
  SupportIPVSProxyMode: true

如果你用的是 kubeadm 部署,可以用以下命令重新初始化配置:

kubeadm init --config kubeadm-config.yaml

3. 验证是否切换成功

修改完后,记得检查 kube-proxy 是否生效了:

kubectl get configmap -n kube-system kube-proxy -o yaml | grep mode

你应该看到以下内容:

mode: ipvs

再用 ipvsadm 查看 IPVS 的规则表:

ipvsadm -Ln

如果规则已经加载,恭喜你,切换成功了!


场景示例:Service 的流量分发测试

为了验证服务的流量分发是否正常,可以创建一个简单的 Service 和 Pod:

1. YAML 配置文件:

apiVersion: v1
kind: Service
metadata:
  name: test-service
spec:
  selector:
    app: test-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
---
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  labels:
    app: test-app
spec:
  containers:
    - name: nginx
      image: nginx
      ports:
        - containerPort: 80

2. 测试服务:

curl 访问服务:

curl test-service

请求应该能正常返回结果,这说明流量已经被正确转发到后端 Pod。


总结

  1. iptables 是简单好用的“老将”,适合小型集群和快速部署;
  2. IPVS 是高效灵活的“新秀”,适合大规模、高并发场景;
  3. Kubernetes 提供了灵活的选择机制,只需稍作配置即可切换模式。

希望这篇文章能帮你搞清楚 iptables 和 IPVS 的使用场景。如果还有疑问或者遇到问题,欢迎留言交流! 😊