Назад | Перейти на главную страницу

Перенаправление на сервис k8s извне кластера

Я установил k8s на виртуальную машину, теперь я могу получить доступ к модулям через службы на этой виртуальной машине напрямую, потому что kubelet настраивает iptable NAT на виртуальной машине.

Моя цель - получить доступ к pod'ам по IP-адресу сервисов с машины, расположенной вне кластера (позвольте называть это my-home-machine). Я настроил маршрутизацию на IP-адреса служб k8s через главный узел. Так что я могу отправлять пакеты в nginx-pod, например, с помощью netcat из my-home-machine сюда:

netcat -zv 10.77.112.147 80

где 10.77.112.147 - IP-адрес кластера nginx-service в k8s. Внутри nginx-pod я вижу этот запрос с tcpdump:

17:42:55.985517 IP 10.0.10.64.56080 > 10.0.113.193.80: Flags [S], seq 3003847122, win 64240, options [mss 1460,sackOK,TS val 4001672643 ecr 0,nop,wscale 7], length 0
17:42:55.985557 IP 10.0.113.193.80 > 10.0.10.64.56080: Flags [S.], seq 3158920861, ack 3003847123, win 27760, options [mss 1400,sackOK,TS val 8954181 ecr 4001672643,nop,wscale 7], length 0

где 10.0.10.64 - это то, где должен работать NAT k8s (возможно, я ошибаюсь, поправьте меня, пожалуйста), а 10.0.113.193 - это ClusterIP для nginx-pod. Как видите, pod получил пакет и отправил ответ. Более того, я могу уловить этот ответ на k8s-node, где работает nginx-pod. Снова с помощью tcpdump:

21:06:24.669622 IP 10.0.113.193.http > 10.0.10.64.56080: Flags [S.], seq 475316172, ack 3702114669, win 27760, options [mss 1400,sackOK,TS val 9919609 ecr 4002638070,nop,wscale 7], length 0
21:06:25.673809 IP 10.0.113.193.http > 10.0.10.64.56080: Flags [S.], seq 475316172, ack 3702114669, win 27760, options [mss 1400,sackOK,TS val 9920614 ecr 4002638070,nop,wscale 7], length 0

После 10.0.10.64 пакет проходит еще через три маршрутизатора, прежде чем достигнет my-home-machine. Проблема в том, что этот пакет не приходит в my-home-machine вообще (я получаю таймаут от netcat). Я подозреваю, что что-то не так с 10.0.10.64, потому что я могу пинговать my-home-machine или подключитесь к серверу mysql (который работает на my-home-machine) из nginx-pod успешно. Есть предложения, как я могу это исправить?

Как вы упомянули в своем вопросе, эти IP-адреса являются «виртуальными» и создаются с помощью мастера iptables. Если вы хотите получить доступ к Kubernetes Service из-за пределов программно определяемой сети вам потребуется Service из type: NodePort (или type: LoadBalancer, что совпадает с NodePort только он также пытается предоставить вам балансировщик нагрузки), или вы можете использовать Ingress ресурс, если у вас уже есть контроллер входящего трафика, работающий в вашем кластере, и Service совместим с ограничениями, налагаемыми входным контроллером.