本文发表时间已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。

介绍索引作业

一旦你将非并行 Job 容器化,就可以很容易地在 Kubernetes 上启动并运行它,而无需修改二进制文件。在大多数情况下,当运行并行分布式 Job 时,你必须设置一个单独的系统来在工作节点之间划分工作。例如,你可以设置一个任务队列来为每个 Pod 分配一个工作项在队列为空之前为每个 Pod 分配多个项

Kubernetes 1.21 版本引入了一个新字段来控制 Job 的完成模式,这是一个配置选项,允许你控制 Pod 完成如何影响 Job 的整体进度,目前有两个可能的选项:

  • NonIndexed (默认):当成功完成的 Pod 数量等于 .spec.completions 中指定的数量时,Job 被认为已完成。换句话说,每个 Pod 的完成都是同源的。你在引入完成模式之前创建的任何 Job 都隐式地是 NonIndexed。
  • Indexed:当每个索引从 0 到 .spec.completions-1 都有一个成功完成的 Pod 与之关联时,Job 被认为已完成。该索引以 batch.kubernetes.io/job-completion-index 注释和 JOB_COMPLETION_INDEX 环境变量的形式暴露给每个 Pod。

你可以开始使用具有索引完成模式的 Job,或者简称索引 Job,来轻松启动并行 Job。然后,每个工作 Pod 可以根据索引静态分配数据的分区。这省去了你设置排队系统的麻烦,甚至不需要修改你的二进制文件!

创建索引 Job

要创建索引 Job,你只需将 completionMode: Indexed 添加到 Job 规范中,并使用 JOB_COMPLETION_INDEX 环境变量。

apiVersion: batch/v1
kind: Job
metadata:
  name: 'sample-job'
spec:
  completions: 3
  parallelism: 3
  completionMode: Indexed
  template:
    spec:
      restartPolicy: Never
      containers:
      - command:
        - 'bash'
        - '-c'
        - 'echo "My partition: ${JOB_COMPLETION_INDEX}"'
        image: 'docker.io/library/bash'
        name: 'sample-load'

请注意,完成模式是 1.21 版本中的一个 alpha 功能。要在你的集群中使用它,请确保在 API 服务器控制器管理器上启用 IndexedJob 特性门控

当你运行示例时,你会看到创建的三个 Pod 中的每一个都获得了不同的完成索引。为了用户的方便,控制平面设置了 JOB_COMPLETION_INDEX 环境变量,但你可以选择设置你自己的将索引作为文件暴露

请参阅 使用静态工作分配进行并行处理的索引 Job 以获取分步指南和更多示例。

未来计划

SIG Apps 设想可能有更多的完成模式可以为 Job API 提供更多用例。我们欢迎你在 kubernetes/kubernetes 中提出你的建议。

特别地,我们正在考虑一种 IndexedAndUnique 模式,其中索引不仅以注释的形式可用,而且它们是 Pod 名称的一部分,类似于StatefulSet。这应该有助于紧密耦合的 Pod 之间的 Pod 间通信。你可以在开放问题中加入讨论。

总结

索引 Job 允许你在并行 Job 的工作节点之间静态地划分工作。SIG Apps 希望这个功能能够促进更多批处理工作负载迁移到 Kubernetes。