Kubernetes集群升级etcd故障处理

Posted by     "Pyker" on Saturday, September 28, 2019

TOC

1. 升级

将需要的升级到指定版本的k8s镜像传送到相应节点上,然后在任何一个master节点运行下面的命令即可完成升级。

$ yum install -y kubeadm=1.18.3 kubectl=1.18.3 kubelet=1.18.3
$ kubeadm config images list # 列出新版本需要的镜像,然后拉取。
$ kubeadm upgrade apply v1.18.3

2. 扩容

在当前的集群中新增节点:

2.1. 重新创建certificate key和token

$ sudo kubeadm init phase upload-certs --upload-certs

### Got:
# [upload-certs] Using certificate key:
# 2ffe5bbf7d2e670d5bcfb03dac194e2f21eb9715f2099c5f8574e4ba7679ff78

# Add certificate-key for Multi Master Node.
$ kubeadm token create --print-join-command --certificate-key 2ffe5bbf7d2e670d5bcfb03dac194e2f21eb9715f2099c5f8574e4ba7679ff78

2.2. 增加Worker节点:

$ kubeadm join 192.168.199.173:6443 --token rlxvkn.2ine1loolri50tzt 
    --discovery-token-ca-cert-hash sha256:86e68de8febb844ab8f015f6af4526d78a980d9cdcf7863eebb05b17c24b9383

2.3. 增加master节点:

$ kubeadm join 192.168.199.173:6443 --token rlxvkn.2ine1loolri50tzt 
    --discovery-token-ca-cert-hash sha256:86e68de8febb844ab8f015f6af4526d78a980d9cdcf7863eebb05b17c24b9383 
    --control-plane --certificate-key 440a880086e7e9cbbcebbd7924e6a9562d77ee8de7e0ec63511436f2467f7dde

3. 节点重新加入

如果因为维护等操作,将节点踢出了k8s集群的话,再重新加入执行上面扩容步骤即可。但是如果你维护的节点是etcd节点的话。那么在重新加入前必须做以下操作,不然执行kubeadm join xxx会卡在[check-etcd] Checking that the etcd cluster is healthy

下面开始:

# 查看是etcd 节点的master信息
$ kubectl describe configmaps kubeadm-config -n kube-system

可也看到 剔除出去的 节点信息还存在与 kubeadm 配置中,说明 etcd 中还存储着该节点相关信息。

# 进入任意一个etcd pod,通过 kubectl 工具进入 pod 内部
$ kubectl get pods -n kube-system | grep etcd
$ kubectl exec -it etcd-k8s-master-2 -n kube-system -- sh

进入容器后,按下面步执行

#
$ 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'
## 查看 etcd 集群成员列表
$ 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

## 删除 etcd 集群成员 k8s-master-2-11
$ etcdctl member remove 63bfe05c4646fb08

Member 63bfe05c4646fb08 removed from cluster ed984b9o8w35cap2

## 再次查看 etcd 集群成员列表
$ 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

然后尝试加入 kubernetes 集群:

如果你之前kubeadm init操作失败了,记得执行kubeadm reset

$ kubeadm join 192.168.199.173:6443 --token rlxvkn.2ine1loolri50tzt 
    --discovery-token-ca-cert-hash sha256:86e68de8febb844ab8f015f6af4526d78a980d9cdcf7863eebb05b17c24b9383 
    --control-plane --certificate-key 440a880086e7e9cbbcebbd7924e6a9562d77ee8de7e0ec63511436f2467f7dde

4. 分析问题所在及解决方案

因为集群是通过 kubeadm 工具搭建的,且使用了 etcd 镜像方式与 master 节点一起,所以每个 Master 节点上都会存在一个 etcd 容器实例。当剔除一个 master 节点时 etcd 集群未删除剔除的节点的 etcd 成员信息,该信息还存在 etcd 集群列表中。

「真诚赞赏,手留余香」

云原生与运维

真诚赞赏,手留余香

使用微信扫描二维码完成支付


comments powered by Disqus