0

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

非常感谢!

4

1 回答 1

0

这个问题已经解决。

我将--cluster-cidr=10.254.0.0/16kube-proxy 更改为--cluster-cidr=172.30.0.0/16. 然后效果很好。

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

于 2018-01-03T11:36:02.693 回答