K8s 1.26 上跑一个数据导入 Job,backoffLimit 设成 6,任务因为源库连接超时反复重试,八个小时后还在跑,describe 里 Failed 已经到 6,新的 Pod 仍在创建。
一开始怀疑是「activeDeadlineSeconds 没设,Job 永远不会因为超时被终止」,查了一圈,方向不对。
这类报错背后常见的原因有几处,逐个排除就行。backoffLimit 限制的是失败重试次数,restartPolicy 为 OnFailure 时容器重启不计入。少数情况下是Pod 的 restartPolicy 写成了 Always,Job 控制器拒绝但并不阻止容器重启。
另外,镜像里的入口脚本自带重试循环,退出码始终是 0。
先看 Job 的失败计数和 Pod 状态
kubectl describe job data-import | grep -E 'Pods Statuses|BackoffLimit|Conditions'
接着确认 Pod 的重启策略
kubectl get job data-import -o jsonpath='{.spec.template.spec.restartPolicy}{"\n"}'
补上超时限制
kubectl patch job data-import --type merge -p '{"spec":{"activeDeadlineSeconds":3600}}'
剩下的就是清掉卡住的任务重新提交
kubectl delete job data-import && kubectl apply -f job.yaml
同样的操作我在测试机上先走了一遍,线上只做验证过的部分。
恢复的判定其实很直接。Job 超过 backoffLimit 后状态变为 Failed 且不再新建 Pod,重新提交的任务在一小时内正常完成。
补一句。backoffLimit 和 restartPolicy 要一起看,OnFailure 下容器重启不算失败次数;长任务一定要配 activeDeadlineSeconds,挂住了才有人知道。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
