1

我有一个简单的容器化 python 脚本,我正在尝试与 Kubernetes 并行化。此脚本会猜测散列,直到找到低于某个阈值的散列值。

我只对第一个这样的值感兴趣,所以我希望创建一个 Kubernetes 作业,它会生成工作单元n,并在一个工作单元找到合适的值后立即完成

默认情况下,Kubernetes 作业会等到所有工作 pod 完成后才会将作业标记为完成。到目前为止,我一直无法找到解决方法(文档中没有提到这种工作模式),并且一直依靠通过 bash 脚本检查裸 pod 的日志来确定是否完成。

是否有本地方法来实现这一目标?如果没有,最好的方法是什么?

4

2 回答 2

0

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

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

  • 为 .spec.completions 指定一个非零正值。
  • Job 代表整个任务,当 1 到范围内的每个值都有一个成功的 Pod 时完成 .spec.completions
  • 尚未实现:每个 Pod 都传递了一个不同的索引,范围为 1 到 .spec.completions。

2.带有工作队列的并行作业:

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

  • Pod 必须在它们自己或外部服务之间进行协调,以确定每个应该做什么。

例如,一个 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-processingparallel-jobs。有用的博客:文章并行工作

编辑:

另一种选择是您可以创建特殊脚本,该脚本将不断检查您查找的值。那么就不需要使用作业了,您可以简单地使用部署。

于 2019-11-04T09:20:40.870 回答
0

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

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

于 2019-11-03T21:27:26.180 回答