本次演示从集群中安全地删除一个节点,节点删除之后,该节点上的任务会自动转移到其他节点。

查看当前集群的节点信息

[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready etcd,master 17d v1.18.3
k8s-node1 Ready etcd,worker 15d v1.18.3
k8s-node2 Ready etcd,worker 15d v1.18.3
k8s-node3 Ready worker 4d19h v1.18.3

使用kubectl命令删除node节点

[root@k8s-master ~]# kubectl delete node k8s-node3
node "k8s-node3" deleted
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready etcd,master 17d v1.18.3
k8s-node1 Ready etcd,worker 15d v1.18.3
k8s-node2 Ready etcd,worker 15d v1.18.3

停止调度节点

将节点标记为不可调度可防止调度程序将新的 Pod 放置到该节点上,同时不会影响该节点上的现有 Pod。作为节点重启或者其他维护之前的准备步骤,这十分有用。

找到想要从集群中删除的节点,点击停止调度。或者,直接执行命令 ​kubectl cordon $NODENAME

被删除节点的资源会自动分布的其他活动的节点上面。

在node节点上彻底删除集群信息

** 该部分在k8s-node03节点上进行操作 **
删除kube-controller-manager 为k8s-node03节点生成的kubeconfig 文件和公私钥:

//删除kubelet.kubeconfig 
[root@k8s-node3 ~]# cd /opt/kubernetes/cfg/
[root@k8s-node3 cfg]# ls
bootstrap.kubeconfig kube-controller-manager.conf kubelet-config.yml kube-proxy.conf kube-proxy.kubeconfig token.csv
kube-apiserver.conf kubelet.conf kubelet.kubeconfig kube-proxy-config.yml kube-scheduler.conf
[root@k8s-node3 cfg]# rm -rf kubelet.kubeconfig


//删除kubelet证书
[root@k8s-node3 ~]# rm -rf /opt/kubernetes/ssl/kubelet*

node节点停止相关服务

[root@k8s-node3 ~]# systemctl stop kubelet  docker kube-proxy
[root@k8s-node3 ~]# systemctl disable kubelet docker kube-proxy

此时,k8s-node03节点相关服务已经从集群中彻底删除,且设置成开机不自动启动。等待资源被重新分配到其他活动节点即可。

清除kube-proxy 和 docker 创建的 iptables

这步如果不执行的话,可能会出现使用被删除节点的ip也能访问集群的情况

[root@node04 ~]# iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat

 新增加Worker Node 


在master节点将Worker Node涉及文件拷贝到新节点

[root@k8s-master ~]# scp -r /opt/kubernetes root@192.168.111.6:/opt/


[root@k8s-master ~]# scp -r /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@192.168.111.6:/usr/lib/systemd/system


[root@k8s-master ~]# scp -r /opt/cni/ root@192.168.111.6:/opt/

在新的worker节点上删除kubelet证书和kubeconfig文件

[root@k8s-node3 ~]#rm -rf /opt/kubernetes/cfg/kubelet.kubeconfig 

[root@k8s-node3 ~]#rm -rf /opt/kubernetes/ssl/kubelet*

这几个文件是证书申请审批后自动生成的,每个Node不同,必须删除重新生成。

修改主机名

[root@k8s-node3 ~]# vim /opt/kubernetes/cfg/kubelet.conf
--hostname-override=k8s-node1

[root@k8s-node3 ~]# vim /opt/kubernetes/cfg/kube-proxy-config.yml
hostnameOverride: k8s-node3

 启动并设置开机启动

systemctl daemon-reload
systemctl start kubelet
systemctl enable kubelet
systemctl start kube-proxy
systemctl enable kube-proxy

 在Master上批准新Node kubelet证书申请

kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
node-csr-4zTjsaVSrhuyhIGqsefxzVoZDCNKei-aE2jyTP81Uro 89s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending

kubectl certificate approve node-csr-4zTjsaVSrhuyhIGqsefxzVoZDCNKei-aE2jyTP81Uro