学习本节内容之前,希望你已经对Job有了基本的了解。具体请参考这篇文章:
CronJob顾名思义,是一种能够在固定时间运行的Job对象。它使用Linux系统上的定时任务Cron的语法来定义这个Job的固定运行时间。
1. 创建一个CronJob对象
在Kubernetes 1.8之前,创建一个CronJob需要使用batch/v2alpha1版本的API,而默认这个版本的API是禁用的,因此需要通过传递参数--runtime-config=batch/v2alpha1=true给API Server来启用。而在Kubernetes 1.8之后,可以直接使用API Server默认就开启的batch/v1beta1版本。下面是一个例子:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
$ kubectl create -f ./cronjob.yaml
cronjob "hello" created
或者也可以通过即时命令的方式运行一个CronJob:
$ kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"
cronjob "hello" created
$ kubectl get cronjob hello
NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE
hello */1 * * * * False 0 <none>
此时我们看到,这个CronJob还没有真正运行任何Job。等待大约一分钟后可以观察到一个Job开始运行:
$ kubectl get jobs --watch
NAME DESIRED SUCCESSFUL AGE
hello-4111706356 1 1 2s
$ kubectl get cronjob hello
NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE
hello */1 * * * * False 0 Mon, 29 Aug 2016 14:34:00 -0700
2. 删除一个CronJob
通过kubectl delete命令来删除一个CronJob:
$ kubectl delete cronjob hello
cronjob "hello" deleted
删除一个CronJob对象会连带删除其创建的所有Job和Pod。
3. CronJob对象参数详解
3.1 .spec.schedule
.spec.schedule是一个Cron类型的字符串,用于描述这个CronJob的执行周期。
3.2 .spec.startingDeadlineSeconds
.spec.startingDeadlineSeconds参数用于指定一个CronJob如果没有按时启动(可能规定时间时CronJob controller恰好出现故障),依旧能够存活的时间。如果超过了这个设定的时间,那么此CronJob就被标记为Failed。如果不设置这个参数,那么这个CronJob没有超时时间。
3.3 .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至少会运行一次。
3.4 .spec.suspend
.spec.suspend参数如果设置为true,那么所有将来的定时执行都会被暂停。已经处在运行状态的Job不受影响。默认值为false。








网友评论