CronJob 做什么
CronJob 按 cron 表达式周期性地创建 Job,每个 Job 再创建 Pod 执行任务,适合备份、报表、清理这类周期性作业。它有两个最容易踩的地方:时区,默认按 UTC 计算,对国内业务等于凌晨任务跑偏 8 小时;并发策略,默认 Allow,上一轮没跑完还会再起一轮。上线前把这两项显式写清楚,能省掉大部分「任务时间不对、数据打架」的排查。
基本信息
| schedule | 五段式 cron:分 时 日 月 周,例如 0 2 * * * |
|---|---|
| timeZone | 1.27 起 GA,可写 timeZone: Asia/Shanghai 显式声明 |
| concurrencyPolicy | Allow 默认 / Forbid 同一时间只保留一个 / Replace 用新一轮替换未完成的 |
| 历史保留 | successfulJobsHistoryLimit 默认 3、failedJobsHistoryLimit 默认 1 |
| 补跑判定 | startingDeadlineSeconds:错过调度窗口后是否补执行的判定范围 |
| suspend | 设为 true 可暂停调度,常用于排障期间临时停掉任务 |
并发策略对比
| 策略 | 行为 | 适用任务 |
|---|---|---|
| Allow | 允许重叠,同一时刻可能有多轮任务在跑 | 任务幂等、需要最大吞吐的场景 |
| Forbid | 已有任务未结束时跳过本轮 | 对账、账务、单例清理等不允许并发的任务 |
| Replace | 取消未完成的任务并启动新一轮 | 只关心最新一轮结果的采集与缓存刷新 |
典型使用场景
- 夜间数据备份与归档,配合对象存储的生命周期策略
- 定时生成报表、统计与告警汇总
- 缓存预热与数据同步,让业务高峰前数据就位
- 清理过期数据与临时文件,控制存储成本
- 证书有效期检查与密钥轮换提醒,避免到期才发现
CronJob 示例
CronJob 示例
apiVersion: batch/v1
kind: CronJob
metadata:
name: nightly-backup
spec:
schedule: "0 2 * * *" # 分 时 日 月 周
timeZone: Asia/Shanghai # 显式声明时区,避免按 UTC 跑偏
concurrencyPolicy: Forbid # 上一轮未结束时跳过本轮
successfulJobsHistoryLimit: 3 # 保留成功历史,便于核对执行记录
failedJobsHistoryLimit: 3 # 失败历史保留,现场不会被过早清掉
startingDeadlineSeconds: 300 # 错过窗口后 300 秒内仍可补跑
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: backup
image: registry.example.com/team/backup:1.0.0
cron 表达式按 UTC 计算时,0 2 * * * 实际是北京时间 10 点,定时任务「跑偏」先查时区。timeZone 字段自 1.27 起 GA,更早版本该字段可能不生效,需要从节点或镜像侧处理时区。
排查顺序:先看 Job 有没有被创建,没有创建说明是调度或 suspend 问题;再看 Job 与 Pod 状态和日志,创建了但失败属于任务本身的问题。历史保留数量太少会导致失败现场被清理,事后只能靠外部日志。