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 | sudo cat /etc/kubernetes/manifests/etcd.yaml | grep image |
2、查看etcd节点状态
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 list |
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 | sudo kubeadm token list |
2、master-0加入k8s集群
1 | sudo kubeadm join 192.168.56.200:9443 --token xxxxxx.xxxxxx \ |
3、查看集群状态
1 | kubectl get nodes |