kubectl get cronjob reconcile -o yaml | grep -A3 concurrencyPolicy
kubectl get jobs -l cronjob=reconcile
kubectl patch cronjob reconcile -p '{"spec":{"concurrencyPolicy":"Forbid"}}'
CronJob 每天 02:00 跑对账,昨天起了三个 Job,同一批订单被冲正三次。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:concurrencyPolicy 默认是 Allow,上一次 Job 没结束时下一次照常创建。任务本身按时间窗口全量跑,没有幂等键,重复执行就会重复入账。
这次卡住的地方就在「CronJob 并发策略」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。监控和日志的时间要对上,时区不一致会多绕很大一圈。
临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
处理上按这个顺序:把 concurrencyPolicy 改成 Forbid 禁止同一 CronJob 并发;给 Job 加 activeDeadlineSeconds 超时直接失败释放名额;任务里按批次号写幂等表 重复执行直接返回;用 kubectl get jobs 看历史 Job 的完成时间是否重叠。
确认没问题再收工,连续两天 02:00 只出现一个 Job 对账明细没有重复流水。
