IPVS 基础教程
IPVS(IP Virtual Server)是 Linux 内核中的四层负载均衡实现,是 LVS(Linux Virtual Server)项目的核心组件。
它工作在 内核态,具备高性能、低延迟的特点。
- 用途:四层(TCP/UDP)负载均衡
- 核心优势:性能比 nginx/haproxy 等用户态 LB 高出 5~10 倍
| 特性 | iptables (kube-proxy) | IPVS (kube-proxy) |
|---|---|---|
| 工作模式 | 用户态 + 内核态 | 内核态、专为 LB 优化 |
| 性能(QPS) | 较低 | 极高(百万级) |
| 并发连接 | 小 | 超大、可百万级 |
| 负载均衡算法 | 少 | 多 |
| K8s 支持 | 默认 | 需要安装模块或切换模式 |
Kubernetes 在大规模集群中强烈推荐选择 IPVS 模式的 kube-proxy。
负载均衡器修改请求和响应的源/目标地址。
- 优点:简单
- 缺点:LB 压力大(进、出都要 NAT)
- 适用:小规模
Client -> [VIP -> LB -> DIP] -> RealServer
RealServer -> LB -> Client
请求经过 LB,响应 直接从 RealServer 回客户端。
- 优点:性能最高
- 缺点:RealServer 必须与 LB 在同一二层网络
- 场景:高性能集群
Client -> LB -> RealServer
RealServer -> Client(绕过 LB)
LB 用隧道封装(如 IPIP)转发请求。
- 优点:跨三层高性能
- 缺点:RealServer 要支持 IPIP
- 适用:跨机房、跨城市
| 算法 | 说明 |
|---|---|
| rr | 轮询 |
| wrr | 权重轮询 |
| lc | 最少连接 |
| wlc | 加权最少连接 |
| lblc | 基于本地性最少连接 |
| lblcr | 基于本地性副本 |
| sed | 最短期望延迟 |
| nq | 不排队 |
Kubernetes 里 kube-proxy 默认使用 rr。
一键加载(常用)
sudo modprobe ip_vs
sudo modprobe ip_vs_rr
sudo modprobe ip_vs_wrr
sudo modprobe ip_vs_sh
sudo modprobe nf_conntrack
确保模块生效:
lsmod | grep ip_vs
K8s 默认使用 iptables 模式,可以改为 IPVS:
查看 kube-proxy 配置文件(通常在)
/var/lib/kube-proxy/config.conf
修改:
mode: "ipvs"
重启 kube-proxy:
systemctl restart kube-proxy
验证:
kubectl get pods -n kube-system -o wide | grep kube-proxy
并确认 ipvsadm 生效:
ipvsadm -Ln
ipvsadm -Ln
ipvsadm -A -t 10.0.0.1:80 -s rr
ipvsadm -a -t 10.0.0.1:80 -r 192.168.1.10:80 -m
“-m” 表示 NAT,DR 用 “-g”,TUN 用 “-i”。
ipvsadm -D -t 10.0.0.1:80
ipvsadm -C
IPVS 模式的优势非常明显:
- 更低延迟
- 更高吞吐
- 服务数量越多,优势越明显(iptables 会导致规则爆炸)
- 支持更多 LB 算法
强烈建议:
大规模集群必须用 IPVS 模式的 kube-proxy。
要做高可用时,你会看到 Keepalived(VRRP)配合 IPVS。
用途:
- Keepalived 提供 VIP 漂移(双机热备)
- IPVS 提供负载均衡调度
经常组合成:
- LVS-DR
- LVS-TUN
- 高可用负载均衡器(MASTER & BACKUP)
最高性能方案,适用于 web 服务、API 服务。
适合 Node 数或 Service 数较多的集群。
大规模环境能提升性能。