Kubernetes cronjobs`startingDeadlineSeconds`到底是什么意思?

时间:2018-06-27 14:36:16

标签: kubernetes kubernetes-cronjob

在Kubernetes cronjobs中,limitations section中指出

  

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

据此我了解到,如果将startingDeadlineSeconds设置为10,并且由于某些原因cronjob无法在计划的时间启动,那么仍然可以尝试再次启动它只要还没有过去10秒,但是10秒之后,肯定不会开始,这是正确的吗?

此外,如果我将concurrencyPolicy设置为Forbid,如果已经计划运行一个cronjob,那么K8是否会将其视为失败?

1 个答案:

答案 0 :(得分:13)

研究了Kubernetes repo的代码库之后,CronJob控制器的工作方式如下:

  1. CronJob控制器will check the every 10 seconds在给定的Kubernetes客户端中的cronjobs列表。
  2. 对于每个CronJob,它都会检查从lastScheduleTime到现在的持续时间中错过了多少个计划。如果数量超过100 missed schedules,则它不会启动作业并记录事件:

    "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),它将根据{{ 1}}到现在为止。例如,如果startingDeadlineSeconds = startingDeadlineSeconds,它将计算在最近200秒内发生了多少个丢失的作业。计算here可以找到多少个错过的时间表的确切实现。

  1. 如果上一步错过的时间表不超过100个,CronJob控制器将检查时间200是否不晚于其now的时间,即现在开始工作还为时不晚(超过了期限)。如果还不算太晚,CronJob Controller将继续尝试启动该作业。但是,如果为时已晚,则它不会启动作业并记录事件:

    scheduledTime + startingDeadlineSeconds

要注意的也是重要,如果设置了字段"Missed starting window for {cronjob name}. Missed scheduled time to start a job {scheduledTime}"(而不是startingDeadlineSeconds),则表示根本没有截止日期,这意味着CronJob控制器将尝试启动任何作业,而不检查是否稍后进行。

因此要回答上述问题:

1。如果将startingDeadlineSeconds设置为10,并且cronjob由于计划的时间因某种原因而无法启动,那么只要这十秒还没有过去,仍然可以尝试再次启动它,但是,在十秒之后,它将确定不会启动,对吗?

CronJob控制器将尝试启动作业,并且如果尚未超过排定时间的10秒,它将被成功排定。但是,如果期限已过,则不会在此运行中开始,并且在以后的执行中将其计为错过的计划。

2。如果我将concurrencyPolicy设置为Forbid,那么如果已经计划运行cronjob,那么K8是否会将其视为失败?

是的,它将被计为错过的时间表。由于错过的时间表是按照我在第2点中所述的方法计算的。