最近学习Kubernetes碰到Job和CronJob,在这里总结记录一下。
Job
Job控制器也是Kubernetes中的一个重要的控制器资源,但是它和Deployment、DaemonSet不同的是:Job控制器用于调配pod对象中的运行一次性的任务。
在实践中可能任务不止运行一次就结束,用户可以配置它们以串行或并行的方式运行。
Job运行方式
总结起来就是两种运行方式:并行和串行。
- 单工作队列的串行方式:即以多个一次性的作业放式串行执行多次任务,直至满足期望的次数,可以理解为并行度为1的作业执行方式,在某一个时刻至存在一个pod资源。
- 多工作队列的并行方式:这种工作方式可以设置任务数、并行度。可以多个任务队列每个队列执行一个任务,也可以多个任务队列每个队列执行多个任务。
通过以下job创建示例来说明:
apiVersion: batch/v1
kind: Job
metadata:
name: job-example
spec:
template:
spec:
containers:
- name: myjob
image: nginx
command: ["/bin/sh","-c", "sleep 120"]
restartPolicy: Never
注意:
- Job位于API群组“batch/v1"内。
- Pod模板的spec.restartPolicy默认为"Always",这对Job控制器来讲并不适用,因此必须指定为Never或OnFailure。
上述示例是并行式Job,通过spec.parallelism的值进行设置,并通过spec.completion的值设定总任务数。上例中表示已2个队列运行,总共运行5次任务。
Job扩容
Job控制器的spec.parallelism定义的并行度表示同时运行的Pod对象数,此属性值支持运行时调整从而改变其队列总数,实现扩容缩容。
使用" Kubectl scale --replicas"命令扩展:
$ Kubectl scale jobs job-example --replicas=3
Job删除
Job控制器待其执行结束之后,将不会占用系统资源。用户可按需删除资源,但是存在一些Job控制器的容器无法正常结束,而restartPolicy又定义为重启了,那它可能就会一直处于重启状态。
Job控制器提供了如下两种方式来防止该类情况:
- spec.activeDealineSeconds : Job的deadline,用于指定最大活动时间长度,超出此时间长度作业会被终止。。
- spec.backoffLimit : 将作业标记为失败状态之前的重试次数,默认值为6。
spec:
backoffLimit: 5
activeDealineSeconds: 100
说了这么多Job,那CronJob和它有什么关系呢
CronJob
CronJob控制器是用于管理Job控制器资源的运行时间。
Job控制器定义的作业任务在其控制器资源创建之后便可以立即执行,但是CronJob可以做到类似于Linux操作系统的周期性任务作业计划(cronTab)的方式控制其运行的时间点和重复运行的方式。包括以下两种:
- 在未来某个时间点运行作业一次。
- 在指定的时间点重复运行作业。
CronJob对象创建
CronJob控制器的spec字段可嵌套使用以下字段:
- jobTemplate : Job控制器模板,用于为CronJob控制器生成Job对象;
- schedule : Cron格式的作业调度运行时间点;
- concurrencyPolicy : 并发执行策略,可用值有Allow(允许)、Forbid(禁止)和Replace(替换),用于定义前一次作业运行尚未完成时是否和后一次作业一同运行;
- failedJobHistoryLimit: 为失败的任务执行保留历史记录数,默认为1.
- successfulJobHistoryLimit : 为成功执行的任务保留历史记录,默认值为3;
- startingDeadlineSeconds : 因为各种原因缺乏执行作业的时间点导致的启动作业错误的超时时长,会被记入错误历史记录;
- suspend :是否挂起后续的任务执行,默认为false,对运作中的任务不会产生影响;
通过以下CronJob来说明:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: Cronjob-example
labels:
app: mycronjob
spec:
schedule: "*/2 * * * *"
jobTemplate:
metadata:
labels:
app: mycronjob-jobs
spec:
parallelism: 2
template:
spec;
containers:
- name: myjob
image: nginx
command: ["/bin/sh","-c", "sleep 120"]
restartPolicy: OnFailure
上例创建一个每隔两分钟运行一次的简单CronJob任务。
CronJob的控制机制
CronJob是一个跟高级别的资源,它是以Job控制器资源为管控对象,并借助它管理Pod资源对象。
如果作业的重复指定时间比较密集,,而作业执行时间又比较长,则会出现两个Job对象同时存在的情况。有些Job对象可能会存在无法或不能同时运行的情况,这个时候就要通过 spec.concurrencyPolicy属性控制作业并存的机制,其默认值为“Allow",即允许前后Job甚至是属于同一个CronJob的Job同时运行。其他两个可用值中,“foebid” 用于禁止前后两个job同时运行,“Replace” 用于让后一个代替前一个。
参考书籍《Kubernetes进阶实战》
个人github账号:https://github.com/SpecialAll