Я установил 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
совместим с ограничениями, налагаемыми входным контроллером.