我们可以为并行作业定义两个规范:
1.具有固定完成计数的并行作业:
- 为 .spec.completions 指定一个非零正值。
- Job 代表整个任务,当 1 到范围内的每个值都有一个成功的 Pod 时完成
.spec.completions
- 尚未实现:每个 Pod 都传递了一个不同的索引,范围为 1 到 .spec.completions。
2.带有工作队列的并行作业:
例如,一个 Pod 可能会从工作队列中获取一批最多 N 个项目。每个 Pod 都能够独立地确定其所有对等点是否都已完成,从而确定整个 Job 是否已完成。
- 当 Job 中的任何 Pod 成功终止时,不会创建新的 Pod
- 一旦至少一个 Pod 成功终止并且所有 Pod 都终止,则作业成功完成
- 一旦任何 Pod 成功退出,任何其他 Pod 都不应该继续为此任务做任何工作或编写任何输出。他们都应该在退出的过程中
对于固定完成计数作业,您应该将 .spec.completions 设置为所需的完成数。你可以设置 .spec.parallelism,或者不设置它,它会默认为 1。
对于工作队列 Job,您必须保持未.spec.completions
设置,并且保留set .spec.parallelism
为非负整数。
有关如何使用不同类型作业的更多信息,请参阅作业模式部分。
您还可以查看启动控制器 pod 的单个作业:此模式是让单个作业创建一个 Pod,然后创建其他 Pod,充当这些 Pod 的一种自定义控制器。这提供了最大的灵活性,但上手可能有些复杂,并且与 Kubernetes 的集成较少。
这种模式的一个示例是一个作业,它启动一个 Pod,该 Pod 运行一个脚本,该脚本依次启动一个 Spark 主控制器(参见 spark 示例),运行一个 spark 驱动程序,然后进行清理。
这种方法的一个优点是整个过程都获得了 Job 对象的完成保证,但可以完全控制创建什么 Pod 以及如何将工作分配给它们。
同时考虑到由默认设置的作业的完成状态 - 当达到指定的成功完成次数时,它确保所有任务都得到正确处理。在所有任务完成之前应用此状态不是安全的解决方案。
您还应该知道系统中通常不再需要已完成的作业。将它们保留在系统中会给 API 服务器带来压力。如果 Job 由更高级别的控制器直接管理,例如 CronJobs,则可以由CronJobs根据指定的基于容量的清理策略来清理 Job。
这是官方文档:jobs-parallel-processing、parallel-jobs。有用的博客:文章并行工作。
编辑:
另一种选择是您可以创建特殊脚本,该脚本将不断检查您查找的值。那么就不需要使用作业了,您可以简单地使用部署。