索引模式给每个 Pod 一个编号
默认的 Job 里各个 Pod 之间没有区别;把 completionMode 设为 Indexed 后,每个 Pod 会拿到 0 到 completions 减一的专属索引,可借环境变量或注解读取,适合把一份数据集按分片分发下去的批处理任务。索引模式下每个索引都必须成功一次,总完成数等于 completions;失败重试仍使用同一个索引,不会换成别的分片,因此分片与数据的对应关系是稳定的。
基本信息
| 适用对象 | 较新版本的 Job,使用前确认集群支持该特性 |
|---|---|
| 关键字段 | completionMode、completions、parallelism |
| 索引读取方式 | 环境变量与 Pod 注解,两种方式取值一致 |
| 完成语义 | 每个索引至少成功一次才视为完成 |
| 与并行度关系 | parallelism 控制同时运行的 Pod 数,不影响总工作量 |
典型使用场景
- 数据集分片处理:按索引切分输入,多个 Pod 并行处理不同分片
- 对账与校验:把不同账户区间分给不同 Pod 处理并汇总结果
- 渲染与转码:按序号分配待处理文件列表,避免互相争抢
- 多分区数据库导出:每个索引对应一个分区,便于并行导出
- 重跑验证:失败索引单独重试,不必整批重来
配置示例
配置示例
apiVersion: batch/v1
kind: Job
metadata:
name: shard-job
namespace: prod
spec:
completionMode: Indexed
completions: 8 # 共 8 个索引,0 到 7
parallelism: 4 # 同时最多运行 4 个
backoffLimit: 2
template:
spec:
restartPolicy: Never
containers:
- name: shard
image: registry.example.com/worker:2.0
command: ["sh", "-c", "./work --shard=${JOB_COMPLETION_INDEX}"]观察与定位
观察与定位
kubectl get pods -l job-name=shard-job -o custom-columns='POD:.metadata.name,INDEX:.metadata.annotations.batch\\.kubernetes\\.io/job-completion-index'
kubectl get job shard-job -o jsonpath='{.status.completedIndexes}'
kubectl get job shard-job -o jsonpath='{.status.succeeded}/{.spec.completions}'
kubectl describe job shard-job | tail -20关键字段与影响
| 字段 | 含义 | 注意 |
|---|---|---|
| completionMode | Indexed 或 NonIndexed | 切换等于改变任务模型 |
| completions | 需要完成的总索引数 | 必须与数据分片数对齐 |
| parallelism | 同时运行的 Pod 数 | 影响资源占用与总耗时 |
| 索引取值 | 0 到 completions 减一 | 重试保持同一索引 |
静态分片与索引模式最匹配:分片数固定时索引与数据的映射稳定,重跑不会错位,也便于按索引核对处理进度。
索引与数据的映射由应用自己负责:Kubernetes 只提供编号,不会替你做数据切分、去重或进度记录,后者需要任务自身或外部存储实现。