Я хочу создать кластер 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
с тем, что я люблю кубернетов, выходящих на OpenVPN tun0
адаптер? Я что-то пропустил? Кажется странным, что на воркерах работают контейнеры, но я не могу выполнять команды (kubectl exec
) на них от мастера.
Когда ты бежишь kubectl port-forward
(или exec
), kubectl подключается к api-сервер который затем подключается к кубелет который работает на каждом узле порта 10250.
Поскольку ваш главный узел не находится в той же сети, что и рабочие, а рабочие недоступны извне, api-server (который работает на основных узлах) не может подключиться к ним.
Да, VPN может решить вашу проблему. И чтобы кубелет использовать tun0
вам нужно рекламировать свой IP-адрес с помощью --node-ip
вариант для кубелет
--node-ip строка
IP-адрес узла. Если установлено, kubelet будет использовать этот IP-адрес для узла.
Я предполагаю, что главный узел является единственной точкой входа в ваш кластер извне, поэтому для того, чтобы иметь возможность открывать и получать доступ к модулям извне, вам необходимо полное сетевое соединение между всеми вашими узлами, и особенно в этом случае мастер к рабочему.
Сообщите мне, было ли это полезно.