Для каждой службы в кластере k8s кубернеты выполняют 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 для реализации сетевой политики, и соответствующий набор содержит только ip pod.
Итак, когда модуль службы работает на узле node1, а модуль доступа работает на узле node2. Сетевая политика отбрасывает запрос, потому что src ip запроса - это ip node2 или flannel.1 ip.
Я думаю, что есть способ закрыть snat для службы clusterip, но я нигде не могу его найти, может ли кто-нибудь мне помочь?
Большое тебе спасибо!