Kubernetes v1.37 PodFailurePolicy 如何核对失败分类
来源:17golang原创
时间:2026-09-14 11:25:25 249浏览 收藏
在 Kubernetes v1.37 集群里,Job 失败不一定都应该继续重试:应用明确返回的缺陷码、节点扰动和普通执行失败,处理策略可能完全不同。核对 PodFailurePolicy 时,先看规则是否命中,再看 Job 状态,而不是只盯着 backoffLimit。要注意,PodFailurePolicy 不是 v1.37 才新增的能力,它从 v1.31 起已经稳定;v1.37 只是本文选定的运行环境。
官方文档:https://kubernetes.io/docs/tasks/job/pod-failure-policy/
- 策略规则按顺序匹配,首个命中的规则决定
FailJob、Ignore、Count或FailIndex。 - 使用
podFailurePolicy时,Job 模板的restartPolicy必须为Never;未命中的失败继续按默认重试逻辑处理。 FailureTarget表示控制器已经触发失败终止,Failed是所有相关 Pod 处理完后的终态条件。
先把 v1.37 的失败分类边界画清楚
一份可核对的 Job 配置,至少要让输入和结果一一对应。下面的示例把退出码 42 视为不可重试的应用缺陷,把 DisruptionTarget 视为节点或平台扰动;其他失败不匹配这两条规则时,仍然交给默认的 backoffLimit 计数。
apiVersion: batch/v1
kind: Job
metadata:
name: failure-classification-demo
spec:
backoffLimit: 3
template:
spec:
restartPolicy: Never # 使用 PodFailurePolicy 时必须固定为 Never
containers:
- name: worker
image: bash:5
command: ["bash", "-c"]
args: ["echo simulated failure; exit 42"] # 42 进入 FailJob 规则
podFailurePolicy:
rules:
- action: FailJob # 应用明确返回缺陷码时立即结束 Job
onExitCodes:
containerName: worker
operator: In
values: [42]
- action: Ignore # 受扰动的 Pod 不增加 backoffLimit 计数
onPodConditions:
- type: DisruptionTarget
规则顺序很重要:控制器只处理第一个匹配项。FailJob 会把 Job 标记为失败并终止仍在运行的 Pod;Ignore 不增加失败计数并创建替代 Pod;Count 使用默认处理方式并增加 backoffLimit 计数;FailIndex 只适用于配置了按索引重试的 Indexed Job。
| 输入现象 | 匹配条件 | 应核对的结果 |
|---|---|---|
| 容器以 42 退出 | onExitCodes | 立即进入 Job 失败终止流程 |
Pod 带 DisruptionTarget | onPodConditions | 不增加重试计数,重新创建 Pod |
| 其他失败 | 没有规则命中 | 按默认方式计入 backoffLimit |

用 Job 状态确认控制器到底判成了什么
只看 Pod 的 phase: Failed 还不够。先看 Job 的条件和计数,再回到具体 Pod 的退出码、条件与日志,才能确认是策略命中,还是普通重试耗尽。核对命令可以保持短而固定:
# 先确认 API Server 的版本,再确认目标 Job 的策略字段
kubectl version
kubectl get job failure-classification-demo -o yaml
# 抽取 Job 条件,比较 FailureTarget 与最终 Failed 的 reason/message
kubectl get job failure-classification-demo -o jsonpath='{range .status.conditions[*]}{.type}{"\t"}{.reason}{"\t"}{.message}{"\n"}{end}'
# 对照 Pod 的阶段、退出码和扰动条件,定位究竟是哪条规则可匹配
kubectl get pods -l job-name=failure-classification-demo -o yaml
如果 FailJob 命中,通常先看到 FailureTarget,其 reason 会指向 PodFailurePolicy;控制器开始终止仍处于 Pending 或 Running 的 Pod,待相关 Pod 终止后再写入 Failed。因此,核对过程中短暂看到“已触发失败但终态还没出现”并不矛盾。
如果命中 Ignore,重点看 status.failed 是否没有因为这次扰动增加,并确认是否出现替代 Pod。没有匹配到任何规则时,不能把“没有 FailureTarget”当成策略失效:它可能只是走了默认的 Count 路径,最终在 backoffLimit 达到后才失败。

这几个边界最容易把分类看错
- 把规则顺序当成并行判断。一条失败不会同时执行多个 action,先把更具体的退出码规则放在前面,再放通用的 Pod 条件规则。
- 把终止中的 Pod 当成最终失败。配置策略后,控制器会关注 Pod 是否已经进入终态;删除时间戳出现,不代表策略已经完成分类。
- 用
status.failed推断所有失败。Ignore 不增加该计数,FailJob 也可能先出现 FailureTarget,再出现最终 Failed,必须连同 conditions 一起看。 - 把 v1.37 发布说明当成字段定义。版本页用于确认集群所处发布线,字段、action 和条件语义仍应以 Job API 与任务文档为准。
生产排查时,我会把“输入证据—规则索引—Job 条件—重试计数”放在同一条记录里。这样即使 Pod 已被替换,也能从 Job 的 message 和保留的 Pod 日志回溯最初的失败分类。
常见问题
PodFailurePolicy 能和 restartPolicy: OnFailure 一起用吗?
不能。Job 模板使用 PodFailurePolicy 时,restartPolicy 必须为 Never;容器内重启会改变失败计数的观察方式。
为什么规则都没有命中,却还是创建了新 Pod?
未命中时会走默认处理,通常表现为失败计入 backoffLimit 并按 Job 的重试逻辑创建替代 Pod。应检查退出码、Pod 条件和容器名称是否与规则完全一致。
FailureTarget 出现后为什么还看不到 Failed?
FailureTarget 是终止流程的触发信号;Job 控制器还要等待相关 Pod 终止,之后才写入最终的 Failed 条件。
-
Golang · Go教程 | 3个月前 | 性能优化 · kubernetes · Go教程 · 生产实践 · Go1.25 · golang Go Kubernetes 性能优化 GOMAXPROCS473 收藏
-
Golang · Go教程 | 3个月前 | 超时控制 · 故障排查 · Go教程 · 后端工程 · Golang实战 · HTTP客户端 · golang Go 性能优化 net/http context Transport 超时 http.Client 生产实践205 收藏
-
Golang · Go教程 | 2个月前 | 并发 · HTTP · 性能优化 · 故障排查 · Go教程 · Go Goroutine 连接复用 pprof http.Client close Response.Body201 收藏
-
Golang · Go教程 | 1个月前 | golang · JSON · 故障排查 · Go教程 · 接口设计 · JSON Go 接口兼容性 DisallowUnknownFields 严格解码174 收藏
-
Golang · Go教程 | 1个月前 | 容器 · go · 性能 · kubernetes · 运行时 · Kubernetes GOMAXPROCS cgroup Go 1.25 容器 CPU 限额438 收藏
-
298 收藏
-
科技周边 · 业界新闻 | 21小时前 | 云原生 · kubernetes · Gateway API · 网络迁移 · ingress 路由迁移 Gateway API Ingress2Gateway ingress-nginx335 收藏
-
195 收藏
-
291 收藏
-
科技周边 · 业界新闻 | 1天前 | 云原生 · kubernetes · 版本兼容 · Metrics API · Kubernetes metrics.k8s.io Metrics API v1.37 客户端兼容性161 收藏
-
科技周边 · 业界新闻 | 1天前 | 云原生 · Etcd · 性能优化 · kubernetes · 控制面 · Kubernetes v1.37 etcd RangeStream EtcdRangeStream listStream 大列表内存346 收藏
-
139 收藏
-
488 收藏
-
313 收藏
-
427 收藏
-
380 收藏
-
120 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习