Quero criar um cluster Kubernetes em 4 máquinas. Um deles tem um endereço IP público e pode ser acessado pela Internet (vamos chamar isso de Master
). O Master também tem um nome de domínio atribuído a ele (digamos que seja master.foo
).
Três máquinas estão na mesma rede privada (192.168.5.0), atrás de um roteador (vamos chamá-las de Worker A/B/C
).
Configurei com sucesso um cluster entre estas máquinas:
$ 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
Também tenho pods em execução em diferentes trabalhadores sem erros.
Inicializei meu cluster com:
sudo kubeadm init --control-plane-endpoint=master.foo --pod-network-cidr=10.244.0.0/16
(Usando Flannel como rede de sobreposição.)
O problema é que executar kubectl exec
ou kubectl port-forward
no master resulta em erro:
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
Onde 192.168.5.192
está o IP privado de um dos trabalhadores, claro. Acho que isso está relacionado ao que é afirmado aqui: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
Então, devo configurar uma rede OpenVPN entre todas essas máquinas? Se sim, então como eu combinaria kubeadm init --control-plane-endpoint
com o fato de que não preciso de kubernetes saindo no tun0
adaptador OpenVPN? Perdi algo? Parece estranho que os contêineres estejam sendo executados nos trabalhadores, mas não consigo executar comandos ( kubectl exec
) neles do mestre.
Responder1
Quando você corre kubectl port-forward
(ou exec
),kubectlestá se conectando aservidor APIque então está se conectando akubeletque está sendo executado em todos os nós na porta 10250.
Como o seu nó mestre não está na mesma rede que os trabalhadores e os trabalhadores não são acessíveis de fora, o api-server (que está em execução nos nós mestres) não consegue se conectar a eles.
Sim, a VPN pode resolver o seu problema. E para usar o kubelet tun0
você precisa anunciar seu endereço IP com--node-ip
opção para kubelet
--node-ip string
Endereço IP do nó. Se definido, o kubelet usará este endereço IP para o nó
Presumo que o nó mestre seja o único ponto de entrada externo para o seu cluster, portanto, para poder expor e acessar pods de fora, você precisa de uma conexão de rede completa entre todos os seus nós e, especialmente, do mestre para o trabalhador neste caso.
Deixe-me saber se foi útil.