Узлы Kubernetes за экспозицией службы NAT - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь заставить кластер Kubernetes работать с некоторыми узлами, работающими за NAT без публичного IP-адреса.(Зачем мне это нужно, это другая история)

Есть 3 узла:

  1. Мастер кластера Kubernetes (с публичным IP-адресом)
  2. Узел1 (с публичным IPадрес)
  3. Node2 (работает за NAT на моем ноутбуке как виртуальная машина, без общедоступного IP-адреса)

Все 3 узла работают под управлением Ubuntu 18.04 с Kubernetes v1.10.2 (3),Docker 17.12

кластер Kubernetes был создан следующим образом:

kubeadm init --pod-network-cidr=10.244.0.0/16

Используется фланелевая сеть:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Node1 и Node2 присоединились к кластеру:

NAME STATUS ROLES AGE VERSION master-node Ready master 3h v1.10.2 node1 Ready <none> 2h v1.10.3 node2 Ready <none> 2h v1.10.2

Развертывание Nginx + служба (type = NodePort), созданная и запланированная для Node1 (с общедоступным IP-адресом):

https://pastebin.com/6CrugunB

kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h my-nginx NodePort 10.110.202.32 <none> 80:31742/TCP 16m

Это развертывание доступно через http://MASTER_NODE_PUBLIC_IP:31742 и http://NODE1_PUBLIC_IP:31742, как и ожидалось.

Другая служба развертывания Nginx + (type = NodePort), созданный и запланированный для Node2 (без общедоступного IP-адреса):

https://pastebin.com/AFK42UNW

kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h my-nginx NodePort 10.110.202.32 <none> 80:31742/TCP 22m nginx-behind-nat NodePort 10.105.242.178 <none> 80:32350/TCP 22m

Однако эта служба недоступначерез http://MASTER_NODE_PUBLIC_IP:32350 или http://NODE1_PUBLIC_IP:32350.

Доступ к нему возможен только через http://MY_VM_IP:32350 с моего ноутбука.

Более того: я не могу попасть внутрь nginx-behind-natpods via kubectl exec либо.

Есть ли способ достичь этого?

1 Ответ

0 голосов
/ 22 мая 2018

Как упомянуто в документации Kubernetes :

Kubernetes предъявляет следующие основные требования к любой сетевой реализации (за исключением любых политик преднамеренной сегментации сети):

  • все контейнеры могут связываться со всеми другими контейнерами без NAT
  • все узлы могут связываться со всеми контейнерами (и наоборот) без NAT
  • IP, который контейнер видит в себе кактот же IP-адрес, который другие воспринимают как

На практике это означает, что вы не можете просто взять два компьютера с Docker и ожидать, что Kubernetes будет работать.Вы должны убедиться, что основные требования соблюдены.

По умолчанию соединения от api-сервера к узлу, порту или службе являются простым HTTP без аутентификации и шифрования.
Они могут работатьчерез HTTPS, но по умолчанию apiserver не будет проверять сертификат конечной точки HTTPS, и, следовательно, он не будет обеспечивать никаких гарантий целостности и может подвергаться атакам типа «человек посередине».

Подробнее одля обеспечения безопасности соединений внутри кластера, пожалуйста, проверьте этот документ

...