一个计算机技术爱好者与学习者

0%

好好学K8S:kubeadm重新添加master节点

1. 需求描述

一些情况下,我们需要先把某个master节点从k8s集群中摘除掉,进行某些操作之后再加入到集群。
或者,我们需要先把某个master节点从k8s集群中摘除掉,然后把这个节点加入到另外一个k8s集群。

本文中,我们就来研究一下从k8s集群中摘除一个master节点再重新加入集群的方法。(worker节点太简单,不再单独讨论)

2. 思路

1、禁止调度&驱逐pod
2、k8s集群层面删除节点
3、kubeadm reset还原配置
4、kubeadm join加入集群

3. 具体操作

以master-0为例,方便进行描述。

3.1. 禁止调度&驱逐pod

1
kubectl drain master-0 --ignore-daemonsets

驱逐master-0节点上的pod,附带效果禁止调度。

3.2. 删除节点

1
kubectl delete nodes master-0

把master-0节点从集群中删除。

3.3. 还原kubeadm的更改

master-0节点上执行:

1
sudo kubeadm reset

可以还原通过 kubeadm init 或者 kubeadm join 操作对master-0主机所作的更改。

执行后,master-0基本还原到了执行kubeadm init之前的状态。
kubelet数据被清除了,etcd数据也被清除了。

如果是外部的etcd,那么kubeadm reset不会删除 etcd 中的数据,可以使用etcd客户端清理

1
etcdctl del "" --prefix

详情参考kubeadm reset

3.4. 移除节点etcd member

虽然通过kubeadm reset清理了etcd的数据,但是,etcd集群里依然有这个节点的信息。
因此,需要移除master-0节点的etcd member,否则再次加入k8s集群时时会卡在 [check-etcd] 这个步骤。

1、查看etcd版本,安装对应版本的etcdctl

1
2
3
4
5
6
sudo cat /etc/kubernetes/manifests/etcd.yaml | grep image
wget https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gz
tar -xzvf etcd-v3.5.0-linux-amd64.tar.gz
sudo cp etcd-v3.5.0-linux-amd64/etcdctl /usr/local/bin
sudo chmod a+x /usr/local/bin/etcdctl
sudo ln -s /usr/local/bin/etcdctl /usr/bin/

2、查看etcd节点状态

1
2
sudo etcdctl  --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key member list
sudo etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key --endpoints="https://192.168.56.101:2379,https://192.168.56.102:2379,https://192.168.56.103:2379" endpoint health

3、删除master-0节点

1
sudo etcdctl  --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key member remove xxxxx

3.5. 加入k8s集群

1、使用另外的master节点(例如master-1)生成新的join命令和certificates

1
2
3
sudo kubeadm token list
sudo kubeadm token create --print-join-command
sudo kubeadm init phase upload-certs --upload-certs

2、master-0加入k8s集群

1
2
3
sudo kubeadm join 192.168.56.200:9443 --token xxxxxx.xxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxx \
--control-plane --certificate-key xxxxx

3、查看集群状态

1
2
kubectl get nodes
kubectl get pods --all-namespaces