CronJob顾名思义,是一种能够在固定时间运行的Job对象。它使用Linux系统上的定时任务Cron的语法来定义这个Job的固定运行时间。
CronJob格式
Minutes Hours DayofMonth Month DayofWeek Yea
支持 “, - * / “四个字符,
*:表示匹配任意值,如果在Minutes 中使用,表示每分钟
/: 表示起始时间开始触发,然后每隔固定时间触发一次,
例如在Minutes 设置的是5/20,则表示第一次触发是在第5min时,接下来每20min触发一次,
即,第25min,45min等时刻触发
示例:比如每隔1min执行一次任务:则Cron 表达式如下:
*/1 * * * *
创建一个CronJob对象
在Kubernetes 1.8之前,创建一个CronJob需要使用batch/v2alpha1版本的API,而默认这个版本的API是禁用的,因此需要通过传递参数–runtime-config=batch/v2alpha1=true给API Server来启用。而在Kubernetes 1.8之后,可以直接使用API Server默认就开启的batch/v1beta1版本。下面是一个例子:
1 | apiVersion: batch/v1beta1 |
1 | $ kubectl create -f ./cronjob.yaml |
或者也可以通过即时命令的方式运行一个CronJob:
1 | $ kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster" |
1 | $ kubectl get cronjob hello |
此时我们看到,这个CronJob还没有真正运行任何Job。等待大约一分钟后可以观察到一个Job开始运行:
1 | $ kubectl get jobs --watch |
1 | $ kubectl get cronjob hello |
删除一个CronJob
通过kubectl delete命令来删除一个CronJob:
1 | $ kubectl delete cronjob hello |
删除一个CronJob对象会连带删除其创建的所有Job和Pod。
CronJob对象参数详解
.spec.schedule
.spec.schedule 是一个Cron类型的字符串,用于描述这个CronJob的执行周期。
.spec.startingDeadlineSeconds
.spec.startingDeadlineSeconds 参数用于指定一个CronJob如果没有按时启动(可能规定时间时CronJob controller恰好出现故障),依旧能够存活的时间。如果超过了这个设定的时间,那么此CronJob就被标记为Failed。如果不设置这个参数,那么这个CronJob没有超时时间。
.spec.concurrencyPolicy
.spec.concurrencyPolicy 用于指定如何处理一个CronJob创建的多个并行执行的Job(由于存在.spec.startingDeadlineSeconds参数,因此有可能到某个时间点,恰好恢复了的CronJob controller会创建一个原先就该运行的Job;而此时刚好又到了该CronJob执行周期,因此可能会出现并行运行Job的情况)。它有下列可选值:
Allow(默认值):运行并行执行多个Job
Forbid:禁止并行运行多个Job。如果一个新的Job创建时,正在运行一个旧Job,那么CronJob controller则不会创建这个新Job
Replace:如果一个新的Job创建时,正在运行一个旧Job,那么CronJob controller会使用这个新Job替代正在运行的旧Job
如果.spec.startingDeadlineSeconds参数设置为一个很大的值(或者直接不设置),并且.spec.concurrencyPolicy设置为Allow,那么这个CronJob至少会运行一次。
.spec.suspend
.spec.suspend 参数如果设置为true,那么所有将来的定时执行都会被暂停。已经处在运行状态的Job不受影响。默认值为false。
参考
https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/