一、什么是CronJob¶
CronJob创建基于时隔重复调度的 Job。其中.spec.schedule 字段是必需的。该字段的值遵循 Cron 语法:
# ┌───────────── 分钟 (0 - 59)
# │ ┌───────────── 小时 (0 - 23)
# │ │ ┌───────────── 月的某天 (1 - 31)
# │ │ │ ┌───────────── 月份 (1 - 12)
# │ │ │ │ ┌───────────── 周的某天 (0 - 6)(周日到周一;在某些系统上,7 也是星期日)
# │ │ │ │ │ 或者是 sun,mon,tue,web,thu,fri,sat
# │ │ │ │ │
# │ │ │ │ │
# * * * * *
步长可被用于范围组合。范围后面带有 /<数字> 可以声明范围内的步幅数值。 例如,0-23/2 可被用在小时字段来声明命令在其他数值的小时数执行 (V7 标准中对应的方法是 0,2,4,6,8,10,12,14,16,18,20,22)。 步长也可以放在通配符后面,因此如果你想表达 “每两小时”,就用 */2 。
例如 0 0 13 * 5 表示此任务必须在每个星期五的午夜以及每个月的 13 日的午夜开始。
二、CronJob使用场景¶
CronJob 用于执行排期操作,例如备份、生成报告等。 一个 CronJob 对象就像 Unix 系统上的 crontab(cron table)文件中的一行。 它用 Cron格式进行编写, 并周期性地在给定的调度时间执行 Job。
三、CronJob配置参数详解¶
下面以一个示例来说明下CronJob配置参数:·
apiVersion: batch/v1
kind: CronJob
metadata:
labels:
run: hello
name: hello
namespace: default
spec:
concurrencyPolicy: Allow
failedJobsHistoryLimit: 1
jobTemplate:
metadata:
spec:
template:
metadata:
labels:
run: hello
spec:
containers:
- args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
imagePullPolicy: Always
name: hello
resources: {}
restartPolicy: OnFailure
securityContext: {}
schedule: '*/1 * * * *'
successfulJobsHistoryLimit: 3
suspend: false
其中配置参数说明如下:
- apiVersion:1.21版本之前可以使用batch/v1beta1 ,1.25版本之后不能使用batch/v1beta1,1.21版本之后可以使用batch/v1
- schedule:调度周期,和Linux一致,分别是分时日月周。
- restartPolicy: OnFailure,容器以不为 0 的状态码终止,自动重启该容器。
- concurrencyPolicy:并发调度策略。可选参数如下: (1)Allow:允许同时运行多个任务。 (2)Forbid:不允许并发运行,如果之前的任务尚未完成,新的任务不会被创建。 (3)Replace:如果之前的任务尚未完成,新的任务会替换的之前的任务。
- suspend:如果设置为true,则暂停后续的任务,默认为false。
- successfulJobsHistoryLimit:保留多少已完成的任务,按需配置。
- failedJobsHistoryLimit:保留多少失败的任务
四、CronJob如何创建¶
1.定义一个名为 cronjob.yaml的yaml文件
[root@k8s-master01 JOB]# vim cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
labels:
run: hello
name: hello
namespace: default
spec:
concurrencyPolicy: Allow
failedJobsHistoryLimit: 1
jobTemplate:
metadata:
spec:
template:
metadata:
labels:
run: hello
spec:
containers:
- args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
imagePullPolicy: Always
name: hello
resources: {}
restartPolicy: OnFailure
securityContext: {}
schedule: '*/1 * * * *'
successfulJobsHistoryLimit: 3
suspend: false
上面参数说明如下:
- concurrencyPolicy:并发调度策略,这里选择Allow,允许同时运行多个任务。
- suspend:如果设置为true,则暂停后续的任务,默认为false。
- schedule:调度周期,和Linux一致,分别是分时日月周。
- restartPolicy: OnFailure,容器以不为 0 的状态码终止,自动重启该容器。
- failedJobsHistoryLimit:可选字段,指定应保留多少已失败的任务。 默认设置为 1。将限制设置为
0代表相应类型的任务完成后不会保留。 - successfulJobsHistoryLimit:可选字段,指定应保留多少已完成的任务。 默认设置为 3。将限制设置为
0代表相应类型的任务完成后不会保留。
2.部署
[root@k8s-master01 JOB]# kubectl create -f cronjob.yaml
3.查看CronJob、job、pod
[root@k8s-master01 JOB]# kubectl get cj
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */1 * * * * False 0 <none> 13s
[root@k8s-master01 JOB]# kubectl get job
NAME COMPLETIONS DURATION AGE
hello-27840055 1/1 5s 26s
[root@k8s-master01 JOB]# kubectl get po
NAME READY STATUS RESTARTS AGE
hello-27840055-zpx59 0/1 Completed 0 41s
4.查看pod日志
[root@k8s-master01 JOB]# kubectl logs -f hello-27840055-zpx59
Wed Dec 7 08:55:02 UTC 2022
Hello from the Kubernetes cluster
5.等待一分钟后,再次查看CronJob、job、pod
[root@k8s-master01 JOB]# kubectl get cj
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */1 * * * * False 0 22s 2m2s
[root@k8s-master01 JOB]# kubectl get job
NAME COMPLETIONS DURATION AGE
hello-27840055 1/1 5s 87s
hello-27840056 1/1 6s 27s
[root@k8s-master01 JOB]# kubectl get po
NAME READY STATUS RESTARTS AGE
hello-27840055-zpx59 0/1 Completed 0 99s
hello-27840056-j7gwk 0/1 Completed 0 39s
6.继续打开cronjob.yaml的yaml文件,将suspend参数设置为true,关闭CronJob
[root@k8s-master01 JOB]# vim cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
labels:
run: hello
name: hello
namespace: default
spec:
concurrencyPolicy: Allow
failedJobsHistoryLimit: 1
jobTemplate:
metadata:
spec:
template:
metadata:
labels:
run: hello
spec:
containers:
- args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
imagePullPolicy: Always
name: hello
resources: {}
restartPolicy: OnFailure
securityContext: {}
schedule: '*/1 * * * *'
successfulJobsHistoryLimit: 3
suspend: true
7.更新yaml
[root@k8s-master01 JOB]# kubectl apply -f cronjob.yaml
8.等待1分钟后,再次查看CronJob、job、pod。观察到CronJob已关闭
[root@k8s-master01 JOB]# kubectl get cj
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */1 * * * * True 0 62s 3m42s
[root@k8s-master01 JOB]# kubectl get job
NAME COMPLETIONS DURATION AGE
hello-27840055 1/1 5s 3m5s
hello-27840056 1/1 6s 2m5s