此文为学习《Kubernetes权威指南》的相关笔记
学习笔记:
Job:批处理调度,用于定义并启动一个批处理任务,与RS\RC\Deployment\DaemonSet类似,Job同样作为副本控制器的一种,来控制一组Pod容器,批处理任务的建立目标在于处理一批工作项(work item),在处理完成后,整个批处理任务结束,与其他副本控制器的差别在于:
- Job所控制的Pod副本短暂运行,且RestartPolicy为Never,当控制的所有Pod副本运行结束后,Job随之结束。
- Job所控制的Pod副本的工作模式能够实现段多实例并行运算。
K8s在1.5版本之后提供了Cronjob:定时任务,使得让某些批处理任务根据定时反复执行成为可能。
阿里云大学云原生公开课上,对Job给出的介绍如下:
下面是Job和CronJob的运行实例
一、Job运行实例
1、建立配置文件模板job.yaml.txt
Job所在的apiVersion应指定为batch/v1
与RC等副本控制器相同,Job在.spec.template域中定义它控制的Pod属性, restartPolicy域应当设置为Never
在本次Job的定义中,设置每次运行时打印此批处理任务的名称
apiVersion: batch/v1
kind: Job
metadata:
name: process-item-$ITEM
labels:
jobgroup: jobexample
spec:
template:
metadata:
name: jobexample
labels:
jobgroup: jobexample
spec:
containers:
- name: c
image: busybox
command: ["sh","-c","echo Processing item $ITEM && sleep 5"]
restartPolicy: Never扫描二维码关注公众号,回复: 8548104 查看本文章
2、使用模板批量生成配置文件,创建Job
使用shell语言按照模板生成3个item名称不同的Job配置文件到文件夹jobs
# for i in j1 j2 j3; do cat job.yaml.txt | sed "s/\$ITEM/$i/" > ./jobs/job-$i.yaml; done
如果在-f参数后指定一个文件夹路径而不是文件,K8s将使用路径下所有的yaml文件建立资源对象
# kubectl create -f jobs
job.batch/process-item-j1 created
job.batch/process-item-j2 created
job.batch/process-item-j3 created
3、查看运行情况
查看Job列表,可以看到三个Job建立成功
# kubectl get jobs
NAME COMPLETIONS DURATION AGE
process-item-j1 1/1 21s 3m7s
process-item-j2 1/1 17s 3m7s
process-item-j3 1/1 14s 3m7s
查看Pod运行日志,可以看到每个Job控制下的Pod都完成了自己的任务
# kubectl logs process-item-j1-hjj79
Processing item j1
]# kubectl logs process-item-j2-5w2bp
Processing item j2
# kubectl logs process-item-j3-2fjbp
Processing item j3
上述实现的是Job Template Expansiton模式,每个work Item对应一个Job实例
二、Job的并行运行
阿里云大学云原生技术公开课的教程中给出了并行运行Job的具体方法
创建Job配置文件paral-job.yaml
使用completions、parallelism两个量分别指定下属Pod的执行次数和并行执行个数
在Pod的定义中指定30秒后打印当前时间
apiVersion: batch/v1
kind: Job
metadata:
name: paral-job
spec:
completions: 8 #执行次数
parallelism: 2 #并行个数
template:
spec:
containers:
- name: param
image: ubuntu
imagePullPolicy: IfNotPresent
command: ["/bin/sh"]
args: ["-c","sleep 30;date"]
restartPolicy: OnFailure
创建Job后,等待运行完成,查看运行结果
# kubectl get jobs
NAME COMPLETIONS DURATION AGE
paral-job 8/8 2m11s 4m44s
# kubectl get pods
NAME READY STATUS RESTARTS AGE
paral-job-2qhrl 0/1 Completed 0 2m16s
paral-job-4t5n4 0/1 Completed 0 3m20s
paral-job-5xb96 0/1 Completed 0 3m20s
paral-job-7wbvp 0/1 Completed 0 2m47s
paral-job-m8wqp 0/1 Completed 0 2m48s
paral-job-qzk75 0/1 Completed 0 2m15s
paral-job-rtcnf 0/1 Completed 0 3m54s
paral-job-vv2zp 0/1 Completed 0 3m54s
可以看到,Job下的Pod以两两并行的方式运行了8次
三、CronJob运行实例
1、建立CronJob配置文件并运行
建立配置文件cronjob.yaml
CronJob所在的apiVersion为batch/v1beta1
书上给出的为batch/v1 beta 使用该apiVersion会报错:
error: unable to recognize "cronjob.yaml": no matches for kind "CronJob" in version "batch/v1 beta"
这明显是K8s版本更替出现的问题
在CronJob的.spec.schedule中可以通过与Linux Cron中相似的表达式去指定定时
这里指定为每1分钟调度一次
在.spec.jobTemplate中可以定义这个CronJob所管理的Job(套娃
在本次的配置中,Job每次被调度运行时,会输出当前被调度的时间
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: Never
args:
- /bin/sh
- -c
- date;echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
2、创建并查看该CronJob
创建完成后,查看CronJob列表
在LAST SCHEDULE列中,可以看到每隔一分钟被调度一次的状态
# kubectl get cronjobs
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */1 * * * * False 0 20s 4m53s
查看Jobs列表,可以看到每隔1分钟有一个新的Job被调度
# kubectl get jobs
NAME COMPLETIONS DURATION AGE
hello-1576568160 1/1 1s 2m25s
hello-1576568220 1/1 2s 85s
hello-1576568280 1/1 2s 25s
查看Pod列表,可以看到每隔一分钟Job被调度产生一个新的Pod运行
# kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-1576568520-vl6h6 0/1 Completed 0 2m28s
hello-1576568580-755gb 0/1 Completed 0 87s
hello-1576568640-52j6b 0/1 Completed 0 27s
查看Pod输出日志,可以看到每个Pod确实是在一分钟的间隔内被相继运行
# kubectl logs hello-1576568580-755gb
Tue Dec 17 07:42:50 UTC 2019
Hello from the Kubernetes cluster
# kubectl logs hello-1576568640-52j6b
Tue Dec 17 07:43:50 UTC 2019
Hello from the Kubernetes cluster
3、删除该CronJob语法如下
# kubectl delete cronjob hello
cronjob.batch "hello" deleted