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 init
在 Node A
上使用 LB_IP
。 LB_IP
解析为 Node A
。一切都按预期工作,因为您正在创建一个新集群。
- 你 运行
kubeadm join
在节点 B 上使用 LB_IP
。 LB_IP
解析为 Node B
,而您刚刚初始化的 master 在 Node A
上。 Node B
在端口 6443 上没有任何 运行ning,因此你会收到连接被拒绝的错误。
一个简单的解决方案是从负载均衡器目标中删除您正在 运行 宁 kubeadm join
的实例。加入成功后可以重新添加。
我有 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 init
在Node A
上使用LB_IP
。LB_IP
解析为Node A
。一切都按预期工作,因为您正在创建一个新集群。 - 你 运行
kubeadm join
在节点 B 上使用LB_IP
。LB_IP
解析为Node B
,而您刚刚初始化的 master 在Node A
上。Node B
在端口 6443 上没有任何 运行ning,因此你会收到连接被拒绝的错误。
一个简单的解决方案是从负载均衡器目标中删除您正在 运行 宁 kubeadm join
的实例。加入成功后可以重新添加。