首页/云/Kubernetes 速查/Job 索引模式(completionMode: Indexed)

Job 索引模式(completionMode: Indexed)

每个 Pod 获得专属索引(0..completions-1,环境变量 JOB_COMPLETION_INDEX 或注解),适合分片处理数据集。

Kubernetes 速查云更新于 2026-10-13

索引模式给每个 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

关键字段与影响

字段含义注意
completionModeIndexed 或 NonIndexed切换等于改变任务模型
completions需要完成的总索引数必须与数据分片数对齐
parallelism同时运行的 Pod 数影响资源占用与总耗时
索引取值0 到 completions 减一重试保持同一索引
静态分片与索引模式最匹配:分片数固定时索引与数据的映射稳定,重跑不会错位,也便于按索引核对处理进度。
索引与数据的映射由应用自己负责:Kubernetes 只提供编号,不会替你做数据切分、去重或进度记录,后者需要任务自身或外部存储实现。

易错点

  • 分片数变化却不同步调整映射:重跑时对着错误的分片,出现结果缺失或重复处理
  • 在旧版本集群使用该模式:Job 创建直接被拒绝,容易误判为权限或命名空间问题
  • parallelism 设置过小:总耗时被拉长,看起来像任务卡住
  • 缺少幂等与进度记录:索引重试时重复处理数据,汇总结果出现重复计数

数据来源与参考

  • Kubernetes 官方文档 · Job(Indexed completion mode)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌