如何为ClusterIP Service配置IPVS负载均衡策略?
IPVS负载均衡策略对ClusterIP Service的支持说明
你列出的6种IPVS负载均衡策略全部适用于ClusterIP类型Service,NodePort、LoadBalancer、ExternalIP等所有经过kube-proxy转发的Service类型都支持这些策略。集群默认调度策略为rr(轮询),支持全局默认配置修改、单Service独立配置两种调整方式,配置生效前请先确认集群kube-proxy运行在IPVS模式:
# 校验kube-proxy代理模式 kubectl get configmap kube-proxy -n kube-system -o yaml | grep -A1 ipvs # 输出中mode字段为ipvs即为正常,若为iptables模式需先切换至IPVS再做后续配置 # 可通过ipvsadm命令校验规则是否正常下发 kubectl exec -it kube-proxy-<你的kube-proxy pod后缀> -n kube-system -- ipvsadm -ln
具体配置方式
全局默认策略修改
直接编辑kube-system命名空间下的kube-proxy ConfigMap,在ipvs配置块下修改scheduler字段为目标策略即可,支持的取值对应关系:
rr:轮询(默认值)lc:最小连接数(优先转发给当前活跃连接数最少的后端Pod)dh:目标地址哈希sh:源地址哈希sed:最短预期延迟nq:永不排队
配置片段参考:
ipvs: scheduler: "lc" # 填写你需要设置的全局默认策略 minSyncPeriod: 0s syncPeriod: 30s
保存配置后kube-proxy会自动热加载规则,无需重启Pod,等待30-60秒后通过ipvsadm -ln即可看到所有Service对应的调度规则已更新。
单Service自定义策略
如果仅需要给特定Service设置独立的负载均衡策略,不需要调整全局默认值,直接给目标Service添加对应annotation即可,该配置优先级高于全局默认配置:
apiVersion: v1 kind: Service metadata: name: test-clusterip-svc annotations: kube-proxy.alpha.kubernetes.io/ipvs-scheduler: "sed" # 填写该Service专属调度策略 spec: type: ClusterIP ports: - port: 80 targetPort: 8080 selector: app: test-app
添加annotation后同样等待数十秒,即可通过ipvsadm看到对应虚拟IP的调度规则已更新。
实践参考
- 你提到的无会话保持场景选择
lc或sed的思路完全合理,尤其适用于后端Pod资源规格不一致、请求处理耗时差异大、长连接占比高的业务(比如gRPC、WebSocket服务):默认rr策略仅按固定顺序轮询转发,完全不感知后端实际负载,很容易出现部分Pod连接堆积、部分Pod闲置的问题;lc会优先选择活跃连接数最少的后端,sed会在最小连接数基础上额外考量转发延迟,负载均衡效果比默认rr提升非常明显。 - 有会话保持需求时不建议硬用
sh源地址哈希策略,直接使用Service原生的sessionAffinity: ClientIP配置即可,IPVS模式下会自动适配规则,还支持自定义会话超时时间,灵活性远高于直接指定sh调度器。 nq策略适合请求处理时延极低的场景(比如静态资源服务、纯缓存查询接口):请求到来时如果有空闲Pod会直接转发,不会进入排队流程,无空闲Pod时才会走最小连接数逻辑,尾延迟表现比lc更好。dh目标地址哈希策略基本只在对接外部负载均衡、需要按目标地址固定调度的场景使用,纯集群内ClusterIP Service几乎用不到,不建议随意配置。- 踩坑提示:如果集群使用Cilium、Calico等替代kube-proxy实现的CNI插件,需要提前确认对应CNI对IPVS调度策略的支持情况,部分CNI默认不接管该类annotation配置,修改后不会生效。
内容的提问来源于stack exchange,提问作者dei
相关产品推荐
相关产品推荐

