CronJob 提供调度,不保证业务上的 exactly-once。控制器重启、任务超时和并发执行都可能产生漏跑或重复,因此 Job 本身必须可重试且尽量幂等。
明确调度语义
spec:
schedule: "0 2 * * *"
timeZone: "Asia/Shanghai"
concurrencyPolicy: Forbid
startingDeadlineSeconds: 600
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 5
Forbid 防止上次任务未结束时再启动,但也可能让慢任务持续漏过调度。Replace 会终止旧 Job,只适合能安全中断的任务。
让任务可恢复
jobTemplate:
spec:
backoffLimit: 3
activeDeadlineSeconds: 1800
ttlSecondsAfterFinished: 86400
业务写入使用唯一任务键、数据库约束或 checkpoint 防重。外部调用需要超时、有限重试和幂等键。
监控真正结果
- 计划时间到实际开始时间的延迟
- 最近一次成功时间和连续失败次数
- Job 执行时长与 deadline
- 未处理数据水位,而不只看 Pod 成功
收尾清单
演练控制面中断后补跑、重复触发和跨时区场景。手工补任务时传入明确业务日期,避免默认处理“当前时间”造成数据重复。