Kubernetes CronJob 可靠性:避免漏跑、重跑与堆积

配置并发策略、截止时间、时区和幂等性,让周期任务在控制器延迟与故障恢复后仍可预测。

文章目录 · 4 节

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 成功

收尾清单

演练控制面中断后补跑、重复触发和跨时区场景。手工补任务时传入明确业务日期,避免默认处理“当前时间”造成数据重复。