CronJob 控制器

1. CronJob 定时表达式

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

CronJob 的定时表达式基本沿用了 LinuxCron 的语法,由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 * * * *"
  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 定义的时间表。