Kubeadm 加入:创建具有多个主节点的 HA 集群时失败

Kubeadm join: Fails while creating HA cluster with multiple master nodes

我有 5 Vm in my GCP,其中三个应该是 master1, master2, master3,另外两个是工作节点 (worker1 & worker 2)。我创建了一个 TCP Loadbalancer(LB) 来为主节点启用负载平衡。我在 LB 中有两个部分:

i)frontend ii)backend

在后端,我在那里定义了所有主 ip。在前端,我生成了一个静态 public ip 并给定了端口 6443 as LB port.

在master1中,我成功运行 kubeadm init命令如下:

kubeadm init --control-plane-endpoint="<LB_IP>:6443" --apiserver-advertise-address=10.128.0.2 --pod-network-cidr=10.244.0.0/16

其中 10.128.0.2 是 master1 的内部 IP,10.244.0.0/16 是 kube-flannel 的网络 cidr。

kubeadm init 运行s 成功并给出了两个 kubeadm 加入命令,一个加入新的控制平面,另一个加入新的工作节点。

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

  kubeadm join LB_IP:6443 --token znnlha.6Gfn1vlkunwpz36b \
    --discovery-token-ca-cert-hash sha256:dc8834a2a5b4ada38a1ab9831e4cae67e9d64cb585458a194018f3ba5a82ac4U \
    --control-plane 

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join LB_IP:6443 --token znnlha.6sfn1vlkunwpz36A \
    --discovery-token-ca-cert-hash sha256:dc8834a2a5b4ada38a1ab9831e4cae68e9d64cb585458a194018f3ba5a82ac4e 

我没有使用 --upload-certs 来 运行 将证书从一个控制平面转移到另一个控制平面。我是手动做的。

但是当我 运行 上面的 kubeadm join 命令添加一个新的控制平面时,在我的其他主节点之一上,比如 master2,我收到一个错误以下 :

[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
error execution phase preflight: unable to fetch the kubeadm-config ConfigMap: failed to get config map: Get "https://LB_IP:6443/api/v1/namespaces/kube-system/configmaps/kubeadm-config?timeout=10s": dial tcp LB_IP:6443: connect: connection refused

我刚刚遇到了同样的问题 - 在我的例子中,问题是当从一个也是该负载均衡器目标的实例访问 GCP 的负载均衡器时,请求将始终落在您发送请求的同一实例上请求。

基于此:

  • 你 运行 kubeadm initNode A 上使用 LB_IPLB_IP 解析为 Node A。一切都按预期工作,因为您正在创建一个新集群。
  • 你 运行 kubeadm join 在节点 B 上使用 LB_IPLB_IP 解析为 Node B,而您刚刚初始化的 master 在 Node A 上。 Node B 在端口 6443 上没有任何 运行ning,因此你会收到连接被拒绝的错误。

一个简单的解决方案是从负载均衡器目标中删除您正在 运行 宁 kubeadm join 的实例。加入成功后可以重新添加。