Kubernetes 中的 CronJob 是什么?

在 Kubernetes 中,CronJob 是一种控制器,用于管理基于时间调度的批处理 Job。它会根据预定的 Cron 时间表达式周期性地运行 Job。

CronJob 的主要特征是:

  • 周期性任务:根据 Cron 表达式在固定时间点运行任务。
  • 一次性任务:每个 Job 运行一次,按 Cron 调度的周期重复运行。
  • 幂等性:当前 Job 未完成,下一次调度不会产生新 Job。
  • 支持并行:可以为每个 Job 设置.spec.jobTemplate.spec.parallelism并行度。
  • 失败重试:每个 Job 可设置 .spec.jobTemplate.spec.backoffLimit 失败重试次数。

CronJob 的定义包含以下主要字段:

  • .spec.schedule:Cron 时间表达式,如 */1 * * * * (每分钟运行一次)。
  • .spec.jobTemplate:Job 模板,指定要运行的任务配置,内容同 Job。
  • .spec.startingDeadlineSeconds:启动 Job 的截止期限,超过时跳过当前调度。
  • .spec.concurrencyPolicy:并发性策略,支持 Allow、ForbidReplace
  • .spec.failedJobsHistoryLimit:失败 Job 历史限制,默认为1。
  • .spec.successfulJobsHistoryLimit: 成功 Job 历史限制,默认为3。
  • .status.lastScheduleTime:上次调度开始时间。

CronJob 根据以下规则运行 Job:

  1. 根据 .spec.schedule 的 Cron 表达式计算需要运行的时间点。
  2. 达到时间点后,会执行 .spec.jobTemplate 中定义的 Job。
  3. 如果上一次 Job 还未完成,本次调度会被跳过。
  4. 运行的 Job 数量受限于 .spec.concurrencyPolicy的策略,默认为 Allow(不限制)。
  5. 旧的 Job 根据 .spec.successfulJobsHistoryLimit 和 .spec.failedJobsHistoryLimit 进行回收。
  6. 如果 Job 运行失败,CronJob的调度不会停止,而是等待下一次调度。

例如,每分钟运行一次的 CronJob:

yaml
apiVersion: batch/v1beta1 
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

这个 CronJob 每分钟会运行一次 Job,在 Job 中运行一个打印时间和问候语的 busybox 容器。

所以总结来说,CronJob 主要用于管理基于时间调度的批处理任务,其特征是:

  1. 周期性任务:根据 Cron 表达式定时运行。
  2. 一次性任务:每个 Job 运行一次。
  3. 幂等性:当前 Job 未完成不会触发新 Job。
  4. 支持 Job 并行。
  5. 失败重试:每个 Job 可设置重试。

CronJob 的定义包含:

  1. Cron 时间表达式: .spec.schedule。
  2. Job 模板: .spec.jobTemplate ,内容同 Job。
  3. 启动截止时间: .spec.startingDeadlineSeconds。
  4. 并发策略: .spec.concurrencyPolicy ,如 Forbid、Replace
  5. Job 历史限制: .spec.successfulJobsHistoryLimit 和 .spec.failedJobsHistoryLimit。
  6. 状态:最近一次调度时间 .status.lastScheduleTime。