Kubernetes认证考试自学系列 | 节点的cordon与drain

书籍来源:《CKA/CKAD应试指南:从Docker到Kubernetes完全攻略》

一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:Kubernetes认证考试自学系列 | 汇总_COCOgsta的博客-CSDN博客


如果想把某个节点设置为不可用的话,可以对节点实施cordon或drain操作,这样节点就会被标记为SchedulingDisabled,新创建的pod就不会再分配到这些节点上了。

5.7.1 节点的cordon

如果某个节点要进行维护,希望此节点不再被分配pod,那么可以使用cordon把此节点标记为不可调度,但是运行在此节点上的pod依然会运行在此节点上。

步骤1:查看现有节点信息。

[root@vms10 pod]# kubectl get nodes
NAME             STATUS   ROLES    AGE    VERSION 
vms10.rhce.cc     Ready   master   30h    v1.21.1
vms11.rhce.cc     Ready   <none>   30h    v1.21.1
vms12.rhce.cc     Ready   <none>   30h    v1.21.1
[root@vms10 pod]#

所有状态都是Ready,也就是说现在都是可以调度的。

步骤2:创建一个deployment测试。

[root@vms10 pod]# kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > d1.yaml 
[root@vms10 pod]#

步骤3:修改d1.yaml里的replicas的值为3,并将镜像下载策略设置为IfNotPresent:,内容如下。

[root@vms10 pod]# cat d1.yaml
apiVersion: apps/v1
kind: Deployment 
metadata:
  creationTimestamp: null
  labels:
    app: nginx 
  name: nginx 
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx 
  strategy: {}
  template:
    metadata:
      creationTimestamp: null 
      labels:
        app: nginx 
    spec:
      containers: 
      - image: nginx 
        imagePullPolicy: IfNotPresent 
        name: nginx 
        resources: {}
status: {}
[root@vms10 pod]#

步骤4:应用此文件创建deployment。

[root@vms10 pod]# kubectl apply -f d1.yaml 
deployment.apps/nginx created 
[root@vms10 pod]#

步骤5:查看pod运行情况。

[root@vms10 pod]# kubectl get pods -o wide 
NAME                      STATUS       RESTARTS     AGE     IP          NODE 
nginx-5957f949fc-bwz6n     1/1      Running     0   33s  10.244.14.36  vms12.rhce.cc 
nginx-5957f949fc-ncs7n     1/1      Running     0   33s  10.244.14.32  vms12.rhce.cc 
nginx-5957f949fc-s6zhh     1/1      Running     0   33s  10.244.81.93  vms11.rhce.cc 
[root@vms10 pod]#

可以看到3个pod被分配到vms11和vms12两个节点上了。

步骤6:现在通过cordon把vms11标记为不可用。

[root@vms10 pod]# kubectl cordon vms11.rhce.cc 
node/vms11.rhce.cc cordoned
[root@vms10 pod]# 

步骤7:查看node的状态。

[root@vms10 pod]# kubectl get nodes
NAME            STATUS                      ROLES     AGE    VERSION
vms10.rhce.cc   Ready                       master    33h    v1.21.1
vms11.rhce.cc   Ready,SchedulingDisabled    <none>    33h    v1.21.1
vms12.rhce.cc   Ready                       <none>    33h    v1.21.1
[root@vms10 pod]#

可以看到此时vms11的状态为SchedulingDisabled,也就是不可用。

步骤8:扩展此deployment的副本数为6个(后面会讲,先跟着做)。

[root@vms10pod] #kubectl scale deployment nginx--replicas=6
deployment.apps/nginxscaled
[root@vms10pod] #

这个命令后面会讲到,然后再次查看pod的分布情况。

[root@vms10 pod]# kubectl get pods -o wide
NAME                    READY    STATUS    RESTARTS  AGE        IP          NODE 
nginx-5957f949fc-bwz6n   1/1     Running     0       6m6s  10.244.14.36 vms12.rhce.cc
nginx-5957f949fc-dbslq   1/1     Running     0       38s   10.244.14.37 vms12.rhce.cc
nginx-5957f949fc-ncs7n   1/1     Running     0       6m6s  10.244.14.32 vms12.rhce.cc
nginx-5957f949fc-s6zhh   1/1     Running     0       7m47s 10.244.81.93 vms11.rhce.cc
nginx-5957f949fc-s7h7l   1/1     Running     0       38s   10.244.14.35 vms12.rhce.cc
nginx-5957f949fc-w74c4   1/1     Running     0       38s   10.244.14.39 vms12.rhce.cc
[root@vms10 pod]#

可以看到新创建的pod(时间为38s的那3个pod)只会分布到vms12节点上,不会再分配vms11节点,但是对原本已经分布到vms11的pod(这里是nginx-5957f949fc-s6zhh),还是继续在vms11上运行。

步骤9:删除vms11上运行的pod。

[root@vms10 pod]# kubectl delete pod nginx-5957f949fc-s6zhh 
pod "nginx-5957f949fc-s6zhh" deleted 
[root@vms10 pod]#

步骤10:查看pod的分布情况。

[root@vms10 pod]# kubectl get pods -o wide
NAME                    READY    STATUS    RESTARTS  AGE        IP          NODE 
nginx-5957f949fc-bwz6n   1/1     Running     0       10m   10.244.14.36 vms12.rhce.cc
nginx-5957f949fc-dbslq   1/1     Running     0      4m53s  10.244.14.37 vms12.rhce.cc
nginx-5957f949fc-mnc9p   1/1     Running     0       69s   10.244.14.43 vms12.rhce.cc
nginx-5957f949fc-ncs7n   1/1     Running     0       10m   10.244.14.32 vms12.rhce.cc
nginx-5957f949fc-s7h7l   1/1     Running     0      4m53s  10.244.14.35 vms12.rhce.cc
nginx-5957f949fc-w74c4   1/1     Running     0      4m53s  10.244.14.39 vms12.rhce.cc
[root@vms10 pod]#

可以看到新的pod也是在vms12上运行了。

步骤11:如果要恢复vms11,只要对vms11进行uncordon操作即可。

[root@vms10 pod]# kubectl uncordon vms11.rhce.cc 
node/vms11.rhce.cc uncordoned 
[root@vms10 pod]# 

步骤12:查看节点状态。

[root@vms10 pod]# kubectl get nodes 
NAME             STATUS    ROLES    AGE    VERSION 
vms10.rhce.cc    Ready     master   33h    v1.21.1
vms11.rhce.cc    Ready     <none>   33h    v1.21.1
vms12.rhce.cc    Ready     <none>   33h    v1.21.1
[root@vms10 pod]#

步骤13:把这个deployment的副本数设置为0。

[root@vms10 pod]# kubectl scale deploy nginx --replicas=0
deployment.apps/nginx scaled 
[root@vms10 pod]#

5.7.2 节点的drain

对节点的drain操作和对节点的cordon操作的作用是一样的,但是drain比cordon多了一个驱逐(evicted)的效果,即当我们对某节点进行drain操作的时候,不仅把此节点标记为不可调度,且会把上面正在运行的pod删除。

步骤1:使用前面的方法,把名字为nginx的deployment的副本数设置为4。

[root@vms10 pod]# kubectl scale deploy nginx --replicas=4
deployment.apps/nginx scaled 
[root@vms10 pod]#

步骤2:查看pod的运行状态。

[root@vms10 pod]# kubectl get pod -o wide --no-headers
nginx-5957f949fc-p6r8x   1/1    Running    0    30m    10.244.81.100  vms11.rhce.cc 
nginx-5957f949fc-rbxzm   1/1    Running    0    30m    10.244.81.101  vms11.rhce.cc 
nginx-5957f949fc-stllx   1/1    Running    0    30m    10.244.14.38   vms12.rhce.cc 
nginx-5957f949fc-wfhdl   1/1    Running    0    30m    10.244.81.102  vms11.rhce.cc
[root@vms10 pod]#

可以看到现在分别运行在两个节点上了,其中nginx-5957f949f-stllx是在vms12上运行的。

步骤3:现在对vms12进行drain操作。

[root@vms10 pod]# kubectl drain vms12.rhce.cc
node/vms12.rhce.cc cordoned 
error: unable to drain node "vms12.rhce.cc", aborting command...
There are pending nodes to be drained:
 vms12.rhce.cc
error: Daemonset-managed pods (use --ignore-daemon sets to ignore): ...
... 输出 ...      (use --delete-local-data to override)...
[root@vms10 pod]#

可以看到此操作有报错信息,因为在vms12上运行了一些由daemonset控制的pod,此时运行在vms12上的pod依然在vms12上运行,但是已经被标记为不可调度。

[root@vms10 pod]# kubectl get nodes
NAME             STATUS                   ROLES    AGE   VERSION
vms10.rhce.cc    Ready                    master   30h   v1.21.1
vms11.rhce.cc    Ready                    <none>   30h   v1.21.1
vms12.rhce.cc    Ready,SchedulingDsiable  <none>   30h   v1.21.1
[root@vms10 pod]#

步骤4:取消vms12的drain操作。

[root@vms10 pod]# kubectl uncordon vms12.rhce.cc
node/vms12.rhce.cc uncordoned
[root@vms10 pod]#

步骤5:查看节点状态。

[root@vms10 pod]# kubectl get nodes
NAME            STATUS   ROLES    AGE   VERSION 
vms10.rhce.cc   Ready    master   30h   v1.21.1
vms11.rhce.cc   Ready    <none>   30h   v1.21.1
vms12.rhce.cc   Ready    <none>   30h   v1.21.1
[root@vms10 pod]#

步骤6:再次对vms12进行drain操作。

[root@vms10 pod]# kubectl drain vms12.rhce.cc --ignore-daemonsets --delete-local-data
node/vms12.rhce.cc cordoned
WARNING: Ignoring DaemonSet-managed pods: calico-node-gxhmg, kube-proxy-h8t2h
pod/nginx-5957f949fc-stllx evicted 
node/vms12.rhce.cc evicted
[root@vms10 pod]#

此时vms12被标记为不可调度,且原来运行在vms12上的pod全部跑到vms11上了。

步骤7:查看节点状态。

[root@vms10 pod]# kubectl get nodes
NAME           STATUS                      ROLES    AGE     VERSION
vms10.rhce.cc  Ready                       master   33h     v1.21.1
vms11.rhce.cc  Ready                       <none>   33h     v1.21.1
vms12.rhce.cc  Ready, Scheduling Disabled  <none>   33h     v1.21.1
[root@vms10 pod]#

可以看到,vms12已经是SchedulingDisabled了。

步骤8:查看pod运行状态。

[root@vms10 pod]# kubectl get pods -o wide --no-headers
nginx-5957f949fc-58h7x   1/1   Running   0   105s   10.244.81.105   vms11.rhce.cc
nginx-5957f949fc-p6r8x   1/1   Running   0   34m    10.244.81.100   vms11.rhce.cc
nginx-5957f949fc-rbxzm   1/1   Running   0   34m    10.244.81.101   vms11.rhce.cc
nginx-5957f949fc-wfhdl   1/1   Running   0   34m    10.244.81.102   vms11.rhce.cc
[root@vms10 pod]#

上面ngix-5957f949fc-58h7x是新生成的pod,已经跑到vms11上了。

步骤9:取消drain操作。

[root@vms10 pod]# kubectl uncordon vms12.rhce.cc
node/vms12.rhce.cc uncordoned
[root@vms10 pod]#

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/130668035