Wonderingkaho's Blog.

Concept of k8s ConJob

字数统计: 882阅读时长: 3 min
2019/04/29 Share

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
1
2
$ kubectl create -f ./cronjob.yaml
cronjob "hello" created

或者也可以通过即时命令的方式运行一个CronJob:

1
2
$ kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"
cronjob "hello" created
1
2
3
$ kubectl get cronjob hello
NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE
hello */1 * * * * False 0 <none>

此时我们看到,这个CronJob还没有真正运行任何Job。等待大约一分钟后可以观察到一个Job开始运行:

1
2
3
$ kubectl get jobs --watch
NAME DESIRED SUCCESSFUL AGE
hello-4111706356 1 1 2s
1
2
3
$ kubectl get cronjob hello
NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE
hello */1 * * * * False 0 Mon, 29 Aug 2016 14:34:00 -0700

删除一个CronJob

通过kubectl delete命令来删除一个CronJob:

1
2
$ kubectl delete cronjob hello
cronjob "hello" deleted

删除一个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/

CATALOG
  1. 1. CronJob格式
  2. 2. 创建一个CronJob对象
  3. 3. 删除一个CronJob
  4. 4. CronJob对象参数详解
    1. 4.1. .spec.schedule
    2. 4.2. .spec.startingDeadlineSeconds
    3. 4.3. .spec.concurrencyPolicy
    4. 4.4. .spec.suspend
  5. 5. 参考