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

问题描述 投票:0回答:1

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

非常感谢你!

kubernetes kube-proxy calico
1个回答
0
投票

这个问题已经解决。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.