书籍来源:《CKA/CKAD应试指南:从Docker到Kubernetes完全攻略》
一边学习一边整理老师的课程内容及实验笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:CKA备考实验 | 汇总_热爱编程的通信人的博客-CSDN博客
job用于执行一次性任务,比如计算圆周率小数点后200位,运算完成之后就结束了,不用一直运算下去。当创建一个job后,这个job会创建一个pod去完成一个任务,如果pod执行成功了,则此job结束; 如果执行失败,则会新创建一个pod或者重启pod,再次去执行任务。
为了看起来不那么乱,单独创建一个命名空间nsjob,并切换至此命名空间。
##########实操验证##########
[root@vms10 probe]# kubectl create ns nsjob
namespace/nsjob created
[root@vms10 probe]# kubens nsjob
Context "kubernetes-admin@kubernetes" modified.
Active namespace is "nsjob".
[root@vms10 probe]#
把本章所需要的文件全部放在一个单独的目录jobs里,创建jobs目录并进入。
##########实操验证##########
[root@vms10 ~]# mkdir jobs
[root@vms10 ~]# cd jobs/
[root@vms10 jobs]#
创建job
既可以通过命令行的方式创建job,也可以通过yaml文件的力式创建job,建议用命令行的方式生成yaml文件,然后在其基础上进行修改。
命令行创建job的语法如下。
kubectl create job 名字 --image=镜像 -- "命令"
先创建一个名字叫job1的job,所使用的镜像是busybox,此任务里执行命令为"echo hello ; sleep 10"。
步骤1:用命令行创建一个job的yaml文件job1.yaml。
##########实操验证##########
[root@vms10 jobs]# kubectl create job job1 --image=busybox --dry-run=client -o yaml -- sh -c "echo hello &&sleep 10" > job1.yaml
[root@vms10 jobs]#
由此job创建出来的pod,里面运行的是如下命令:先执行echo hello,之后等待10s。整个pod的运行时间就是10s。
步骤2:对刚刚生成的job1.yaml做适当的修改,内容如下。
##########实操验证##########
[root@vms10 jobs]# cat job1.yaml
apiVersion: batch/v1
kind: Job
metadata:
creationTimestamp: null
name: job1
spec:
template:
metadata:
creationTimestamp: null
spec:
containers:
- command:
- sh
- -c
- echo hello &&sleep 10
image: busybox
imagePullPolicy: IfNotPresent
name: job1
resources: {}
restartPolicy: Never
status: {}
[root@vms10 jobs]#
这里imagePullPolicy: IfNotPresent是手动加上去的,注意这里的重启策略。
job的restart策略只能是以下2种。
(1)Never:只要任务没有完成,则新创建pod运行,直到job完成,会产生多个pod。
(2)OnFailure:只要pod没有完成,就会重启pod,重新执行任务。
前面讲pod时,介绍过pod有3种重启策略,但是在job里没有Always这种重启策略。
步骤3:创建job。
##########实操验证##########
[root@vms10 jobs]# kubectl apply -f job1.yaml
job.batch/job1 created
[root@vms10 jobs]#
步骤4:查看pod状况。
##########实操验证##########
kubectl get pods
NAME READY STATUS RESTARTS AGE
job1-4dzjq 1/1 Running 0 5s
[root@vms10 jobs]#
这个pod里的进程只会运行10s,到第11s的时候进程结束,则pod也运行完毕。
步骤5:查看job的运行状态。
##########实操验证##########
[root@vms10 jobs]# kubectl get pods
NAME READY STATUS RESTARTS AGE
job1-4dzjq 0/1 Completed 0 14s
[root@vms10 jobs]#
在COMPLETIONS列看到的是0/1,说明此job需要正确地完成一次,因为pod正在运行,即任务还没有完成,所以能看到0/1。
步骤6:再次查看pod状况。
##########实操验证##########
[root@vms10 jobs]# kubectl get pods
NAME READY STATUS RESTARTS AGE
job1-4dzjq 0/1 Completed 0 76s
[root@vms10 jobs]#
因为这里pod中的进程已经正常运行完毕了,状态为Completed。
步骤7:查看job的运行状态。
##########实操验证##########
[root@vms10 jobs]# kubectl get jobs
NAME COMPLETIONS DURATION AGE
job1 1/1 12s 96s
[root@vms10 jobs]#
这里说明,job1需要完成一次,且pod的任务也正确完成了,所以这里显示1/1。
步骤8:删除job1。
##########实操验证##########
[root@vms10 jobs]# kubectl delete -f job1.yaml
job.batch "job1" deleted
[root@vms10 jobs]#
在job中指定参数
因为job所创建出来的d,其里面的进程是一次性的任务。执行完之后pod就结束了,没有必要一直执行。所以job正确结束之后所创建的pod状态必须要是Completed。
如果job所创建的pod里的进程因为种种原因没有正确执行,就意味着任务没有正确完成,那么就要重复去执行,直到任务完成,即出现状态为Completed的pod。
这里说的job没有正确执行需要重复去执行,到底是通过重启pod还是新创建pod的方式来重新执行任务,就要看在job里所设置的重启策略了。
对于一些任务而言,测试一次成功了,不能算成功,需要测试多次且都成功了,才算是成功。那么可以在定义job时指定相关的参数。
在job的yaml文件里还可以指定以下几个参数。
(1)parallelism:N,并行运行N个pod。
(2)completion:M,job测试多次的话,要有M次要成功才算成功,即要有M个状态为Completed的pod,如果没有就重复执行。
(3)backoffLimit:N,如果job失败,则重试几次。(注:重试时如果并行创建2个pod,则算是重复2次,有时创建的pod会被自动删除。比如总共创建了5个pod,然后自动删除了了2个,我们最终看到的pod数为3,所以不能以最终的pod数计算重试的次数)
这里parallelism的值指的是一次性运行几个pod,这个值不会超过completions的值。
(4)activeDeadlineSeconds:N,job运行的最长时间,单位是秒,超过这个时间不管job有没有完成都会被终止,没完成的pod也会被强制删除,也不会再产生新的pod。
步骤1:修改job1.yaml的内容如下。
##########实操验证##########
[root@vms10 jobs]# cat job1.yaml
apiVersion: batch/v1
kind: Job
metadata:
creationTimestamp: null
name: job1
spec:
parallelism: 3
completions: 6
backoffLimit: 4
template:
metadata:
creationTimestamp: null
spec:
containers:
- command:
- sh
- -c
- echo hello &&sleep 10
image: busybox
imagePullPolicy: IfNotPresent
name: job1
resources: {}
restartPolicy: Never
status: {}
[root@vms10 jobs]#
这里并行设置为3个,要有6个pod处于完成状态才可以。
步骤2:创建job1。
##########实操验证##########
[root@vms10 jobs]# kubectl apply -f job1.yaml
job.batch/job1 created
[root@vms10 jobs]#
步骤3:查看pod的运行状态。
##########实操验证##########
[root@vms10 jobs]# kubectl get pods
NAME READY STATUS RESTARTS AGE
job1-4rlbq 1/1 Running 0 7s
job1-m5zxq 1/1 Running 0 7s
job1-x8ps8 1/1 Running 0 7s
[root@vms10 jobs]#
这里一共运行了3个pod,因为我们加了参数parallelism: 3。
步骤4:查看job的运行状态。
##########实操验证##########
[root@vms10 jobs]# kubectl get jobs
NAME COMPLETIONS DURATION AGE
job1 0/6 2s 2s
[root@vms10 jobs]#
因为指定了参数completions: 6,即需要job完成6次,但是现在有3个正在运行,还没有pod执行完成,所以看到的结果是0/6。
步骤5:再次查看pod的运行状态。
##########实操验证##########
[root@vms10 jobs]# kubectl get pods
NAME READY STATUS RESTARTS AGE
job1-49b4q 0/1 Completed 0 16s
job1-c4gzh 1/1 Running 0 4s
job1-dz6l6 1/1 Running 0 4s
job1-hdqqs 0/1 Completed 0 16s
job1-hrnct 0/1 ContainerCreating 0 1s
job1-vsw5x 0/1 Completed 0 16s
[root@vms10 jobs]#
因为pod里的运行时间是10s,所以现在有3个pod已经运行完毕了,然后再次开启3个pod(因为需要6个,每次运行3个)。
步骤6:再次看下job的运行状态。
##########实操验证##########
[root@vms10 jobs]# kubectl get jobs
NAME COMPLETIONS DURATION AGE
job1 5/6 28s 28s
[root@vms10 jobs]#
可以看到,job需要完成6次,这里已经完成了3个,所以显示的是3/6。
步骤7:等一会之后,再次查看pod的状态。
##########实操验证##########
[root@vms10 jobs]# kubectl get pods
NAME READY STATUS RESTARTS AGE
job1-49b4q 0/1 Completed 0 2m6s
job1-c4gzh 0/1 Completed 0 114s
job1-dz6l6 0/1 Completed 0 114s
job1-hdqqs 0/1 Completed 0 2m6s
job1-hrnct 0/1 Completed 0 111s
job1-vsw5x 0/1 Completed 0 2m6s
[root@vms10 jobs]#
这里6个pod已经全部运行完毕了,不再产生新的pod,因为completions:6这个条件已经满足了。
步骤8:查看job的运行状态。
##########实操验证##########
[root@vms10 jobs]# kubectl get jobs
NAME COMPLETIONS DURATION AGE
job1 6/6 30s 30s
[root@vms10 jobs]#
这里已经显示为6/6,意思是此job需要完成6次,现在也已经正确地完成了。
步骤9:删除此job。
##########实操验证##########
[root@vms10 jobs]# kubectl delete -f job1.yaml
job.batch "job1" deleted
[root@vms10 jobs]#
步骤10:修改pod1.yaml的内容如下。
##########实操验证##########
[root@vms10 jobs]# cat job1.yaml
apiVersion: batch/v1
kind: Job
metadata:
creationTimestamp: null
name: job1
spec:
parallelism: 3
completions: 6
backoffLimit: 3
template:
metadata:
creationTimestamp: null
spec:
containers:
- command:
- sh
- -c
- echoX hello &&sleep 10
image: busybox
imagePullPolicy: IfNotPresent
name: job1
resources: {}
restartPolicy: Never
status: {}
[root@vms10 jobs]#
这里把容器里的命令误写成了echoX,此容器是不能正确执行的,因为这里重启策略设置的是Never,所以需要重复创建pod来执行此job。
##########实操验证##########
[root@vms10 jobs]# kubectl get pods
NAME READY STATUS RESTARTS AGE
job1-6vczq 0/1 Error 0 18s
job1-chjlv 0/1 Error 0 16s
job1-hmqct 0/1 Error 0 18s
job1-pnxgd 0/1 Error 0 18s
job1-s46j4 0/1 Error 0 16s
[root@vms10 jobs]#
如果这里重启策略设置的是OnFailure,则不是通过创建pod来解决失败的问题,而是通过重启来解决问题。
步骤11:删除此job。
##########实操验证##########
[root@vms10 jobs]# kubectl delete -f job1.yaml
job.batch "job1" deleted
[root@vms10 jobs]#
练习:计算圆周率小数点后2000位
前面讲了如何使用job做一次性任务,那么下面练习一下如何使用job计算圆周率小数点后2000位。
##########实操验证##########
[root@vms10 jobs]# kubectl create job job2 --image=perl -- perl -Mbignum=bpi -wle 'print bpi(1000)'
job.batch/job2 created
[root@vms10 jobs]#
注意:这里perl -Mbignum=bpi -wle 'print bpi(2000)'是perl里的命令,不是k8s内容,大家知道即可。
查看pod的运行状况。
##########实操验证##########
[root@vms10 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
job2-wpvpj 0/1 Completed 0 10s
[root@vms10 ~]#
现在还是正在运行的,稍等一会之后,再次查看。
##########实操验证##########
[root@vms10 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
job2-wpvpj 0/1 Completed 0 10s
[root@vms10 ~]#
查看下pod里的输出。
##########实操验证##########
[root@vms10 ~]# kubectl logs job2-wpvpj
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420199
[root@vms10 ~]#