k8s iptables 链: svc映射到pod需要进行一次dnat转换。 最主要的链是kube-services,kube-svc-*,kube-SEP-* 1、kube-services链是访问集群内部服务的数据包入口点,它会根据匹配到目标ip:port 将数据包分发到相应的kube-svc-*链 2、kube-svc-* 链相当于一个负载均衡器,它会将数据包平均分发到kube-sep-* 链。每一个kube-svc-* 链后面的kube-sep-*链都和service的后端pod数量一样 3、kube-sep-*链通过DNAT 将连接的目的地址和端口从service的ip:port替换为后端pod的ip:port,从而将流量转发到相应的pod kube-proxy IPVS模式 --procy-mode参数:除了现在有的userspace和iptables模式,ipvs模式通过--proxy-mode=ipvs进行配置 --proxy-scheduler:用来指定ipvs负载均衡算法,如果不配置则默认使用round-robin(rr)模式 ipvs支持的负载均衡算法有: rr--轮询 lc--最小链接 dh--目的地址哈希 sh--源地址哈希 sed--最短时延 一旦创建一个service和一个endpoints,ipvs的kube-proxy进行做三件事: 1、确保一块dummy网卡(kube-ipvs0)存在,为什么要创建这块网卡?因为ipvs的netfiler钩子挂载input链,我们需要把service的访问ip都绑定在dummy网卡上让内核觉得虚拟ip就是本机ip,从而进入input链。 2、把service的ip绑定在dummy网卡上。 3、通过socket调用,创建ipvsde virtual server和real server,分别对应k8s的service 和 endpoint。