一、什么是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工作流程图如下:

Day015-k8s任务管理-Job和Cronjob实践-图2

CronJob工作流程如下:

  1. 用户创建 CronJob 在指定的 Namespace 下定义一个 CronJob 对象,配置以下关键参数:
  2. schedule:cron 表达式(如 */5 * * * * 表示每 5 分钟执行一次)。
  3. jobTemplate:定义 Job 的模板(包括容器镜像、命令、重试策略等)。
  4. concurrencyPolicy:并发策略(允许/禁止同一时间运行多个 Job)。
  5. successfulJobsHistoryLimitfailedJobsHistoryLimit:保留成功/失败 Job 的历史数量。
  6. CronJob Controller 监听调度 Kubernetes 的 CronJob Controller 持续监控时间表,当达到预设的调度时间时,触发一个新的 Job 资源。
  7. Job 创建 Pod 执行任务
  8. 每个触发的 Job 会根据 jobTemplate 在相同 Namespace 下创建 Pod(图中显示多个 Pod,可能表示 Job 的 parallelism 或历史记录)。
  9. Pod 执行用户定义的任务(如定时备份、数据清理),完成后以退出码 0 标记成功,非零标记失败。
  10. 任务状态监控与清理
  11. 若 Job 成功完成,CronJob 会根据 successfulJobsHistoryLimit 保留指定数量的历史记录,超出的 Job 会被自动清理。
  12. 若 Job 失败,根据 failedJobsHistoryLimit 保留失败记录,同时可能触发重试(需在 Job 模板中配置 backoffLimit)。

组件关系

  • CronJobJobPod
  • 一个 CronJob 按时间表生成多个 Job(图中显示多个 Job 和 Pod)。
  • 每个 Job 可能启动一个或多个 Pod(取决于 Job 的 completionsparallelism 配置)。

三、CronJob特点和优势

CronJob特点和优势如下:

  • 周期执行:CronJob使用cron表达式定期创建Job执行任务
  • 并行执行:CronJob具备多种并发策略,调用Job更加灵活
  • 可靠性高:CronJob可以调度到K8s的任意节点运行,防止单点故障
  • 环境隔离:CronJob可以使用不同的镜像执行任务,无需考虑版本冲突
  • 历史记录:CronJob可以保留多个成功和失败的任务,便于问题跟踪和审计

四、CronJob使用场景

CronJob 用于执行排期操作,例如备份、生成报告等。 一个 CronJob 对象就像 Unix 系统上的 crontab(cron table)文件中的一行。 它用 Cron格式进行编写, 并周期性地在给定的调度时间执行 Job。