对于k8s集群中的每个服务,kubernetes会对请求数据包进行抢占。 iptables规则是:
-A KUBE-SERVICES ! -s 10.254.0.0/16 -d 10.254.186.26/32 -p tcp -m comment --comment "policy-demo/nginx: cluster IP" -m tcp --dport 80 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.254.186.26/32 -p tcp -m comment --comment "policy-demo/nginx: cluster IP" -m tcp --dport 80 -j KUBE-SVC-3VXIGVIYYFN7DHDA
-A KUBE-MARK-MASQ -j MARK --set-xmark 0x4000/0x4000
-A POSTROUTING -m comment --comment "kubernetes postrouting rules" -j KUBE-POSTROUTING
-A KUBE-POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -m mark --mark 0x4000/0x4000 -j MASQUERADE
它在大多数情况下运行良好,但不适用于网络策略。 Caclico使用ipset实现networkpolicy,匹配的set只包含pod ip。
因此,当服务pod在node1上运行时,访问pod在node2上运行。 networkpolicy将DROP请求,因为请求的src ip是node2的ip或flannel.1 ip。
我认为可能有一种方法可以关闭针对clusterip服务的snat。但我无法在任何地方找到它,有人可以帮助我吗?
非常感谢你!
这个问题已经解决。
我把--cluster-cidr=10.254.0.0/16
改为kube-proxy改为--cluster-cidr=172.30.0.0/16
。然后它运作良好。
kube-proxy cluster-cidr需要匹配控制器管理器上使用的那个,也就是calico使用的那个。