Kubernetes cronjobs中的`startingDeadlineSeconds`是什么意思?

43
在Kubernetes的cronjobs中,文档限制部分指出:

如果CronJob控制器在CronJob开始时间之前的一段时间内或从开始时间到开始时间加上startingDeadlineSeconds之间停止或出现故障,并且该时间跨越多个开始时间并且concurrencyPolicy不允许并发,则作业可能无法运行。

我理解的是,如果将startingDeadlineSeconds设置为10,并且由于某些原因未能在计划时间启动,则只要这10秒尚未过去,就可以尝试再次启动,但是在10秒后,它肯定不会启动,这样理解是否正确?
另外,如果我将concurrencyPolicy设置为Forbid,那么当已经有一个cronjob正在运行时,如果又尝试调度另一个cronjob,K8s会将其视为失败吗?
1个回答

77

在调查Kubernetes仓库的代码库之后,发现CronJob控制器是这样工作的:

  1. CronJob控制器每隔10秒钟检查一次给定Kubernetes客户端中的cronjob列表。

  2. 对于每个CronJob,它会检查从lastScheduleTime到现在的持续时间内错过了多少个计划。如果有超过100个错过的计划,则不会启动该作业并记录事件:

    "FailedNeedsStart", "无法确定是否需要启动作业。错过太多启动时间(> 100)。请设置或减小 .spec.startingDeadlineSeconds 或检查时钟偏差。"

请注意,如果字段 startingDeadlineSeconds 被设置(非 nil ),它将计算从 startingDeadlineSeconds 到现在发生了多少次错过的作业。例如,如果 startingDeadlineSeconds = 200 ,则它将计算在最近的 200 秒内发生了多少个错过的作业。如何计算错过多少次调度的确切实现可在此处找到。

  1. 如果之前步骤中没有超过100个错过的调度,则CronJob控制器将检查时间 now 是否未超过其 scheduledTime + startingDeadlineSeconds 的时间,即它是否还没有超过截止时间。如果还没有超过截止时间,则CronJob控制器将继续尝试启动该作业。但是,如果已经太晚了,则不会启动作业,并记录事件:

    "错过了{cronjob name}的启动窗口。错过了启动作业的预定时间{scheduledTime}"

需要注意的是,如果未设置字段 startingDeadlineSeconds,那么就意味着根本没有截止日期。这意味着 CronJob 控制器将在不检查其是否过期的情况下尝试启动作业。

因此,为了回答上述问题:

1. 如果将 startingDeadlineSeconds 设置为 10,而 cronjob 由于某些原因无法按计划时间启动,则只要 10 秒钟还没有过去,它仍然可以尝试再次启动,但是在 10 秒钟后,它肯定不会启动,这正确吗?

CronJob 控制器将尝试启动作业,如果其计划时间后的 10 秒尚未到达,则成功调度。但是,如果已经超过了截止日期,该作业将不会在此次执行中启动,并且将视为稍后执行的错过计划。

2. 如果我将 concurrencyPolicy 设置为 Forbid,那么当 cronjob 尝试被调度时,是否会被 K8s 计为失败,如果已经有一个正在运行?

是的,它将被计为错过计划。因为如我在第2点所述,错过的计划是按照特定规则计算的。


3
Hesham,我有一份工作已经超过100次错过了它的计划,并且我将并发策略设置为Forbid,但没有设置startingDeadlineSeconds。基于数据大小,工作可能需要更长或更短的时间,请问如何避免出现“Too many missed start time (>100)”错误? - k_vishwanath
1
如果一个工作被安排在每天早上5点运行一次,且并发策略设置为禁止。如果第一个工作(即早上5点的那个)在早上7点完成了它的工作,那么我们错过了119个计划,持续了2个小时,这是>100,cronjob将会抛出错误。如果我添加startingDeadlineSeconds到200秒,它会检查最近200秒内错过了多少个计划,还是(2小时+200秒)? - k_vishwanath
2
@k_vishwanath 将 startingDeadlineSeconds 设置为200,将计算在过去200秒内发生的错过的调度 -> 在您的情况下仅有3个错过的调度,因为它被安排每1分钟运行。这意味着控制器将重新开始安排它。正如所期望的那样。 - Hesham Massoud
36
这个设计非常令人困惑。 - ospider
3
只是确认一下,当您说“...被设置(非nil),那么这意味着没有截止日期...”时,这是否相反了?基于它是先前答案中重复的文本,并且基于您描述的行为,似乎应该是“...未设置(nil),那么这意味着没有截止日期...”。 - Tait
@Tait 来自4.7文档如果未指定,则没有截止日期。 我将更正答案的文本。 - Peter Wippermann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接