我想在 4 台機器上建立 Kubernetes 叢集。其中一個擁有公共 IP 位址,並且可以透過網路存取(我們稱之為Master
)。 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
我還讓 pod 在不同的工作進程上運行,沒有錯誤。
我已經用以下命令初始化了我的叢集:
sudo kubeadm init --control-plane-endpoint=master.foo --pod-network-cidr=10.244.0.0/16
(使用 Flannel 作為覆蓋網路。)
問題是在master上運行kubectl exec
or會導致錯誤: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 在 OpenVPN 適配器上使用的事實結合起來tun0
?我錯過了什麼?看起來很奇怪的是,容器在工作進程上運行,但我無法kubectl exec
從主進程對它們執行命令()。
答案1
當你跑步kubectl port-forward
(或exec
)時,庫貝克特爾正在連接到api伺服器然後連接到庫貝萊特它在連接埠 10250 上的每個節點上運行。
由於您的主節點與工作節點不在同一網路中,且工作節點無法從外部訪問,因此 api-server(在主節點上運行)無法連接到它們。
是的,VPN 可能會解決您的問題。為了使用 kubelet,tun0
你需要公佈它的 IP 位址--node-ip
kubelet 的選項
--node-ip string
節點的 IP 位址。如果設置,kubelet 將使用該節點的 IP 位址
我假設主節點是從外部進入叢集的唯一入口點,因此為了能夠從外部公開並存取 Pod,您需要所有節點之間的完整網路連接,尤其是在這種情況下主節點到工作節點。
讓我知道是否有幫助。