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