当一个工人吊舱成功时,完成并行的Kubernetes作业

时间:2019-11-02 12:59:35

标签: kubernetes kubernetes-jobs

我有一个简单的容器化python脚本,正在尝试与Kubernetes并行化。该脚本会猜测哈希,直到找到低于特定阈值的哈希值为止。

我只对第一个这样的值感兴趣,因此我希望创建一个Kubernetes作业,该作业会生成n个工作包,并在一个工作包找到合适的值后立即完成。

默认情况下,Kubernetes作业要等到所有个工作单元完成后,才能将作业标记为已完成。到目前为止,我一直无法找到解决这个问题的方法(documentation中没有提及此工作模式),并且一直依靠通过bash脚本检查裸荚的日志来确定一个是否完成。

是否有实现此目标的本地方法?而且,如果没有,最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

嗨,请看此链接https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#parallel-jobs

我从未尝试过,但是似乎可以启动多个Pod,并在x Pod完成后配置作业的结束。在您的情况下,x为1。

答案 1 :(得分:0)

我们可以为并行作业定义两个规范:

1。具有固定完成计数的并行作业:

  • 为.spec.completions指定一个非零的正值。
  • 工作代表总体任务,在有任务时完成 每个值1到1的成功Pod .spec.completions
  • 尚未实现:每个Pod在 范围为1到.spec.completions。

2。具有工作队列的并行作业:

  • 不指定.spec.completions,默认为.spec.parallelism

  • 豆荚必须在彼此之间或外部服务之间进行协调,以 确定每个对象应该做什么。

例如,一个Pod可以从工作队列中获取最多N个项目的批处理。 每个Pod都可以独立地确定其所有对等方是否都已完成,从而确定了整个Job。

  • 工作中的任何Pod成功终止时,没有新的Pod 已创建
  • 至少有一个Pod成功终止,并且所有Pod 终止,则作业成功完成
  • 任何Pod成功退出后,就不应再有其他Pod 为此任务做任何工作或编写任何输出。他们都应该 即将退出

对于固定完成次数计数作业,应将.spec.completions设置为所需的完成次数。您可以设置.spec.parallelism,也可以将其保留为默认值。

对于工作队列Job ,必须将.spec.completions保留为未设置状态,并将set .spec.parallelism保留为非负整数。

有关如何利用不同类型的作业的更多信息,请参见job patterns部分。

您还可以查看启动控制器容器的单个作业: 此模式用于单个Job创建Pod,然后再创建其他Pod,充当这些Pod的自定义控制器。这样可以提供最大的灵活性,但是入门起来可能会有些复杂,并且与Kubernetes的集成较少。

这种模式的一个示例是Job,它启动一个Pod,该Pod运行一个脚本,该脚本依次启动一个Spark主控制器(请参见spark示例),运行一个spark驱动程序,然后清理。

此方法的优点是,整个过程获得Job对象的完成保证,但可以完全控制创建哪些Pod以及如何将工作分配给它们。

同时要考虑由dafault设置的Job的完成状态-当达到指定的成功完成数量时,请确保正确处理所有任务。在所有任务完成之前应用此状态不是安全的解决方案。

您还应该知道,系统通常不再需要完成的作业。将它们保留在系统中会给API服务器带来压力。如果作业由更高级别的控制器(例如CronJobs)直接管理,则可以基于指定的基于容量的清除策略由CronJobs清除作业。

以下是官方文档:jobs-parallel-processing parallel-jobs。 有用的博客:article-parallel job

编辑:

另一个选择是,您可以创建特殊脚本,该脚本将连续检查您要查找的值。这样就不需要使用job了,您只需使用部署即可。