对于 k8s 集群中的每个服务,kubernetes 都会对请求数据包进行 snat。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。但是我在任何地方都找不到它,有人可以帮我吗?
非常感谢!