将 Pod 添加到由 CronJob 创建的 kubernetes 作业

问题描述

我有一个 CronJob,它被定义为禁止并发 (concurrencyPolicy: Forbid)。现在,由 CronJob 本身由 Job 启动的 Pod 会产生一个 Pod(这不在我的控制范围内),而该 Pod 又可能会也可能不会产生 Pod。

··········> ··········> time ··········> ··········>

CronJob
    |
    +-----------------------+----····
    |                       |
  schedules               schedules
    |                       |
    v                       v
first Pod ~~~> Exit.    first Pod ~~~> Exit.
    |                       |
  spawns                  spawns
    |                       |
    |                       ? SECOND COMING OF SECOND POD CONCURRENT WITH FirsT
    v                       
second Pod ~~~~~~ still running ~~~~~~>

现在第一个 Pod 退出相当快,留下 CronJob 控制器的印象是作业已完成。但该作业实际上仍在运行,因为它产生了一个 Pod。因此,下次 CronJob 调度 Job 时,它可能会产生一个 Pod,该 Pod 与第一个调度的 Job 产生的其他 Pod 并发运行。这正是我想要阻止的。

有没有办法让我的第一个豆荚(我可以完全控制第一个豆荚,除了它产生一个豆荚而且我无法控制那个豆荚中发生的事情或它是如何产生的,但我可以设置标签和注释)以某种方式将连续生成的 Pod 添加到当前 Job 中,这样只有在这些 Pod 返回时才认为它已完成?


我目前的方法是我自己检查这些生成的 pod,但这很乏味,我更喜欢 kubernetes 中是否已经有解决方案。此外,它也只是我的基础设施,因为清理工作剩余的垃圾收集器也会清理这些 pod。

解决方法

我担心 kubernetes 无法为您处理。我会说它是关于应用程序逻辑的。 Kubernetes Pod 不知道它产生了一个不同的 Pod 或者这样的 Pod 是由它产生的。

第二个 Pod 由您在第一个 Pod 中运行的应用生成,该应用负责处理此过程。它可能会监视此类 Pods 并仅在所有此类子 Pods 终止时退出。您可以将其与 OS 上的进程管理进行比较,其中 perant 进程通常不会在终止其子进程之前退出。

您也可以考虑实施 container lifecycle hooks,以便您的父母 Pods 得到通知,例如当子 Pod 完成其工作并终止时。