我想在 4 台机器上创建一个 Kubernetes 集群。其中一台机器有公共 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
我还在不同的工作程序上运行了 pod,没有任何错误。
我已经使用以下命令初始化了我的集群:
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
当然,其中一个工作人员的私有 IP在哪里192.168.5.192
。我认为这与此处所述有关: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 适配器上使用 kubernetes 的事实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,您需要所有节点之间建立完整的网络连接,在这种情况下特别是主节点和工作节点之间的连接。
如果有帮助请告诉我。