书籍来源:《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]#