CronJob 是什么
CronJob 按时间表达式周期性地创建一次性任务对象,由任务对象再去管理执行任务的 Pod。备份、报表、清理、对账这类定时作业用它最合适:调度规则与执行逻辑分开描述,集群负责在到点时拉起容器并把结果保留下来。
时区与并发的两个坑
时间表达式按什么时区解释,取决于控制器版本与配置:早期版本沿用控制器的本地时区,新版本支持在对象里显式指定时区。另一个坑是并发策略:上一轮还没跑完,下一轮到点了怎么办,默认允许重叠,会造成同一任务重复执行。
基本信息
| 适用环境 | 任何 Kubernetes 发行版,接口版本随集群版本不同 |
|---|---|
| 语法 | 时间表达式五段:分、时、日、月、周 |
| 时区 | 默认沿用控制器时区,新版本支持显式指定 |
| 并发策略 | 控制上一轮未结束时是否允许再起一轮 |
| 历史保留 | 分别限制成功与失败任务的保留数量 |
| 手动触发 | 从既有定时任务创建一个任务对象立即执行 |
典型使用场景
- 每日备份:固定低峰时间拉取数据做备份并上传
- 报表生成:按天或按小时汇总数据并产出报表
- 过期数据清理:定期删除日志、临时文件与历史记录
- 对账与巡检:周期性比对双方数据并告警
- 证书续期:在到期前提前执行续期流程
- 缓存预热:业务高峰前把热点数据加载进缓存
CronJob 清单
CronJob 清单
apiVersion: batch/v1
kind: CronJob
metadata:
name: nightly-backup
spec:
schedule: "0 2 * * *" # 分 时 日 月 周,注意加引号
concurrencyPolicy: Forbid # 上一轮未结束时禁止并发
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
suspend: false
jobTemplate:
spec:
backoffLimit: 2 # 失败重试次数
template:
spec:
restartPolicy: OnFailure
containers:
- name: backup
image: registry.example.com/backup:1.4
command: ["./backup.sh"]管理操作
管理操作
kubectl get cronjob # 看调度时间与上次触发
kubectl get jobs --watch # 观察任务创建
kubectl create job --from=cronjob/nightly-backup manual-1 # 立即手动触发一次
kubectl patch cronjob nightly-backup -p '{"spec":{"suspend":true}}' # 暂停调度
kubectl logs job/manual-1 # 看这次执行的日志关键字段读法
| 字段 | 含义 | 设置建议 |
|---|---|---|
| schedule | 调度时间表达式 | 必须加引号,避免被外层提前展开 |
| concurrencyPolicy | 并发策略 | 备份与对账类作业建议禁止并发 |
| suspend | 是否暂停调度 | 维护窗口期可临时暂停 |
| 历史保留 | 成功与失败任务的保留数 | 按排障需要保留几轮即可 |
| backoffLimit | 任务失败重试次数 | 结合任务幂等性设定 |
时间表达式必须用引号包裹,否则星号会被外层解释器当成通配符展开,导致提交的内容与预期不符。
需要立刻跑一次时用从定时任务创建任务的方式,不要临时改调度时间再改回去,那样容易忘记复原。