这篇文章已超过一年。较旧的文章可能包含过时的内容。请检查页面信息自发布以来是否已不正确。
介绍 Indexed Jobs
一旦将非并行Job 容器化后,无需修改二进制文件即可轻松在 Kubernetes 上运行它。在大多数情况下,运行并行分布式 Job 时,你必须设置一个单独的系统来在工作节点之间划分工作。例如,你可以设置一个任务队列来为每个 Pod 分配一个工作项,或者为每个 Pod 分配多个工作项直到队列为空。
Kubernetes 1.21 版本引入了一个新的字段来控制 Job 的 completion mode(完成模式),这个配置选项允许你控制 Pod 的完成如何影响 Job 的整体进度,目前有两个可选模式:
NonIndexed
(默认):当成功完成的 Pod 数量等于.spec.completions
中指定的数量时,Job 被视为完成。换句话说,每个 Pod 的完成是同质的。在引入完成模式之前创建的任何 Job 都隐式地是 NonIndexed。Indexed
:当每个索引(从 0 到.spec.completions-1
)都有一个关联的成功完成的 Pod 时,Job 被视为完成。该索引通过batch.kubernetes.io/job-completion-index
Annotation 和JOB_COMPLETION_INDEX
环境变量暴露给每个 Pod。
你可以开始使用带有 Indexed 完成模式的 Job,简称 Indexed Job,来轻松启动并行 Job。然后,每个工作 Pod 可以根据索引静态地分配一部分数据。这省去了你设置队列系统甚至修改二进制文件的麻烦!
创建一个 Indexed Job
要创建一个 Indexed Job,你只需要在 Job Spec 中添加 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 server 和 controller manager 上启用 IndexedJob
feature gate。
运行示例时,你会看到创建的三个 Pod 各自获取了不同的完成索引。为了用户的方便,控制平面设置了 JOB_COMPLETION_INDEX
环境变量,但你也可以选择设置自己的,或者将索引暴露为一个文件。
有关详细分步指南和更多示例,请参阅使用静态工作分配进行并行处理的 Indexed Job。
未来计划
SIG Apps 设想可能还会有更多的完成模式,以支持 Job API 的更多用例。欢迎你在 kubernetes/kubernetes 中提出 Issue 并提供你的建议。
特别地,我们正在考虑一种 IndexedAndUnique
模式,其中索引不仅作为 Annotation 可用,而且是 Pod 名称的一部分,类似于 StatefulSet。这应该有助于紧密耦合的 Pod 之间的通信。你可以加入 相关 Issue 中的讨论。
总结
Indexed Job 允许你静态地将工作划分给并行 Job 的工作节点。SIG Apps 希望此功能有助于将更多批处理工作负载迁移到 Kubernetes。