在 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、
Forbid
、Replace
。 - .spec.failedJobsHistoryLimit:失败 Job 历史限制,默认为1。
- .spec.successfulJobsHistoryLimit: 成功 Job 历史限制,默认为3。
- .status.lastScheduleTime:上次调度开始时间。
CronJob 根据以下规则运行 Job:
- 根据 .spec.schedule 的 Cron 表达式计算需要运行的时间点。
- 达到时间点后,会执行 .spec.jobTemplate 中定义的 Job。
- 如果上一次 Job 还未完成,本次调度会被跳过。
- 运行的 Job 数量受限于 .spec.concurrencyPolicy的策略,默认为 Allow(不限制)。
- 旧的 Job 根据 .spec.successfulJobsHistoryLimit 和 .spec.failedJobsHistoryLimit 进行回收。
- 如果 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 主要用于管理基于时间调度的批处理任务,其特征是:
- 周期性任务:根据 Cron 表达式定时运行。
- 一次性任务:每个 Job 运行一次。
- 幂等性:当前 Job 未完成不会触发新 Job。
- 支持 Job 并行。
- 失败重试:每个 Job 可设置重试。
CronJob 的定义包含:
- Cron 时间表达式: .spec.schedule。
- Job 模板: .spec.jobTemplate ,内容同 Job。
- 启动截止时间: .spec.startingDeadlineSeconds。
- 并发策略: .spec.concurrencyPolicy ,如 Forbid、
Replace
。 - Job 历史限制: .spec.successfulJobsHistoryLimit 和 .spec.failedJobsHistoryLimit。
- 状态:最近一次调度时间 .status.lastScheduleTime。