Я хочу создать кластер Kubernetes на 4 машинах. У одной из них есть публичный IP-адрес, и она доступна из интернета (назовем ее Master
). У мастера также есть назначенное ему доменное имя (допустим, master.foo
).
Три машины находятся в одной частной сети (192.168.5.0) за маршрутизатором (назовем их Worker A/B/C
).
Мне удалось успешно настроить кластер между этими машинами:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
Master Ready master 5d20h v1.17.1
WorkerA Ready <none> 21h v1.17.1
WorkerB Ready <none> 21h v1.17.1
WorkerC Ready <none> 5d17h v1.17.1
У меня также есть поды, работающие на разных рабочих узлах без ошибок.
Я инициализировал свой кластер с помощью:
sudo kubeadm init --control-plane-endpoint=master.foo --pod-network-cidr=10.244.0.0/16
(Использование Flannel в качестве накладной сети.)
Проблема в том, что запуск kubectl exec
или kubectl port-forward
на главном сервере приводит к ошибке:
paulb@galaxy:~$ kubectl -n pgo port-forward svc/postgres-operator 8443:8443
error: error upgrading connection: error dialing backend: dial tcp 192.168.5.192:10250: i/o timeout
Где 192.168.5.192
, конечно, частный IP одного из рабочих. Я думаю, это связано с тем, что здесь указано:https://kubernetes.io/docs/concepts/cluster-administration/networking/#the-kubernetes-network-model
pods on a node can communicate with all pods on all nodes without NAT
Итак, мне следует настроить сеть OpenVPN между всеми этими машинами? Если да, то как мне совместить это kubeadm init --control-plane-endpoint
с тем, что у меня нет kubernetes, выходящего на tun0
адаптер OpenVPN? Я что-то упустил? Кажется странным, что контейнеры запущены на рабочих, но я не могу выполнять команды ( kubectl exec
) на них с главного.
решение1
Когда вы бежите kubectl port-forward
(или exec
),кубектлподключается кapi-серверкоторый затем подключается ккубелеткоторый работает на каждом узле на порту 10250.
Поскольку ваш главный узел не находится в той же сети, что и рабочие узлы, а рабочие узлы не доступны извне, api-server (который работает на главных узлах) не может подключиться к ним.
Да, VPN может решить вашу проблему. И чтобы kubelet использовал, tun0
вам нужно объявить его IP-адрес с--node-ip
вариант для кубелета
--node-ip string
IP-адрес узла. Если установлено, kubelet будет использовать этот IP-адрес для узла
Я предполагаю, что главный узел — это единственная точка входа в ваш кластер извне, поэтому для того, чтобы иметь возможность открывать модули и получать к ним доступ извне, вам необходимо полное сетевое соединение между всеми вашими узлами, и в данном случае особенно между главным и рабочим узлами.
Дайте мне знать, если это было полезно.