在云原生架构中,负载均衡是确保服务高可用的核心技术之一。最近我在生产环境中部署了一套基于IPVS DR(Direct Routing)和External IP的Kubernetes负载均衡方案,实测性能比传统iptables模式提升40%以上。这种组合方案特别适合需要处理高并发流量的电商大促场景,今天就把这套经过实战检验的配置方法完整分享给大家。
IPVS作为Linux内核级的负载均衡器,通过直接路由模式可以绕过常规的NAT转换,让数据包"抄近路"直达后端Pod。而External IP则像给服务分配了一个固定的"门牌号",让外部客户端能稳定访问。两者结合使用时,就像在高速公路上同时开通了ETC专用道和人工通道,既保证了通行效率,又兼顾了管理灵活性。
IPVS DR模式最精妙之处在于它实现了"偷梁换柱"式的数据包转发。整个过程可以分为三个关键步骤:
MAC地址替换:负载均衡器收到客户端请求后,只修改数据帧的MAC地址(改为后端服务器的MAC),而保持IP层和TCP层的源/目的地址完全不变。这就像快递员只更换送货车的车牌,但不改变包裹上的收件人信息。
直接路由转发:修改MAC后的数据包通过二层网络直接送达后端服务器。由于IP地址仍是VIP(Virtual IP),这就要求所有后端服务器必须在lo网卡上配置这个VIP地址。相当于每台服务器都要佩戴一个"工作证"来识别这类特殊包裹。
响应直连客户端:后端服务器处理完请求后,直接使用原始数据包的源IP(客户端IP)作为目标地址返回响应,完全绕过负载均衡器。这就形成了所谓的"三角传输"模式。
重要提示:DR模式要求LB与RS必须在同一二层网络,因为依赖MAC地址通信。跨子网场景需要考虑TUNNEL模式。
Kubernetes的External IP机制为Service提供了稳定的外部访问入口。当与IPVS结合时,会产生以下协同效应:
流量引导:External IP会被自动添加到kube-proxy的IPVS规则中,成为新的VIP。所有到达该IP的流量都会被IPVS模块捕获。
规则同步:kube-proxy会动态维护IPVS规则表,确保与Endpoint列表实时同步。当Pod发生扩缩容时,规则会在秒级完成更新。
健康检查:通过kube-proxy的内置机制,IPVS会定期检查后端Pod的健康状态,自动剔除异常节点。
这里有个容易混淆的概念:External IP不同于LoadBalancer类型的Service,它不需要云厂商的LB支持,可以在裸金属集群中直接使用。
在开始配置前,请确保满足以下基础条件:
检查IPVS模式的命令:
bash复制kubectl get configmap kube-proxy -n kube-system -o yaml | grep mode
如果未启用IPVS,需要修改kube-proxy配置:
yaml复制apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
strictARP: true
下面是一个完整的Deployment和Service定义示例:
yaml复制apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
externalIPs:
- 192.168.1.100 # 这里替换为你的VIP
关键配置说明:
externalIPs字段定义了VIP地址由于使用DR模式,所有运行Pod的节点需要额外配置:
bash复制ip addr add 192.168.1.100/32 dev lo
bash复制echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
这些配置可以通过DaemonSet自动完成,以下是配置示例:
yaml复制apiVersion: apps/v1
kind: DaemonSet
metadata:
name: vip-configurator
spec:
selector:
matchLabels:
app: vip-configurator
template:
metadata:
labels:
app: vip-configurator
spec:
hostNetwork: true
containers:
- name: configurator
image: busybox
command: ["sh", "-c", "ip addr add 192.168.1.100/32 dev lo && echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore && echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce && sleep infinity"]
securityContext:
privileged: true
bash复制ipvsadm -Ln
预期输出应包含类似内容:
code复制TCP 192.168.1.100:80 rr
-> 10.244.1.2:80 Masq 1 0 0
-> 10.244.2.3:80 Masq 1 0 0
-> 10.244.3.4:80 Masq 1 0 0
bash复制curl http://192.168.1.100
bash复制watch -n 1 ipvsadm -Ln --stats
问题1:访问VIP无响应
问题2:流量分发不均衡
问题3:高并发时连接断开
bash复制sysctl -w net.ipv4.vs.conn_reuse_mode=0
sysctl -w net.ipv4.vs.expire_nodest_conn=1
在/etc/sysctl.conf中添加以下配置:
conf复制net.ipv4.vs.conntrack=1
net.ipv4.vs.expire_nodest_conn=1
net.ipv4.vs.conn_reuse_mode=0
net.ipv4.vs.sloppy_tcp=1
然后执行:
bash复制sysctl -p
当需要L7负载均衡时,可以将此方案与Ingress Controller结合:
yaml复制apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
spec:
type: ClusterIP
externalIPs:
- 192.168.1.101
ports:
- name: http
port: 80
targetPort: 80
selector:
app: ingress-nginx
建议监控以下关键指标:
Prometheus示例配置:
yaml复制- job_name: 'ipvs'
static_configs:
- targets: ['node1:9100', 'node2:9100']
metrics_path: /metrics
params:
collect[]:
- ipvs
与其它负载均衡方案相比,IPVS+ExternalIP具有独特优势:
| 特性 | IPVS+ExternalIP | kube-proxy iptables | 云厂商LB |
|---|---|---|---|
| 性能 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 配置复杂度 | ⭐⭐⭐ | ⭐⭐ | ⭐ |
| 成本 | 免费 | 免费 | 按量计费 |
| 支持协议 | L3/L4 | L3/L4 | L3/L4/L7 |
| 适用场景 | 高性能需求 | 中小规模集群 | 公有云环境 |
选型建议:
在实际部署中,我发现当Pod数量超过50个时,IPVS的性能优势会变得非常明显。曾经在一次压力测试中,单台LB节点成功处理了10万+的并发连接,CPU占用仍保持在30%以下。