CKA备考实验 | 节点的cordon与drain

本文详细介绍了如何在Kubernetes中使用Cordon和Drain命令将节点标记为不可调度,以及这两个操作的区别。Cordon只阻止新Pod调度到节点,而Drain会驱逐节点上的所有Pod。在维护节点时,Drain是一个更全面的选择,因为它同时处理了现有Pod。
摘要由CSDN通过智能技术生成

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

一边学习一边整理老师的课程内容及实验笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:CKA备考实验 | 汇总_热爱编程的通信人的博客-CSDN博客


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

节点的cordon

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

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

##########实操验证##########
[root@vms10 pod]#    kubectl get nodes
NAME            STATUS   ROLES    AGE     VERSION
vms10.rhce.cc   Ready    master   4d17h   v1.21.1
vms11.rhce.cc   Ready    <none>   4d17h   v1.21.1
vms12.rhce.cc   Ready    <none>   4d17h   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                     READY   STATUS    RESTARTS   AGE   IP             NODE            NOMINATED NODE   READINESS GATES
nginx-7cf7d6dbc8-ldkwk   1/1     Running   0          21s   10.244.81.77   vms11.rhce.cc   <none>           <none>
nginx-7cf7d6dbc8-mrbl7   1/1     Running   0          21s   10.244.14.8    vms12.rhce.cc   <none>           <none>
nginx-7cf7d6dbc8-ppgxh   1/1     Running   0          21s   10.244.81.78   vms11.rhce.cc   <none>           <none>
[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   4d17h   v1.21.1
vms11.rhce.cc   Ready,SchedulingDisabled   <none>   4d17h   v1.21.1
vms12.rhce.cc   Ready                      <none>   4d17h   v1.21.1
[root@vms10 pod]#

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

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

##########实操验证##########
[root@vms10 pod]# kubectl scale deployment nginx --replicas=6
deployment.apps/nginx scaled
[root@vms10 pod]#

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

##########实操验证##########
[root@vms10 pod]# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE    IP             NODE            NOMINATED NODE   READINESS GATES
nginx-7cf7d6dbc8-6pjwm   1/1     Running   0          4m5s   10.244.14.9    vms12.rhce.cc   <none>           <none>
nginx-7cf7d6dbc8-9cmnr   1/1     Running   0          26s    10.244.14.12   vms12.rhce.cc   <none>           <none>
nginx-7cf7d6dbc8-ldkwk   1/1     Running   0          8m9s   10.244.81.77   vms11.rhce.cc   <none>           <none>
nginx-7cf7d6dbc8-mrbl7   1/1     Running   0          8m9s   10.244.14.8    vms12.rhce.cc   <none>           <none>
nginx-7cf7d6dbc8-ppgxh   1/1     Running   0          8m9s   10.244.81.78   vms11.rhce.cc   <none>           <none>
nginx-7cf7d6dbc8-vbslh   1/1     Running   0          4m5s   10.244.14.10   vms12.rhce.cc   <none>           <none>
[root@vms10 pod]#

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

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

##########实操验证##########
[root@vms10 pod]# kubectl delete pod nginx-7cf7d6dbc8-ldkwk
pod "nginx-7cf7d6dbc8-ldkwk" deleted
[root@vms10 pod]# kubectl delete pod nginx-7cf7d6dbc8-ppgxh
pod "nginx-7cf7d6dbc8-ppgxh" deleted
[root@vms10 pod]#

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

##########实操验证##########
[root@vms10 pod]# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE    IP             NODE            NOMINATED NODE   READINESS GATES
nginx-7cf7d6dbc8-6pjwm   1/1     Running   0          5m1s   10.244.14.9    vms12.rhce.cc   <none>           <none>
nginx-7cf7d6dbc8-9cmnr   1/1     Running   0          82s    10.244.14.12   vms12.rhce.cc   <none>           <none>
nginx-7cf7d6dbc8-mrbl7   1/1     Running   0          9m5s   10.244.14.8    vms12.rhce.cc   <none>           <none>
nginx-7cf7d6dbc8-n2pf6   1/1     Running   0          33s    10.244.14.13   vms12.rhce.cc   <none>           <none>
nginx-7cf7d6dbc8-n59qp   1/1     Running   0          21s    10.244.14.14   vms12.rhce.cc   <none>           <none>
nginx-7cf7d6dbc8-vbslh   1/1     Running   0          5m1s   10.244.14.10   vms12.rhce.cc   <none>           <none>
[root@vms10 pod]#

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

注意:这里用到了控制器deployment,关于deployment如何管理pod,后面的章节会讲。

步骤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   4d17h   v1.21.1
vms11.rhce.cc   Ready    <none>   4d17h   v1.21.1
vms12.rhce.cc   Ready    <none>   4d17h   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]#

节点的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-7cf7d6dbc8-28ccn   1/1   Running   0     35s   10.244.81.80   vms11.rhce.cc   <none>   <none>
nginx-7cf7d6dbc8-dm9r7   1/1   Running   0     35s   10.244.14.16   vms12.rhce.cc   <none>   <none>
nginx-7cf7d6dbc8-hbdcb   1/1   Running   0     35s   10.244.81.79   vms11.rhce.cc   <none>   <none>
nginx-7cf7d6dbc8-mrdww   1/1   Running   0     35s   10.244.14.15   vms12.rhce.cc   <none>   <none>
[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: cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-system/calico-node-jgj2s, kube-system/kube-proxy-tcjt6
[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   4d17h   v1.21.1
vms11.rhce.cc   Ready                      <none>   4d17h   v1.21.1
vms12.rhce.cc   Ready,SchedulingDisabled   <none>   4d17h   v1.21.1
[root@vms10 pod]#

提示:可以用--ignore-daemonsets选项忽略由daemonset控制的pod。

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

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

注意:取消drain仍然是用的uncordon,没有undrain操作。

步骤5:查看节点状态。

##########实操验证##########
[root@vms10 pod]# kubectl get nodes
NAME            STATUS   ROLES    AGE     VERSION
vms10.rhce.cc   Ready    master   4d17h   v1.21.1
vms11.rhce.cc   Ready    <none>   4d17h   v1.21.1
vms12.rhce.cc   Ready    <none>   4d17h   v1.21.1
[root@vms10 pod]#

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

##########实操验证##########
[root@vms10 pod]# kubectl drain vms12.rhce.cc --ignore-daemonsets --delete-local-data
Flag --delete-local-data has been deprecated, This option is deprecated and will be deleted. Use --delete-emptydir-data.
node/vms12.rhce.cc cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-jgj2s, kube-system/kube-proxy-tcjt6
evicting pod kube-system/calico-kube-controllers-7cc8dd57d9-2rzpg
evicting pod default/nginx-7cf7d6dbc8-dm9r7
evicting pod default/nginx-7cf7d6dbc8-mrdww
pod/nginx-7cf7d6dbc8-dm9r7 evicted
pod/calico-kube-controllers-7cc8dd57d9-2rzpg evicted
pod/nginx-7cf7d6dbc8-mrdww 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   4d17h   v1.21.1
vms11.rhce.cc   Ready                      <none>   4d17h   v1.21.1
vms12.rhce.cc   Ready,SchedulingDisabled   <none>   4d17h   v1.21.1
[root@vms10 pod]#

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

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

##########实操验证##########
[root@vms10 pod]# kubectl get pods -o wide --no-headers
nginx-7cf7d6dbc8-28ccn   1/1   Running   0     5m16s   10.244.81.80   vms11.rhce.cc   <none>   <none>
nginx-7cf7d6dbc8-bwckp   1/1   Running   0     53s     10.244.81.81   vms11.rhce.cc   <none>   <none>
nginx-7cf7d6dbc8-hbdcb   1/1   Running   0     5m16s   10.244.81.79   vms11.rhce.cc   <none>   <none>
nginx-7cf7d6dbc8-w4sdm   1/1   Running   0     53s     10.244.81.82   vms11.rhce.cc   <none>   <none>
[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]#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值