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