Как избежать snat при использовании типа сервиса clusterip на kubernetes?
Для каждого сервиса в кластере 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 для реализации сетевой политики, а соответствующий набор содержит только pod ip.
Поэтому, когда модуль службы работает на узле 1, а модуль доступа работает на узле 2. Сетевая политика отбросит запрос, потому что src ip запроса - это ip узла2 или фланел.1 ip.
Я думаю, что есть способ закрыть snat для сервиса clusterip. Но я нигде не могу его найти, кто-нибудь может мне помочь?
Большое спасибо!
1 ответ
Проблема была решена.
Я изменился --cluster-cidr=10.254.0.0/16
для кубе-прокси --cluster-cidr=172.30.0.0/16
, И тогда это сработало хорошо.
Kube-proxy cluster-cidr должен совпадать с тем, который используется в диспетчере контроллеров, а также с ситцем.