本文发表时间已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。
介绍索引作业
一旦你将非并行 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。