我有一个简单的容器化python脚本,正在尝试与Kubernetes并行化。该脚本会猜测哈希,直到找到低于特定阈值的哈希值为止。
我只对第一个这样的值感兴趣,因此我希望创建一个Kubernetes作业,该作业会生成n
个工作包,并在一个工作包找到合适的值后立即完成。
默认情况下,Kubernetes作业要等到所有个工作单元完成后,才能将作业标记为已完成。到目前为止,我一直无法找到解决这个问题的方法(documentation中没有提及此工作模式),并且一直依靠通过bash脚本检查裸荚的日志来确定一个是否完成。
是否有实现此目标的本地方法?而且,如果没有,最好的方法是什么?
答案 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
2。具有工作队列的并行作业:
不指定.spec.completions,默认为.spec.parallelism
豆荚必须在彼此之间或外部服务之间进行协调,以 确定每个对象应该做什么。
例如,一个Pod可以从工作队列中获取最多N个项目的批处理。 每个Pod都可以独立地确定其所有对等方是否都已完成,从而确定了整个Job。
对于固定完成次数计数作业,应将.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了,您只需使用部署即可。