以下是对 Kubernetes Job 行为的校对、补充以及示例,以 Markdown 源码形式完整呈现:
校对与补充
1) 任务完成后的 Pod 状态与清理
- 完成后的 Pod 会进入
Completed状态,默认不会自动删除;删除该 Job 会级联清理它创建的 Pod。适合保留用于排错与验收。(kubernetes.io) - 如需自动回收,用 TTL-after-finished:在 Job 加上
.spec.ttlSecondsAfterFinished,到期后 Job 连同其 Pod 一起被删除(级联删除)。该机制已稳定(v1.23+)。(kubernetes.io)
你文中“永久保留,必须手动删除”这句建议改为:“默认保留;可用 TTL 自动清理或手动删除 Job 以级联清理”。
2) 失败与重试(backoffLimit、重启策略)
- 默认
backoffLimit是 6(不是 7)。达到该阈值后 Job 标记为失败,事件里常见BackoffLimitExceeded / Job has reached the specified backoff limit。(kubernetes.io, stackoverflow.com) - 允许的
restartPolicy只有Never和OnFailure:Never:每次失败新建 Pod重试(因此看到多个失败的 Pod)。OnFailure:同一个 Pod 内重启容器,失败计数也会累计。
官方文档明确限制与行为。(kubernetes.io)
- 计数/观察现象小贴士:当
restartPolicy: Never时,通常会看到失败 Pod 数≈ backoffLimit,而“尝试次数”常被直观理解为“初次 + 重试”,所以有人会口头说“n+1 次尝试”。以实测为准,并以kubectl describe job中的事件为权威。(stackoverflow.com)
3) 挂起/恢复(suspend)
- 在 Job 规约中设置
suspend: true时,控制器不会创建 Pod;把它改回false即刻恢复执行。该能力从 1.21 引入并随后成熟。(kubernetes.io)
4) 查看状态与失败原因(诊断)
- 列出 Job 产生的 Pod 名称并看日志(官方推荐示例): 上述命令和写法见官方 Job 文档示例。(kubernetes.io)
1
2
3
4
5
6
7
8
9# 列出 Job 的 Pod
pods=$(kubectl get pods -l batch.kubernetes.io/job-name=<job-name> -o jsonpath='{.items[*].metadata.name}')
echo $pods
# 看其中一个 Pod 的日志
kubectl logs $pods
# 直接看 Job 聚合日志(kubectl 支持 TYPE/NAME)
kubectl logs job/<job-name> - 进一步排错: 典型事件文案可见于社区问答截图与复现。(stackoverflow.com)
1
2# 看 Job 详情与事件(是否触发 BackoffLimitExceeded 等)
kubectl describe job/<job-name>
最小 YAML 示例
A. 常规一次性任务(自定义重试次数 + 自动清理)
1 | apiVersion: batch/v1 |
(backoffLimit 默认值与 restartPolicy 限制:官方文档)(kubernetes.io)
(TTL 自动清理机制与级联删除:官方文档)(kubernetes.io)
B. 挂起后再恢复执行
1 | apiVersion: batch/v1 |
- 创建后可用
kubectl edit job suspended-job将suspend: false,即刻开始执行。(kubernetes.io)
常用排障清单(拎包即用)
1 | # 1) 看 Job 列表与完成度 |
(命令与示例出自官方文档 Job 页面)(kubernetes.io)