ipvsadm,是一个什么工具?
1. ipvsadm
是什么?
ipvsadm
(IP Virtual Server Administration)是 Linux 内核中 IPVS(IP Virtual Server) 模块的管理工具,用于配置和监控内核级的负载均衡规则。它是 Kubernetes 中 kube-proxy
在 IPVS 模式 下的底层实现工具。
主要功能
-
管理 IPVS 的虚拟服务(Virtual Service)和真实服务器(Real Server,即后端 Pod)。
-
支持多种负载均衡算法(如轮询
rr
、加权轮询wrr
、最少连接lc
等)。 -
查看当前负载均衡规则和连接状态。
常用命令
ipvsadm -Ln # 列出所有 IPVS 规则(数字格式显示) ipvsadm -Ln --stats # 显示统计信息(如连接数、流量) ipvsadm -Ln --rate # 显示速率(如每秒请求数) ipvsadm -E -t <VIP:PORT> -s <ALGORITHM> # 修改调度算法
2. IPVS 模式详解
IPVS(IP Virtual Server)是 Linux 内核内置的 四层(L4)负载均衡器,工作在传输层(TCP/UDP),性能远高于传统的 iptables
模式。
为什么 Kubernetes 使用 IPVS 模式?
-
高性能:基于哈希表存储规则,查询效率为 O(1),适用于大规模集群。
-
支持多种调度算法:如轮询(
rr
)、加权轮询(wrr
)、最少连接(lc
)等。 -
更好的可扩展性:在 Service 数量超过 10,000 时,性能仍稳定。
IPVS 模式的核心组件
组件 | 说明 |
---|---|
Virtual Service | 虚拟服务(VIP),对应 Kubernetes Service 的 ClusterIP:Port 。 |
Real Server | 真实后端(Pod),对应 Endpoints 中的 PodIP:Port 。 |
调度算法 | 决定流量如何分发给后端 Pod(如 rr 、wrr 、lc )。 |
IPVS 与 iptables 模式对比
特性 | IPVS 模式 | iptables 模式 |
---|---|---|
负载均衡算法 | 支持多种(rr/wrr/lc 等) | 仅支持随机均衡 |
规则存储结构 | 哈希表(O(1) 复杂度) | 线性链表(O(n) 复杂度) |
大规模集群性能 | 更优(适合 10k+ Service) | 性能下降明显 |
依赖内核模块 | ip_vs 、ip_vs_rr 等 | iptables 、nf_conntrack |
3. Kubernetes 中 IPVS 的工作流程
-
Service 创建
-
当创建
ClusterIP
类型的 Service 时,kube-proxy
会:-
在
kube-ipvs0
虚拟接口上绑定 Service 的 ClusterIP。 -
通过
ipvsadm
添加 IPVS 规则,将 VIP(Service IP)映射到后端 Pod IP。
-
-
-
流量转发
-
当访问
ClusterIP:Port
时:-
内核根据 IPVS 规则匹配到目标 Service。
-
IPVS 按调度算法选择一个后端 Pod,转发流量。
-
-
-
示例规则
执行ipvsadm -Ln
可能看到如下输出:TCP 10.233.25.255:80 rr-> 10.233.1.2:80 Masq 1 0 0-> 10.233.1.3:80 Masq 1 0 0
-
rr
:轮询算法。 -
Masq
:使用 SNAT(源地址转换)。 -
后端是两个 Pod(
10.233.1.2:80
和10.233.1.3:80
)。 -
检查 Service 和 Endpoints
kubectl get svc -A | grep 10.233.25.255 # 找到关联的 Service kubectl describe endpoints <service-name> # 检查是否有健康的 Pod
-
查看 IPVS 规则
ipvsadm -Ln | grep 10.233.25.255
-
如果输出中无目标 Pod(
->
开头的行),则说明 Endpoints 缺失。
-
-
4. 常见问题
Q1: 为什么 kube-ipvs0
显示 state DOWN
?
-
这是正常的,因为
kube-ipvs0
是虚拟接口,仅用于绑定 IP,不参与实际网络通信。IPVS 规则由内核直接处理。
Q2: 如何检查 IPVS 是否正常工作?
# 查看规则 ipvsadm -Ln # 检查是否有流量转发 ipvsadm -Ln --stats
Q3: 如何切换 kube-proxy 到 IPVS 模式?
在 kube-proxy 启动参数中添加:
--proxy-mode=ipvs --ipvs-scheduler=rr # 指定调度算法
总结
-
ipvsadm
是管理 IPVS 负载均衡规则的工具,Kubernetes 通过它实现高性能 Service 转发。 -
IPVS 模式 适用于大规模集群,支持多种调度算法,性能优于 iptables。
-
遇到
no destination available
时,优先检查 Endpoints 和 Pod 状态。