一、什么是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