报错是这么冒出来的。K8s 里一个每五分钟跑一次的同步任务,某天数据量变大执行时间超过十五分钟,节点上同时跑着三个 Job,同一批数据被写了三遍。
中间走过弯路,把「startingDeadlineSeconds 没配,错过的时间点会集中补跑」当成主因,改完现象没变。
排查方向其实有限,先把可能性排一排。concurrencyPolicy 默认是 Allow,上一次没跑完就允许再起一个。也可能是任务没有做幂等,重复执行直接产生重复数据。
少数情况下是Job 的 backoffLimit 偏大,失败后重试也叠加了实例。
第一件事是看当前叠加的 Job 和 Pod
kubectl get jobs -n sync -o wide
随后把并发策略改成 Forbid
kubectl get cronjob sync -o yaml | grep -A2 concurrencyPolicy
再往下清理多余实例并更新配置
kubectl delete job -n sync --all && kubectl apply -f sync-cronjob.yaml
剩下的就是观察下一个周期是否只跑一个
kubectl get pods -n sync -w
别只看报错消失,验证要多做一步。同一时间点只有一个 Job 在运行,Pod 数量稳定为一,业务表里不再出现重复数据。
提醒一点。改成 Forbid 只是不让叠加,任务本身还要做幂等和去重;执行时间接近周期时应该拉长间隔或者改成事件触发。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
