十二、K8s job cronjob相关操作
实验环境:按照图示部署好了K8s集群,一个Master,两个worker nodes。什么时候需要job或cronjob:deployment能够保证pod的守护进程进程运行,如果有些时候并不希望守护进行一直运行(例如一次性测试),所以希望一种控制器控制pod完成一些一次性的作业,完成后不用重启。这种情况下就可以实验job或者cronjob来完成。一、job步骤1: 获取创建job的yaml文件模
实验环境:
按照图示部署好了K8s集群,一个Master,两个worker nodes。
什么时候需要job或cronjob:
deployment能够保证pod的守护进程进程运行,如果有些时候并不希望守护进行一直运行(例如一次性测试),所以希望一种控制器控制pod完成一些一次性的作业,完成后不用重启。这种情况下就可以实验job或者cronjob来完成。
一、job
步骤1: 获取创建job的yaml文件模板
kubectl create job job1 --image=busybox --dry-run=client -o yaml > job1.yaml
[root@vms201 jobs]# cat job1.yaml
apiVersion: batch/v1
kind: Job
metadata:
creationTimestamp: null
name: job1
spec:
template:
metadata:
creationTimestamp: null
spec:
containers:
- image: busybox
name: job1
resources: {}
restartPolicy: Never
status: {}
步骤2: 修改job的yaml文件,执行设定一次性任务(显示时间)
[root@vms201 jobs]# cat job1.yaml
apiVersion: batch/v1
kind: Job
metadata:
creationTimestamp: null
name: job1
spec:
template:
metadata:
creationTimestamp: null
spec:
terminationGracePeriodSeconds: 0
containers:
- command:
- sh
- -c
- data ; sleep 10
image: busybox
imagePullPolicy: IfNotPresent
name: job1
resources: {}
restartPolicy: Never
status: {}
应用并查看job:
[root@vms201 jobs]# kubectl apply -f job1.yaml
job.batch/job1 created
[root@vms201 jobs]# kubectl get job
NAME COMPLETIONS DURATION AGE
job1 0/1 10s 10s
[root@vms201 jobs]# kubectl get job
NAME COMPLETIONS DURATION AGE
job1 1/1 12s 20s
可以看到,在10s前,任务栏为0/1表示没有完成,10s后,任务栏为1/1,表示任务已经完成了。
可以查看pod进行检查:
[root@vms201 jobs]# kubectl get pods
NAME READY STATUS RESTARTS AGE
job1-vz5c6 0/1 Completed 0 104s
可以看到,其状态为Completed,表示pod运行完了,并没有重启。
步骤3: 删除job
[root@vms201 jobs]# kubectl delete jobs.batch job1
job.batch "job1" deleted
步骤4: 设置job选项
修改job的yaml文件:
[root@vms201 jobs]# cat job1.yaml
apiVersion: batch/v1
kind: Job
metadata:
creationTimestamp: null
name: job1
spec:
backoffLimit: 2
completions: 6
parallelism: 2
template:
metadata:
creationTimestamp: null
spec:
terminationGracePeriodSeconds: 0
containers:
- command:
- sh
- -c
- data ; sleep 10
image: busybox
imagePullPolicy: IfNotPresent
name: job1
resources: {}
restartPolicy: Never
status: {}
spec下选项解析:
- parallelism: N 一次性运行N个pod;
- completions: M job结束需要成功运行的Pod个数,即状态为Completed的pod数;
- backoffLimit: N 如果job失败,则重试几次。
这里parallelism的值指的是一次性运行几个pod,这个值不会超过completions的值。
job的restart策略:
- Nerver 只要任务没有完成,则是新创建pod运行,直到job完成会产生多个pod;
- OnFailure 只要pod没有完成,则会重启pod,直到job完成。
运行job:
[root@vms201 jobs]# kubectl apply -f job1.yaml
job.batch/job1 created
[root@vms201 jobs]# kubectl get jobs.batch job1
NAME COMPLETIONS DURATION AGE
job1 6/6 35s 50s
[root@vms201 jobs]# kubectl get pods
NAME READY STATUS RESTARTS AGE
job1-86qj7 0/1 Completed 0 2m12s
job1-bsrxk 0/1 Completed 0 2m36s
job1-h946w 0/1 Completed 0 2m25s
job1-kfjdc 0/1 Completed 0 2m24s
job1-ql5mh 0/1 Completed 0 2m13s
job1-vncdl 0/1 Completed 0 2m36s
job一共需要以2个pod同时创建(AGE字段)的方式来部署6个pod来完成任务,现在已经完成了任务。
步骤5: 测试job运行错误时的处理情况
删除现有的job,并修改yaml文件的sleep为sleepx,由于容器内没有sleepx的命令,会执行出错。
[root@vms201 jobs]# kubectl delete -f job1.yaml
job.batch "job1" deleted
执行修改后的job,并查看情况:
[root@vms201 jobs]# kubectl apply -f job1.yaml
job.batch/job1 created
[root@vms201 jobs]# kubectl get jobs.batch job1
NAME COMPLETIONS DURATION AGE
job1 0/6 44s 44s
[root@vms201 jobs]# kubectl describe jobs.batch job1
Name: job1
Namespace: job
Selector: controller-uid=9b911e32-2673-4411-b997-9e82732b7fc2
Labels: controller-uid=9b911e32-2673-4411-b997-9e82732b7fc2
job-name=job1
Annotations: <none>
Parallelism: 2
Completions: 6
Start Time: Thu, 08 Jul 2021 23:40:45 +0800
Pods Statuses: 0 Running / 0 Succeeded / 4 Failed
Pod Template:
Labels: controller-uid=9b911e32-2673-4411-b997-9e82732b7fc2
job-name=job1
Containers:
job1:
Image: busybox
Port: <none>
Host Port: <none>
Command:
sh
-c
data ; sleepx 10
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 70s job-controller Created pod: job1-56z6z
Normal SuccessfulCreate 70s job-controller Created pod: job1-7d2k6
Normal SuccessfulCreate 69s job-controller Created pod: job1-s9cnf
Normal SuccessfulCreate 69s job-controller Created pod: job1-lc6mj
Normal SuccessfulDelete 68s job-controller Deleted pod: job1-lc6mj
Warning BackoffLimitExceeded 68s job-controller Job has reached the specified backoff limit
可以在describe信息中看到:Job has reached the specified backoff limit的提示,因为我们在yaml文件中设置了backoffLimit: 2,说明尝试2次任务失败,则放弃尝试。
注意:backoffLimit设置的值和describe统计的数量并匹配。
练习: 计算圆周率的后的200位
编辑pod的yaml文件:
[root@vms201 jobs]# cat job2.yaml
apiVersion: batch/v1
kind: Job
metadata:
creationTimestamp: null
name: pi
spec:
template:
metadata:
creationTimestamp: null
spec:
terminationGracePeriodSeconds: 0
containers:
- command:
- sh
- -c
- perl -Mbignum=bpi -wle 'print bpi(200)'
image: perl
imagePullPolicy: IfNotPresent
name: pi
restartPolicy: Never
status: {}
创建job,并查看:
[root@vms201 jobs]# kubectl create -f job2.yaml
job.batch/pi created
[root@vms201 jobs]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pi-qrnt2 0/1 Completed 0 4s
[root@vms201 jobs]# kubectl get jobs.batch pi
NAME COMPLETIONS DURATION AGE
pi 1/1 1s 3m56s
查看容器内部的输出信息,可以看到计算出了圆周率小数点后200位
[root@vms201 jobs]# kubectl logs pi-qrnt2
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303820
二、cronjob(cg)
cronjob类似于Linux的crontab,可以定期调度pod完成一次性的工作。
步骤1: 获取cronjob的yaml文件并编辑
获取yaml文件模板:
kubectl create cronjob mycj --image=busybox --schedule="*/1 * * * *" --dry-run=client -o yaml -- sh -c "date ; sleep 10" >cj1
其中 --schedule="*/1 * * * *"对应了分时天月周。*表示不在乎此内容,而*/1则表示每x,这里表示的是每一分钟调度一次。
编辑cj1文件:
[root@vms201 jobs]# cat cj1
apiVersion: batch/v1
kind: CronJob
metadata:
creationTimestamp: null
name: mycj
spec:
jobTemplate:
metadata:
creationTimestamp: null
name: mycj
spec:
template:
metadata:
creationTimestamp: null
spec:
terminationGracePeriodSeconds: 0
containers:
- command:
- sh
- -c
- date ; sleep 10
image: busybox
imagePullPolicy: IfNotPresent
name: mycj
resources: {}
restartPolicy: OnFailure
schedule: '*/1 * * * *'
status: {}
此cronjob的含义是每个一分钟执行一次job,job中的容器打印当前日期并sleep 10s。
步骤2: 运行cronjob并查看执行过程
[root@vms201 jobs]# kubectl apply -f cj1
cronjob.batch/mycj created
[root@vms201 jobs]# watch -n .5 'kubectl get pods'
Every 0.5s: kubectl get pods Fri Jul 9 00:36:15 2021
NAME READY STATUS RESTARTS AGE
mycj-27096034-9mjx5 0/1 Completed 0 2m15s
mycj-27096035-w9wpv 0/1 Completed 0 75s
mycj-27096036-bbcm4 0/1 Completed 0 15s
可以看到,现在已经执行了3次job,均已经完成。
步骤3: 限制每个pod的运行时间
删除原有的cronjob:
[root@vms201 jobs]# kubectl delete cj mycj
cronjob.batch "mycj" deleted
修改cronjob的yaml文件,在spec下加入activeDeadlineSeconds: 5即可,也就是现在每个pod的运行时间不能超过5s,完成后会被删除。
创建job并查看信息:可以看到pod执行完成任务后即被删除:
[root@vms201 jobs]# kubectl apply -f cj1
cronjob.batch/mycj created
[root@vms201 jobs]# watch -n .5 'kubectl get pods'
Every 0.5s: kubectl get pods Fri Jul 9 00:46:28 2021
No resources found in job namespace.
参考资料:
《老段CKA课程》
更多推荐
所有评论(0)