在kubernetes上使用服务类型clusterip时如何避免snat?

时间:2018-01-02 10:26:15

标签: kubernetes kube-proxy calico

对于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。但我无法在任何地方找到它,有人可以帮助我吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

问题已经解决。

我将kube-proxy的--cluster-cidr=10.254.0.0/16更改为--cluster-cidr=172.30.0.0/16。然后它运作良好。

kube-proxy cluster-cidr需要匹配控制器管理器上使用的那个,也就是calico使用的那个。