此三个命令都会使node停止被调度,后期创建的pod不会继续被调度到该节点上,但操作的暴力程度不一

cordon 停止调度
影响最小,只会将node调为SchedulingDisabled
之后再发创建pod,不会被调度到该节点
旧有的pod不会受到影响,仍正常对外提供服务

恢复调度
kubectl uncordon node_name
================================================
drain 驱逐节点
首先,驱逐node上的pod,其他节点重新创建
接着,将节点调为** SchedulingDisabled**

恢复调度
kubectl uncordon node_name

对节点执行维护操作之前(例如:内核升级,硬件维护等),您可以使用 kubectl drain 安全驱逐节点上面所有的 pod。
安全驱逐的方式将会允许 pod 里面的容器遵循指定的 PodDisruptionBudgets 执行优雅的中止。
注: 默认情况下,kubectl drain 会忽略那些不能杀死的系统类型的 pod,如果您想了解更多详细的内容,请参考kubectl drain

kubectl drain 返回成功表明所有的 pod (除了前面排除的那些)已经被安全驱逐(遵循期望优雅的中止期,并且没有违反任何应用程序级别的中断预算)。
然后,通过对物理机断电或者在云平台上删除节点所在的虚拟机,都能安全的将节点移除。

 
# 确定要排空的节点的名称

kubectl get nodes

# 查看获取pod名字

kubectl get po

# 命令node节点开始释放所有pod,并且不接收新的pod进程

kubectl drain [node-name] --force --ignore-daemonsets --delete-local-data

# 这时候把需要做的事情做一下。比如上面说的更改docker文件daemon.json或者说node节点故障需要进行的处理操作

要想彻底删除,kubectl uncordon是回复不了的,需要在node节点重启kubelet
kubectl delete node  k8s-node1

# 然后恢复node,恢复接收新的pod进程

kubectl uncordon [node-name]

 

================================================
delete 删除节点
首先,驱逐node上的pod,其他节点重新创建
然后,从master节点删除该node,master对其不可见,失去对其控制,master不可对其恢复

恢复调度,需进入node节点,重启kubelet
基于node的自注册功能,节点重新恢复使用
systemctl restart kubelet

delete是一个比较粗暴的命令,它会将被删node上的pod直接驱逐,由其他node创建(针对replicaset),然后将被删节点从master管理范围内移除,master对其失去管理控制,若想使node重归麾下,必须在node节点重启kubelet

================================================
drain的参数
--force
当一些pod不是经 ReplicationController, ReplicaSet, Job, DaemonSet 或者 StatefulSet 管理的时候
就需要用--force来强制执行 (例如:kube-proxy)
 
--ignore-daemonsets
无视DaemonSet管理下的Pod
 
--delete-local-data
如果有mount local volumn的pod,会强制杀掉该pod并把料清除掉
另外如果跟本身的配置讯息有冲突时,drain就不会执行

================================================

案例操作

查看
[root@localhost cfg]# kubectl get nodes
NAME          STATUS   ROLES    AGE   VERSION
10.10.3.167   Ready    <none>   25h   v1.18.8
10.10.3.170   Ready    <none>   14m   v1.18.8
查看
[root@localhost cfg]# kubectl get po --all-namespaces
NAMESPACE              NAME                                         READY   STATUS    RESTARTS   AGE
kube-system            coredns-654979db4b-5dgzj                     1/1     Running   0          22h
kube-system            coredns-654979db4b-5kzg4                     1/1     Running   0          22h
kubernetes-dashboard   dashboard-metrics-scraper-775b89678b-h89hl   1/1     Running   0          21h
kubernetes-dashboard   kubernetes-dashboard-66d54d4cd7-xxw95        1/1     Running   0          21h

删除
[root@localhost cfg]# kubectl drain 10.10.3.170 --force --ignore-daemonsets --delete-local-data
node/10.10.3.170 cordoned
node/10.10.3.170 drained

查看
[root@localhost cfg]# kubectl get nodes
NAME          STATUS                     ROLES    AGE   VERSION
10.10.3.167   Ready                      <none>   25h   v1.18.8
10.10.3.170   Ready,SchedulingDisabled   <none>   14m   v1.18.8

恢复
[root@localhost cfg]# kubectl uncordon 10.10.3.170
node/10.10.3.170 uncordoned
查看
[root@localhost cfg]# kubectl get nodes
NAME          STATUS   ROLES    AGE   VERSION
10.10.3.167   Ready    <none>   25h   v1.18.8
10.10.3.170   Ready    <none>   16m   v1.18.8


[root@localhost cfg]# kubectl drain 10.10.3.170 --force --ignore-daemonsets --delete-local-data
node/10.10.3.170 cordoned
node/10.10.3.170 drained
[root@localhost cfg]# kubectl get nodes
NAME          STATUS                     ROLES    AGE   VERSION
10.10.3.167   Ready                      <none>   25h   v1.18.8
10.10.3.170   Ready,SchedulingDisabled   <none>   17m   v1.18.8
彻底删除
[root@localhost cfg]# kubectl delete node  10.10.3.170
node "10.10.3.170" deleted
[root@localhost cfg]# kubectl get nodes
NAME          STATUS   ROLES    AGE   VERSION
10.10.3.167   Ready    <none>   25h   v1.18.8


查看csr信息
[root@localhost cfg]# kubectl get csr
NAME        AGE   SIGNERNAME                                    REQUESTOR           CONDITION
csr-8chpd   31m   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Approved,Issued
csr-b24ch   31m   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Approved,Issued


查看具体csr信息
[root@localhost cfg]# kubectl describe  csr csr-b24ch
Name:               csr-b24ch
Labels:             <none>
Annotations:        <none>
CreationTimestamp:  Tue, 09 Feb 2021 11:06:08 +0800
Requesting User:    kubelet-bootstrap
Signer:             kubernetes.io/kube-apiserver-client-kubelet
Status:             Approved,Issued
Subject:
         Common Name:    system:node:10.10.3.170 #CN:用户名
         Serial Number:  
         Organization:   system:nodes  #O:组
Events:  <none>

删除10.10.3.170的csr
[root@localhost cfg]# kubectl delete  csr csr-b24ch
certificatesigningrequest.certificates.k8s.io "csr-b24ch" deleted
[root@localhost cfg]# kubectl get csr
NAME        AGE   SIGNERNAME                                    REQUESTOR           CONDITION
csr-8chpd   32m   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Approved,Issued

在node节点上面 

删除证书,只留下ca.pem根证书 会重新生成证书的

rm -rf ../ssl/{kubelet-client-2021-02-09-11-17-58.pem  kubelet-client-current.pem kubelet.crt kubelet.key}
systemctl restart kubelet kube-proxy

 master节点  我的是master(kube-controller-manager起作用的--feature-gates=RotateKubeletServerCertificate=true)自动批准node节点的  不需要  kubectl certificate approve 操作,细节文章https://blog.csdn.net/Michaelwubo/article/details/108256764 

[root@localhost ~]# kubectl get nodes
NAME          STATUS   ROLES    AGE     VERSION
10.10.3.167   Ready    <none>   25h     v1.18.8
10.10.3.170   Ready    <none>   3m15s   v1.18.8

 

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐