【问题标题】:Pod time-limit in Kubernetes job -- .spec.activeDeadlineSeconds per podKubernetes 作业中的 Pod 时间限制——每个 pod .spec.activeDeadlineSeconds
【发布时间】:2020-08-12 09:57:04
【问题描述】:

正如Kuberenetes docs 中关于工作主题的解释:

activeDeadlineSeconds 适用于作业的持续时间,无论创建了多少 Pod。一旦 Job 到达 activeDeadlineSeconds,其所有正在运行的 Pod 都将终止,并且 Job 状态将变为 type: Failedreason: DeadlineExceeded

但是,我想做的是限制每个pod的时间。如果一个 pod 花费的时间太长,我希望它失败,但我希望其他 pod 继续运行,并在必要时为该作业创建更多 pod。

我将解释一下我的任务,只是为了让问题变得清晰。该作业包括从 Redis 数据库中获取项目,其中数据库用作一种队列。每个 pod 处理一个项目(好吧,数量可能会有所不同)。如果一个 pod 处理一个项目的时间太长,我希望它失败。但是,其他 pod 应该继续,作业应该继续创建 pod 并从数据库中检索更多项目。

【问题讨论】:

    标签: kubernetes containers kubectl


    【解决方案1】:

    您的用例似乎与 kubernetes 文档中的 this example 相同。
    正如您所说,activeDeadlineSeconds 不是您应该在此处使用的参数。

    如果 pod 无法在给定的时间范围内处理项目,我不确定您为什么希望 pod 失败。我在这里看到了一些您可以采用的不同方法,但是需要更多有关您问题性质的信息才能知道该采用哪种方法。 解决问题的一种方法是将作业并行度设置为您希望同时运行的 pod 数量,并在代码本身中设置此行为 -

    • 如果延迟处理的问题是暂时的,您可能希望终止当前事务,将项目保留在队列中并重新开始处理同一项目
    • 如果同一个项目失败 x 次,则应将其从队列中移除并推送到某种死信队列,等待稍后的故障排除

    另一种方法是将队列中的消息扇出,为每条消息生成一个工作 pod,与 this example 描述的相同。
    选择这个解决方案确实会导致每个 pod 花费太长时间来处理 item 失败,如果你将你创建的 pod 的 restartPolicy 设置为 never 你应该有一个失败的 pod 列表,对应于处理失败的项目数。

    说了这么多,我不让 pod 失败是正确的方法,应该使用检测来跟踪失败的处理事件,无论是通过容器日志还是指标。

    【讨论】:

    • 之所以看起来像 Fine Parallel Processing Using a Work Queue 示例,是因为我将它用作模板 :)
    • 我认为您可能是对的,最好将这种行为编程到自己的代码中。
    • 由于您似乎很好奇,如果 Pod 没有在给定的时间范围内完成,为什么我希望它们失败,我将详细说明用例。我正在处理大规模数据分析,并希望模仿 SLURM 和 Torque 等批处理调度框架的行为,并且我希望能够定义 walltime。根据我的经验,walltime 是这些系统中的必需参数。你必须估计你的预期挂壁时间。本质上,一个作业正在排队获取资源,如果分析花费的时间太长,您希望释放这些资源,以便其他人可以使用它们。
    • 有一些框架可以在 Kubernetes 中更健壮地实现这些类型的东西,例如 kube-batch,但我们还没有时间实现这样的东西,所以我更多地手动做事情.
    • 感谢@YaronIdan 的帮助。我想这里没有简单的解决方案,只需要认真思考。
    猜你喜欢
    • 1970-01-01
    • 2019-03-16
    • 2019-09-09
    • 1970-01-01
    • 2018-08-24
    • 2019-11-21
    • 2022-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多