kube-proxy
kube-proxy 可以直接运行在物理机上,也可以以 static pod 或者 daemonset 的方式运行。
kube-proxy 当前支持以下几种实现
- iptables:目前推荐的方案,完全以 iptables 规则的方式来实现 service 负载均衡。该方式最主要的问题是在服务多的时候产生太多的 iptables 规则,非增量式更新会引入一定的时延,大规模情况下有明显的性能问题
- ipvs:为解决 iptables 模式的性能问题,v1.11 新增了 ipvs 模式(v1.8 开始支持测试版,并在 v1.11 GA),采用增量式更新,并可以保证 service 更新期间连接保持不断开
注意:使用 ipvs 模式时,需要预先在每台 Node 上加载内核模块 , ip_vs
, ip_vs_rr
, ip_vs_wrr
, ip_vs_sh
等。
(图片来自cilium/k8s-iptables-diagram)
如果服务设置了 externalTrafficPolicy: Local
并且当前 Node 上面没有任何属于该服务的 Pod,那么在 中会直接丢掉从公网 IP 请求的包:
列出了各种服务在 IPVS 模式下的工作原理。
注意,IPVS 模式也会使用 iptables 来执行 SNAT 和 IP 伪装(MASQUERADE),并使用 ipset 来简化 iptables 规则的管理:
kube-proxy 监听 API server 中 service 和 endpoint 的变化情况,并通过 userspace、iptables、ipvs 或 winuserspace 等 proxier 来为服务配置负载均衡(仅支持 TCP 和 UDP)。