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

介绍 Indexed Jobs

将非并行 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,您只需在 Job 规范中添加 completionMode: Indexed,并使用 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 中的每个 Pod 都会获得一个不同的完成索引。为了用户的方便,控制平面设置了 JOB_COMPLETION_INDEX 环境变量,但您可以选择设置自己的将索引作为文件暴露

有关分步指南和更多示例,请参见使用静态工作分配进行并行处理的索引式 Job

未来计划

SIG Apps 设想可能会有更多的完成模式,从而为 Job API 提供更多的用例。我们欢迎您在 kubernetes/kubernetes 中提出问题并提供建议。

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

总结

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