schedule 字段
spec.schedule 接受五字段的 Cron 表达式,例如 "0 */6 * * *" 表示每 6 小时一次。Kubernetes 也支持 @hourly、@daily、@weekly、@monthly 和 @yearly 等宏。请在 YAML 中给值加上引号,避免星号被误解析。
使用 spec.timeZone 设置时区
如果不设置时区,调度会按 kube-controller-manager 所在时区解释,通常是 UTC。从 Kubernetes 1.27 起,可以把 spec.timeZone 设置为 Asia/Shanghai 这样的 IANA 名称。在工具中选择相同时区,即可预览准确的创建时间,包括夏令时切换。
错过的运行与并发
如果控制器错过了某个调度时间,startingDeadlineSeconds 决定 Job 最晚还能延迟多久启动。concurrencyPolicy 控制上一次运行仍在进行时的行为:Allow、Forbid 或 Replace。选择每分钟这类频繁调度时,要特别注意这些设置。
测试时可以用 kubectl create job --from=cronjob/<name> <job-name> 立即触发一次运行,并用 kubectl get cronjob 查看 LAST SCHEDULE 和 ACTIVE 列。CronJob 对象上的事件会说明某个调度时间为何被跳过,或 Job 为何启动失败。
最小清单示例
CronJob 使用 apiVersion batch/v1 和 kind CronJob,包含 spec.schedule、可选的 spec.timeZone 以及描述要运行 Pod 的 jobTemplate。设置 suspend: true 可以暂停调度而不删除它;successfulJobsHistoryLimit 和 failedJobsHistoryLimit 控制保留多少已完成的 Job 以便排查问题。
常见问题
- Kubernetes CronJob 支持秒吗?
- 不支持。schedule 只有五个字段,所以最短间隔是 1 分钟。
- schedule 里可以使用 CRON_TZ 吗?
- 不可以。不支持 TZ 和 CRON_TZ 前缀,请改用 spec.timeZone 字段。
- 0 */6 * * * 是什么意思?
- 每 6 小时整点运行一次:00:00、06:00、12:00 和 18:00。
- 为什么我的 CronJob 运行了两次或者根本没运行?
- 请检查 startingDeadlineSeconds 和 concurrencyPolicy,以及控制器当时是否宕机。CronJob 会尽量做到每个调度时间创建一个 Job,但并不保证。