Как изменить исходный IP-адрес пода в Kubernetes?

Чтобы изменить исходный IP-адрес на 100.101.102.103 для исходящих данных в определенное место назначения, я изменил iptables внутри контейнера Kubernetes Pod, выполнив инструмент командной строки iptables:

iptables -t nat -A POSTROUTING --destination 100.200.150.50/32 -j SNAT --to-source 100.101.102.103

Но он блокирует мои исходящие данные в этот пункт назначения и кажется, что данные улавливаются внутри контейнера, например, когда я отправляю простой запрос Curl и просматриваю его с помощью инструмента Tcpdump.

Главный вопрос может заключаться в следующем: как изменить исходный IP-адрес пода в Kubernetes для пункта назначения за пределами кластера?

P.S. Я развернул свой модуль в привилегированном режиме с доступом NET_ADMIN и NET_RAW.


person losingsleeep    schedule 07.02.2020    source источник
comment
Вы хотите изменить исходный IP-адрес модуля на случайный IP-адрес?   -  person Arghya Sadhu    schedule 07.02.2020
comment
Нет. Мне нужно, чтобы он был статическим, настроенным / переданным во время развертывания.   -  person losingsleeep    schedule 07.02.2020
comment
Не стоит играть с сетью внутри pod, потому что это ненадолго. Каждый перезапуск или перепланирование и конфигурация исчезают. Вы можете проверить этот kube-static-egress-ip.   -  person Crou    schedule 07.02.2020
comment
@Crou Да, именно поэтому я пытаюсь настроить iptable узла внутри модуля (автоматическим способом), чтобы эти изменения сохранялись после перезапуска узла или переустановки каждого модуля на любом узле. Обязательно подумаю и о изящной очистке позже. И спасибо за ссылку   -  person losingsleeep    schedule 07.02.2020
comment
То, чего вы пытаетесь достичь, определенно является антипаттерном в мире K8s. Сможете ли вы объяснить контекст? Может быть другой подход к вашей проблеме.   -  person Bernard Halas    schedule 07.02.2020
comment
@BernardHalas, у меня есть пункт назначения за пределами кластера K8, который хочет, чтобы у меня был статический IP-адрес, когда я отправляю ему данные по сети, чтобы он мог каким-то образом распознать / идентифицировать меня. Как я могу этого добиться?   -  person losingsleeep    schedule 07.02.2020


Ответы (1)


Я изменил iptables внутри контейнера Kubernetes Pod

Я предлагаю не делать этого, так как это может повредить CNI и / или kube-proxy кубернетов. Вместо этого рассмотрите возможность использования kubernetes egress, чтобы иметь хорошо известный исходный IP-адрес в исходящих пакетах к месту назначения за пределами кластера.

Исходящие пакеты из кластера k8s в пункт назначения за пределами кластера имеют IP-адрес узла в качестве исходного IP-адреса.

https://kubernetes.io/docs/tutorials/services/source-ip/ говорит, что исходящие пакеты от k8s получают NAT источника с IP-адресом узла:

Source NAT: замена исходного IP-адреса в пакете, обычно на IP-адрес узла.

Для отправки исходящих пакетов из кластера k8s можно использовать следующее:

person Vikram Hosakote    schedule 07.02.2020
comment
Спасибо, Викрам. Каким-то образом это сработало так: привилегированный модуль, такой как daemonset, или модуль с hostNetwork: true исключил желаемое место назначения из правильной политики calico (с помощью iptables cli), а затем установил новое правило iptables, тогда основной сервисный модуль не должен быть привилегированный. Хитрый и хрупкий. - person losingsleeep; 26.02.2020