Job详解
Job 表示一次性任务,运行完就会停止:它创建一个或多个 Pod,并持续重试,直到成功终止的 Pod 数量达到要求。与 Deployment/RS 管"永不退出的服务"完全相反——Job 管的 Pod 以终止为成功,控制器一旦把 Pod 拉起来就不会让它常驻。删除 Job 会清除全部 Pod;挂起 Job 会先删掉所有活跃 Pod,恢复后再重跑。
工作原理:三个关键计数器

理解 Job 就是理解三个数字的关系:
- completions:要成功完成多少个 Pod(默认 1),达到即 Complete;
- parallelism:同时最多跑几个(默认 1),设 0 相当于暂停;
- backoffLimit:失败重试上限(默认 6),达到即 Failed——永久失败,不再重启,需要人工介入。
两个容易忽略的机制:
- 记账靠 Finalizer:Job 创建的 Pod 带着
batch.kubernetes.io/job-trackingFinalizer,控制器把 Pod 计入状态后才移除它——保证完成计数不重不漏(GA v1.26)。 - restartPolicy 只能是 Never 或 OnFailure:
Always对 Job 不合法(Pod 模板不写时默认值恰是 Always,必须显式改掉)。两者取舍:Never时 Pod 失败整个重建,原 Pod 保留、日志好查;OnFailure时容器在原 Pod 内重启,省对象但达到重试上限时 Pod 被原地终止、难调试。 .spec.selector不需要手动设置,系统会自动填充一个不重叠的选择算符。
快速上手
cat > job.yaml << 'EOF'
apiVersion: batch/v1 # Job/CronJob 属于 batch API 组
kind: Job
metadata:
name: pi
spec:
# completions: 10 # 期望成功完成的 Pod 数(默认 1);不设则为工作队列模式
# parallelism: 3 # 同时最多运行几个 Pod(默认 1);设 0 相当于暂停
# completionMode: Indexed # 给每个 Pod 发索引 0~completions-1(默认 NonIndexed)
template: # .spec 中唯一必需的字段:Pod 模板
spec:
restartPolicy: Never # 【Job 特有约束】只能 Never 或 OnFailure,不能 Always
containers:
- name: pi
image: perl:5.34.0
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
backoffLimit: 4 # 失败重试上限(默认 6),超过则 Job 标记 Failed(永久失败)
# activeDeadlineSeconds: 100 # 整个 Job 的生命期限时;优先级高于 backoffLimit,到点全停
# ttlSecondsAfterFinished: 100 # Job 结束 100 秒后自动删除(级联清 Pod);建议总是设置
# suspend: false # 置 true 挂起:终止所有运行中的 Pod,恢复后 deadline 计时重置
EOF
kubectl apply -f job.yaml
kubectl describe job pi
describe 输出的关键字段:
Parallelism: 1 # 当前并行度
Completions: 1 # 目标成功数
Pods Statuses: 0 Running / 1 Succeeded / 0 Failed
Events:
Normal SuccessfulCreate ... Created pod: pi-xf9p4
Normal Completed ... Job completed
取任务输出(靠自动标签 batch.kubernetes.io/job-name 筛选):
pods=$(kubectl get pods --selector=batch.kubernetes.io/job-name=pi \
--output=jsonpath='{.items[*].metadata.name}')
kubectl logs $pods
# 3.14159265358979323846...
三种并行模式

| 模式 | completions | parallelism | 适用 |
|---|---|---|---|
| 非并行 | 不设置(=1) | 不设置(=1) | 一次性脚本、迁移 |
| 固定完成数并行 | W(工作条目数) | 期望并发数 | 可分片的批量任务 |
| 工作队列并行 | 不设置(=parallelism) | 任意 | 任务数不定的队列消费 |
Indexed 模式(completionMode: Indexed,GA v1.24)值得单独记:每个 Pod 拿到 0 ~ completions-1 的索引,每个索引恰好一个成功的 Pod 即完成。索引通过环境变量 JOB_COMPLETION_INDEX、主机名 <job>-<index>(配 Service 可互相寻址)、注解/标签获取——MPI、PyTorch 分布式训练、静态任务分派都靠它。注意同一索引可能因节点故障被启动多次,只有第一个成功的计入,其余同索引 Pod 会被删掉。