系统环境:
Docker 版本:19.03.8
Kubeadm 版本:1.17.4
Kubernetes 版本:1.17.4
Kubernetes Master 数量:3
Kubernetes 安装方式:Kubeadm
一、问题描述
下面节点信息都是都是为了写博客虚构的,跟真实节点信息大体相同
Kubernetes 集群中总共有三台 Master,分别是:
k8s-master-2-11
k8s-master-2-12
k8s-master-2-13
对其中 k8s-master-2-11
Master 节点服务器进行了内核和软件升级操作,从而先将其暂时剔出集群,然后进行升级,完成后准备重新加入到 Kubernetes 集群,通过 Kubeadm 执行,输入下面命令:
1 2 3 4 $ kubeadm join mydlq.club:16443 \ --token 6w0nwi.zag57qgfcdhi76vd \ --discovery-token-ca-cert-hash sha256:efa49231e4ffd836ff996921741c98ac4c5655dc729d7c32aa48c608232f0f08 \ --control-plane --certificate-key a64e9da7346153bd64dba1e5126a644a97fdb63c878bb73de07911d1add8e26b
在执行过程中,输出下面日志,提示 etcd 监控检查失败:
1 2 3 4 5 6 7 8 9 10 ...... [control-plane] Creating static Pod manifest for "kube-controller-manager" W0329 00:01:51.364121 19209 manifests.go:214] the default kube-apiserver authorization-mode is "Node,RBAC" ; using "Node,RBAC" [control-plane] Creating static Pod manifest for "kube-scheduler" W0329 00:01:51.373807 19209 manifests.go:214] the default kube-apiserver authorization-mode is "Node,RBAC" ; using "Node,RBAC" [check-etcd] Checking that the etcd cluster is healthy error execution phase check-etcd: etcd cluster is not healthy: failed to dial endpoint https://10.8.18.105:2379 with maintenance client: context deadline exceeded To see the stack trace of this error execute with --v=5 or higher
根据关键信息 "error execution phase check-etcd"
可知,可能是在执行加入 etcd
时候出现的错误,导致 master
无法加入原先的 kubernetes
集群。
二、分析问题 通过 kubectl 和 kubeadm 信息分析问题。
1、查看集群节点列表 首先通过 Kuberctl 工具检查一下现有的节点信息:
1 2 3 4 5 6 7 8 $ kubectl get node NAME STATUS ROLES VERSION k8s-master-2-12 Ready master v1.17.4 k8s-master-2-13 Ready master v1.17.4 k8s-node-2-14 Ready <none> v1.17.4 k8s-node-2-15 Ready <none> v1.17.4 k8s-node-2-16 Ready <none> v1.17.4
可以看到,k8s-master-2-11 节点确实不在节点列表中
2、查看 Kubeadm 配置信息 在看看 Kubernetes 集群中的 kubeadm 配置信息:
1 $ kubectl describe configmaps kubeadm-config -n kube-system
获取到的内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Name: kubeadm-config Namespace: kube-system Labels: <none> Annotations: <none> ... ClusterStatus: ---- apiEndpoints: k8s-master-2-11: advertiseAddress: 192.168 .2 .11 bindPort: 6443 k8s-master-2-12: advertiseAddress: 192.168 .2 .12 bindPort: 6443 k8s-master-2-13: advertiseAddress: 192.168 .2 .13 bindPort: 6443 apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterStatus
可也看到 k8s-master-2-11
节点信息还存在与 kubeadm
配置中,说明 etcd
中还存储着 k8s-master-2-11
相关信息。
3、分析问题所在及解决方案 因为集群是通过 kubeadm
工具搭建的,且使用了 etcd
镜像方式与 master
节点一起,所以每个 Master
节点上都会存在一个 etcd
容器实例。当剔除一个 master
节点时 etcd
集群未删除剔除的节点的 etcd
成员信息,该信息还存在 etcd
集群列表中。
所以,我们需要 进入 etcd 手动删除 etcd 成员信息 。
三、解决问题 1、获取 Etcd 镜像列表 首先获取集群中的 etcd pod 列表
1 2 3 4 $ kubectl get pods -n kube-system | grep etcd etcd-k8s-master-2-12 1/1 Running 0 etcd-k8s-master-2-13 1/1 Running 0
2、进入 Etcd 容器并删除节点信息 选择上面两个 etcd 中任意一个 pod,通过 kubectl 工具进入 pod 内部:
1 $ kubectl exec -it etcd-k8s-master-2-12 sh -n kube-system
进入容器后,按下面步执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 $ export ETCDCTL_API=3 $ alias etcdctl='etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key' $ etcdctl member list 63bfe05c4646fb08, started, k8s-master-2-11, https://192.168.2.11:2380, https://192.168.2.11:2379, false 8e41efd8164c6e3d, started, k8s-master-2-12, https://192.168.2.12:2380, https://192.168.2.12:2379, false a61d0bd53c1cbcb6, started, k8s-master-2-13, https://192.168.2.13:2380, https://192.168.2.13:2379, false $ etcdctl member remove 63bfe05c4646fb08 Member 63bfe05c4646fb08 removed from cluster ed984b9o8w35cap2 $ etcdctl member list 8e41efd8164c6e3d, started, k8s-master-2-12, https://192.168.2.12:2380, https://192.168.2.12:2379, false a61d0bd53c1cbcb6, started, k8s-master-2-13, https://192.168.2.13:2380, https://192.168.2.13:2379, false $ exit
3、通过 kubeadm 命令再次尝试加入集群 通过 kubeadm
命令再次尝试将 k8s-master-2-11
节点加入集群,在执行前首先进入到 k8s-master-2-11
节点服务器,执行 kubeadm
的清除命令:
然后尝试加入 kubernetes 集群:
1 2 3 4 $ kubeadm join mydlq.club:16443 \ --token 6w0nwi.zag57qgfcdhi76vd \ --discovery-token-ca-cert-hash sha256:efa49231e4ffd836ff996921741c98ac4c5655dc729d7c32aa48c608232f0f08 \ --control-plane --certificate-key a64e9da7346153bd64dba1e5126a644a97fdb63c878bb73de07911d1add8e26b
—END—