Kubernetes cronjobs`startingDeadlineSeconds'究竟意味着什么?

Hes*_*oud 11 kubernetes kubernetes-cronjob

在Kubernetes cronjobs中,在限制部分中说明了这一点

如果CronJob控制器在从CronJob的开始时间到开始时间加上startingDeadlineSeconds之前的一段时间内没有运行或中断,或者如果跨度涵盖多个开始时间并且concurrencyPolicy不允许并发,则作业可能无法运行.

我从中理解的是,如果startingDeadlineSeconds设置为10并且cronjob在其预定时间由于某种原因无法启动,那么只要这些10秒没有通过,它仍然可以尝试再次启动,但是在10秒,它肯定不会被启动,这是正确的?

此外,如果我已经concurrencyPolicy设置为Forbid,如果cronjob尝试安排,当有一个已经运行时,K8会将其视为失败吗?

Hes*_*oud 20

在调查了Kubernetes repo的代码库之后,这就是CronJob控制器的工作原理:

  1. CronJob控制器将每隔10秒检查给定Kubernetes客户端中的cronjobs列表.
  2. 对于每个CronJob,它会检查从lastScheduleTime现在开始的持续时间中错过的计划数量.如果错过的计划超过100个,则它不会启动作业并记录事件:

    "FailedNeedsStart", "Cannot determine if job needs to be started. Too many missed start time (> 100). Set or decrease .spec.startingDeadlineSeconds or check clock skew."

重要的是要注意,如果startingDeadlineSeconds设置了字段(不是nil),它将计算从startingDeadlineSeconds现在的值到多少错过的作业.例如,如果startingDeadlineSeconds= 200,它将计算在最后200几秒内发生的错过的作业数.可以在此处找到计算错过的时间表的确切实施.

  1. 如果前一步骤中的错过的时间表不超过100个,则CronJob控制器将检查时间now是否超过其时间scheduledTime + startingDeadlineSeconds,即启动作业还不算太晚(超过截止日期).如果还不晚,CronJob控制器将继续尝试启动该作业.但是,如果已经太晚了,那么它就不会启动工作并记录事件:

    "Missed starting window for {cronjob name}. Missed scheduled time to start a job {scheduledTime}"

同样重要的是要注意,如果字段startingDeadlineSeconds设置(不是nil),那么这意味着所有设置都没有截止日期,这意味着CronJob控制器将尝试启动任何作业,而不检查它是否稍后.

因此,回答上述问题:

1.如果startingDeadlineSeconds设置为10并且cronjob在其预定时间由于某种原因无法启动,那么只要10秒没有通过,它仍然可以尝试再次启动,但是在10秒之后,它肯定不会启动,这是正确的吗?

CronJob控制器将尝试启动该作业,并且如果在其计划时间之后的10秒尚未过去,则它将成功安排.但是,如果截止日期已过,则此次运行将不会启动,并且在以后的执行中将被视为错过的时间表.

2.如果我将concurrencyPolicy设置为Forbid,如果cronjob尝试安排,当有一个已经运行时,K8会将其视为失败吗?

是的,它将被视为错过的时间表.由于错过的时间表是按照我在上面第2点中所述计算的.

  • 这个设计非常非常混乱,那么如何想出这个愚蠢的设计呢? (12认同)
  • 只是检查一下,当你说“...已设置(不是零),那么这意味着没有截止日期...”,这是倒退吗?基于它是答案前面重复的文本,并且根据您描述的行为,似乎应该是“...未设置(零),那么这意味着没有截止日期...” (3认同)
  • 赫沙姆。我有一份工作超过 100 次错过了它的日程安排,并且我已将 concurrencyPolicy 设置为 Forbid 并且没有设置startingDeadlineSeconds。我怎样才能通过“太多错过的开始时间(> 100)”错误来防止它,因为基于作业制作的数据大小需要更少或更多的时间。 (2认同)
  • @k_vishwanath 将startingDeadlineSeconds 设置为200,将计算过去200 秒内发生的错过的计划 -> 在您的情况下只有 3 个错过的计划,因为它计划每 1 分钟运行一次。这意味着控制器将再次开始调度它。如预期的。 (2认同)