保姆级教程:在kubeadm部署的K8s集群中开启IPVS模式全流程指南
当你用kubeadm搭建好Kubernetes集群后,网络性能优化往往是第一个需要攻克的难题。IPVS模式作为kube-proxy的底层流量转发机制,相比默认的iptables能显著提升大规模服务下的网络性能。但很多刚接触K8s网络配置的开发者,在开启IPVS时总会遇到各种"坑"——从内核模块缺失到配置不生效,每一步都可能让你卡壳数小时。本文将用最直白的操作步骤,带你避开所有雷区。
1. 环境准备与前置检查
在开始修改集群配置前,我们需要确保节点满足IPVS的基本运行条件。不同于iptables,IPVS依赖Linux内核模块实现四层负载均衡,这意味着你的操作系统必须支持相关功能。
首先通过SSH登录到所有Kubernetes节点(包括master和worker),执行以下命令检查内核模块状态:
lsmod | grep ip_vs理想情况下,你应该看到类似这样的输出:
ip_vs_sh 16384 0 ip_vs_wrr 16384 0 ip_vs_rr 16384 0 ip_vs 172032 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr如果没有任何输出,说明内核模块未加载。此时需要手动加载模块:
sudo modprobe -- ip_vs sudo modprobe -- ip_vs_rr sudo modprobe -- ip_vs_wrr sudo modprobe -- ip_vs_sh为了让这些模块在系统重启后自动加载,创建配置文件:
cat <<EOF | sudo tee /etc/modules-load.d/ipvs.conf ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh EOF另一个常见问题是nf_conntrack模块导致IPVS无法正常工作。检查并确保相关参数设置合理:
sudo sysctl -w net.ipv4.vs.conntrack=1 sudo sysctl -w net.ipv4.vs.expire_nodest_conn=1提示:在公有云环境(如AWS、阿里云)中,某些内核模块可能被禁用。如果modprobe报错,可能需要更换操作系统镜像或自行编译内核。
2. 安装IPVS管理工具
虽然IPVS本身是内核功能,但我们需要ipvsadm这个用户空间工具来验证配置是否生效。在所有节点上安装:
# Ubuntu/Debian sudo apt-get update && sudo apt-get install -y ipvsadm # CentOS/RHEL sudo yum install -y ipvsadm安装完成后,运行以下命令检查IPVS版本:
ipvsadm -v正常输出应类似于:
ipvsadm v1.31 2020/12/03 (compiled with popt and IPVS v1.2.1)注意:某些旧版Linux发行版可能默认安装的是1.27等老版本,这可能导致部分新特性不可用。建议通过源码编译安装最新版。
3. 修改kube-proxy配置
现在来到最关键的一步——将kube-proxy的工作模式从iptables切换到IPVS。在kubeadm部署的集群中,这通过修改ConfigMap实现。
首先获取当前的kube-proxy配置:
kubectl -n kube-system get cm kube-proxy -o yaml你会看到类似这样的输出(部分内容已省略):
apiVersion: v1 data: config.conf: |- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: "" ...使用kubectl edit命令修改配置:
kubectl -n kube-system edit cm kube-proxy找到mode: ""这一行,将其改为:
mode: "ipvs"同时建议添加以下IPVS专属参数(放在config.conf的ipvs字段下):
ipvs: strictARP: true scheduler: "rr" excludeCIDRs: null minSyncPeriod: 0s syncPeriod: 30s tcpTimeout: 0s tcpFinTimeout: 0s udpTimeout: 0s保存退出后,kube-proxy并不会自动应用这些变更。我们需要重启所有kube-proxy Pod:
kubectl -n kube-system delete pod -l k8s-app=kube-proxy等待几分钟让Pod重新创建,然后检查日志确认IPVS模式已启用:
kubectl -n kube-system logs -l k8s-app=kube-proxy | grep "Using ipvs Proxier"你应该能看到类似输出:
I0721 09:15:32.345678 1 server_others.go:269] "Using ipvs Proxier"4. 验证IPVS是否生效
配置完成后,我们需要从多个维度验证IPVS确实在工作。
方法一:检查kube-proxy日志
kubectl -n kube-system logs -l k8s-app=kube-proxy | grep -i ipvs正常应该看到IPVS相关初始化日志,如:
I0721 09:15:32.345678 1 server_others.go:269] "Using ipvs Proxier" I0721 09:15:32.456789 1 proxier.go:420] "IPVS scheduler not specified, use rr by default"方法二:使用ipvsadm检查规则
sudo ipvsadm -L -n输出示例:
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.96.0.1:443 rr -> 192.168.1.100:6443 Masq 1 0 0 TCP 10.96.0.10:53 rr -> 10.244.0.5:53 Masq 1 0 0 -> 10.244.0.6:53 Masq 1 0 0方法三:创建测试Service验证部署一个临时Nginx服务:
kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80然后检查IPVS规则:
sudo ipvsadm -L -n | grep nginx应该能看到新创建的Service对应的IPVS规则。
5. 常见问题排查指南
即使按照上述步骤操作,你可能还是会遇到各种问题。以下是几个典型场景的解决方案:
问题1:kube-proxy日志显示仍在使用iptables
I0721 09:15:32.345678 1 server_others.go:269] "Using iptables Proxier"解决方案:
- 确认ConfigMap修改已保存
- 确认已删除所有kube-proxy Pod
- 检查节点是否缺少IPVS内核模块(回到步骤1)
问题2:ipvsadm -L -n显示空列表
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn解决方案:
- 确认kube-proxy确实运行在IPVS模式(检查日志)
- 检查是否有活跃的Service:
kubectl get svc - 等待几分钟让kube-proxy同步规则(默认同步周期30秒)
问题3:NodePort服务无法访问解决方案:
- 检查
net.ipv4.ip_forward是否设置为1:sudo sysctl -w net.ipv4.ip_forward=1 - 确保防火墙没有阻止NodePort端口(通常范围30000-32767)
- 检查IPVS规则中是否有对应的NodePort条目
问题4:IPVS模式下服务访问延迟高解决方案:
- 尝试调整
kube-proxy配置中的syncPeriod(默认30s):syncPeriod: 10s - 考虑更换调度算法(如从rr改为wrr):
scheduler: "wrr"
6. 性能调优与高级配置
当IPVS基本功能验证通过后,我们可以进一步优化性能参数。
内核参数调优编辑/etc/sysctl.conf,添加以下内容:
net.ipv4.vs.conn_reuse_mode = 1 net.ipv4.vs.expire_nodest_conn = 1 net.ipv4.vs.expire_quiescent_template = 1 net.ipv4.vs.conntrack = 1应用设置:
sudo sysctl -pkube-proxy高级配置在ConfigMap中添加以下参数可以进一步提升大规模集群下的性能:
conntrack: maxPerCore: 32768 min: 131072 tcpCloseWaitTimeout: 1h0m0s tcpEstablishedTimeout: 24h0m0s监控IPVS性能安装ipvsadm后,可以通过以下命令实时监控:
watch -n 1 sudo ipvsadm -L -n --stats输出示例:
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 10.96.0.1:443 12 1560 1560 182KB 184KB -> 192.168.1.100:6443 12 1560 1560 182KB 184KB对于生产环境,建议将IPVS指标接入Prometheus监控系统。可以使用ipvs-exporter来暴露这些指标:
kubectl apply -f https://raw.githubusercontent.com/danielqsj/kube-proxy-ipvs-exporter/master/deploy/rbac.yaml kubectl apply -f https://raw.githubusercontent.com/danielqsj/kube-proxy-ipvs-exporter/master/deploy/deployment.yaml