kube-proxy运行机制解析

基于1.29

第一代Proxy

一开始是一个真实的TCP/UDP代理,类似于HAProxy,负责转发从Service到Pod的访问流量,这被称为“userspace”模式

第二代Porxy

从v1.2版本开始,K8s将iptables作为kube-proxy的默认模式,iptables模式组作为kube-proxy都默认模式

  • iptables模式,不再起到数据层面的Porxy作用,client向Service的请求流量通过iptables的NAT规则 直接发送到目标Pod,不再经过kube-proxy的转发,kube-proxy只承担控制层面的功能,即通过API Server的Watch接口实时跟踪Service与Endpoint的变更信息,并更新Node上相应的iptables规则

kube-proxy针对于Service和Pod创建一些主要的iptables规则如下:

  • KUBE-CLUSTER-IP:在masquerade-all=true或ClusterCIDR被指定的情况下对Service Cluster IP地址进行伪装,以解决数据包欺骗问题
  • KUBE-EXTERNAL-IP:将数据包伪装成Service的外部IP地址
  • KUBE-LOAD-BALANCER、KUBE-LOAD-BALANCER-LOCAL:伪装成Load Balaner类型的Service流量
  • KUBE-NODE-PORT-TCP、KUBE-NODE-PORT-LOCAL-TCP、KUBE-NODE-PORT-UDP、KUBE-NODE-PORT-LOCAL-UDP:伪装NodePort类型的Service流量

第三代Porxy

从K8s v1.8引入了IPVS模式,在v1.11 GA

iptables模式和ipvs模式都是基于Nerfilter实现,但是定位不同

  • iptables主要是为了防火墙设计

  • ipvs用于高性能负载均衡,并且使用更高效的哈希表