CronJob 控制器

1. CronJob 定时表达式

CronJob 用于创建每隔一段时间定期运行的批处理任务,比如数据备份、生成报告、清理文件、发送邮件等需要定时执行的任务。CronJob 会周期性地创建 Job (进而创建Pod) 来完成具体的工作任务。CronJob 也支持根据历史数量限制自动清理过期的 Job,以减少过多的残留 Job 占用资源。

CronJob 的定时表达式基本沿用了 Linux Cron 的语法,由5个时间域组成,分别表示分钟、小时、日、月、星期。详细介绍如下:

  • Minutes:表示每小时的哪一分钟执行任务。范围是 0 到 59。
  • Hours:表示每天的哪个小时执行任务。范围是 0 到 23。
  • DayofMonth:表示每月的哪一天执行任务。范围是 1 到 31。
  • Month:表示每年的哪个月执行任务。范围是 1 到 12。
  • DayofWeek:表示每周的哪一天执行任务。范围是 0 到 7,其中 0 和 7 都表示星期日。
  • 特殊字符:
    • *:表示匹配所有可能的值。例如,* 在分钟字段中表示每分钟执行任务。
    • ,:用于指定多个值。例如,1,15,30 表示在分钟字段中匹配 1、15 和 30 分钟。
    • -:用于指定范围。例如,1-5 表示匹配 1 到 5。
    • /:用于指定步长。例如,*/15 表示每隔 15。
    • ?:用于指定不关心的值。通常用于日期字段和星期字段中。

2. CronJob 配置示例

# cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  successfulJobsHistoryLimit: 3
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure 
YAML

字段含义:

  • metadata.name:CronJob 的名称,将作为 Job 名称的前缀。
  • schedule:定时表达式。
  • jobTemplate: Job 的配置模板,内容与 Job 需要配置的字段相同,只是不再需要 apiVersion 和 kind 这两个元数据。
  • startingDeadlineSeconds:设置由于某种原因错过调度后允许启动 Job 的最长等待时间,这是可选配置。超过最长等待时间后,CronJob 将不再启动这个 Job ,Job 也会被系统判定为失败(Failed)状态。若不设置这个参数,则表示没有最长等待时间。
  • concurrencyPolicy:设置 CronJob 创建的多个 Job 并发运行时的处理策略,这是可选配置。可选的策略介绍如下:
    • Allow:允许并发运行,是 concurrencyPolicy 的默认值。
    • Forbid:禁止并发运行,如果已经达到了新的运行时间,但前一个 Job 还未运行完毕,则忽略新的 Job 的运行。
    • Replace:如果已经达到了新的运行时间,但前一个 Job 还未运行完毕,则启动新的 Job 来替换当前运行的 Job。
  • suspend:如果将其设置为 true,表示挂起 CronJob 的运行,同时不影响已创建的 Job 的运行;如果将其设置为 false,表示恢复 CronJob 的运行。
  • successfulJobsHistoryLimit:设置允许保留的成功结束的 Job 数量,默认值为3,如果将其设置为0,则表示不保留 Job 历史。
  • failedJobsHistoryLimit:设置允许保留的运行失败的 Job 数量,默认值为1,如果将其设置为0,则表示不保留 Job 历史。
  • timeZone:用于为 CronJob 设置时区及计算由 schedule 定义的时间表。

3. 示例

部署上述 CronJob:

kubectl apply -f cronjob.yaml
Bash

过一段时间查看 CronJob 事件信息:

kubectl describe cronjobs.batch hello

...
Events:
  Type    Reason            Age    From                Message
  ----    ------            ----   ----                -------
  Normal  SuccessfulCreate  6m17s  cronjob-controller  Created job hello-29247114
  Normal  SawCompletedJob   6m3s   cronjob-controller  Saw completed job: hello-29247114, condition: Complete
  Normal  SuccessfulCreate  5m17s  cronjob-controller  Created job hello-29247115
  Normal  SawCompletedJob   5m11s  cronjob-controller  Saw completed job: hello-29247115, condition: Complete
  Normal  SuccessfulCreate  4m17s  cronjob-controller  Created job hello-29247116
  Normal  SawCompletedJob   4m11s  cronjob-controller  Saw completed job: hello-29247116, condition: Complete
  Normal  SuccessfulCreate  3m17s  cronjob-controller  Created job hello-29247117
  Normal  SuccessfulDelete  3m11s  cronjob-controller  Deleted job hello-29247114
  Normal  SawCompletedJob   3m11s  cronjob-controller  Saw completed job: hello-29247117, condition: Complete
  Normal  SuccessfulCreate  2m17s  cronjob-controller  Created job hello-29247118
  Normal  SuccessfulDelete  2m12s  cronjob-controller  Deleted job hello-29247115
  Normal  SawCompletedJob   2m12s  cronjob-controller  Saw completed job: hello-29247118, condition: Complete
  Normal  SuccessfulCreate  77s    cronjob-controller  Created job hello-29247119
  Normal  SuccessfulDelete  72s    cronjob-controller  Deleted job hello-29247116
  Normal  SawCompletedJob   72s    cronjob-controller  Saw completed job: hello-29247119, condition: Complete
  Normal  SuccessfulCreate  17s    cronjob-controller  Created job hello-29247120
  Normal  SuccessfulDelete  11s    cronjob-controller  Deleted job hello-29247117
  Normal  SawCompletedJob   11s    cronjob-controller  Saw completed job: hello-29247120, condition: Complete
Bash

查看相应的 Job:

kubectl get jobs.batch
NAME             STATUS     COMPLETIONS   DURATION   AGE
hello-29247115   Complete   1/1           6s         2m22s
hello-29247116   Complete   1/1           6s         82s
hello-29247117   Complete   1/1           6s         22s


kubectl get jobs.batch
NAME             STATUS     COMPLETIONS   DURATION   AGE
hello-29247116   Complete   1/1           6s         2m6s
hello-29247117   Complete   1/1           6s         66s
hello-29247118   Complete   1/1           5s         6s

# 可以看到因为设置了 successfulJobsHistoryLimit: 3 字段,始终保留三个 Job。
Bash

也可以查看到相应的 Pod:

kubectl get pod
NAME                                READY   STATUS      RESTARTS     AGE
hello-29247115-btpfq                0/1     Completed   0            2m35s
hello-29247116-2j672                0/1     Completed   0            95s
hello-29247117-96qkw                0/1     Completed   0            35s
Bash

查看 Pod 的日志可以查看到输出信息:

kubectl logs hello-29247117-96qkw 

Hello from the Kubernetes cluster
Bash
上一篇
下一篇