我有一个定义为禁止并发(concurrencyPolicy: Forbid
)的CronJob。现在,由作业通过CronJob本身启动的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调度作业时,它可能会生成一个Pod,该Pod与第一个调度作业生成的其他Pod并发运行。这正是我想要阻止的。
是否有一种方法,我的第一个pod(我完全控制第一个pod,除了它产生一个pod,我不控制在那个pod中发生了什么,或者它是如何产生的,但我可以设置标签和注释)以某种方式将连续产生的pod添加到当前的作业,这样它只被视为完成一旦这些pod返回?
我目前的方法是我自己检查这些衍生的pod,但这很乏味,我更希望kubernetes已经有解决方案了。此外,它还会简单地将我的基础设施作为垃圾收集器来清理作业残留物,然后也会清理这些pod。
我怕kubernetes我没办法帮你搞定。我认为这是应用程序逻辑的问题。KubernetesPod
不知道它生成了一个不同的Pod
,也不知道它生成了一个不同的Pod
。
第二个Pod
是由你的应用程序在第一个Pod
中运行产生的,这个应用程序负责处理这个过程。它可以监视这样的Pods
,只有当所有这样的子Pods
都被终止时才退出。您可以将其与操作系统上的进程管理进行比较,在操作系统中,允许的进程通常在终止其子进程之前不会退出。
你也可以考虑实现容器生命周期钩子,以便你的父Pods
得到通知,例如当子Pod
完成它的工作并终止时。