如何实现Kubernetes Job被驱逐时重启、运行失败时不重启?
Kubernetes Job 区分驱逐与业务失败的重启配置方案
你的需求可以通过Kubernetes原生配置实现,核心是利用Job控制器对Pod终止原因的判断逻辑,区分节点缩容驱逐导致的Pod终止和业务错误/资源超限导致的容器退出,分别配置不同的重启策略。
配置逻辑说明
- 节点驱逐属于集群侧触发的Pod外部终止事件,终止原因为
Evicted,这类终止不会被计入Job的backoffLimit计数,Job控制器会自动创建新的Pod调度到其他可用节点 - 容器非零退出、资源超限被OOM杀掉属于业务侧触发的内部终止事件,会被识别为执行失败,可以通过配置禁止这类场景的重启
推荐配置示例
apiVersion: batch/v1 kind: Job metadata: name: custom-restart-job spec: backoffLimit: 0 # 禁止业务失败后Job级别的新Pod重建 template: spec: restartPolicy: Never # 禁止业务失败后的容器原地重启 containers: - name: work-container image: your-business-image:v1 resources: requests: cpu: "1" memory: "2Gi" limits: cpu: "1" memory: "2Gi" # 可选配置:设置节点临时异常时的容忍时间,避免误驱逐 tolerations: - key: "node.kubernetes.io/not-ready" operator: "Exists" effect: "NoExecute" tolerationSeconds: 300
注意事项
- 若使用Kubernetes 1.23之前的版本,可执行
kubectl describe pod <被驱逐的Pod名称>查看Termination Reason字段,确认驱逐事件的原因是否为Evicted,部分旧版本的自定义驱逐规则可能会被误识别为业务失败 - 若需要限制驱逐后的总重建次数,可在Job spec下添加
activeDeadlineSeconds参数,设置Job的最长存活时间,超过该时间后所有Pod会被直接终止,避免极端场景下的资源浪费
内容的提问来源于stack exchange,提问作者interfect
相关产品推荐
相关产品推荐

