在Kubernetes cronjobs中,limitations section中指出
如果CronJob控制器从CronJob的开始时间到开始时间加上startingDeadlineSeconds的时间段内未运行或中断,则作业可能无法运行,或者该跨度涵盖多个开始时间并且concurrencyPolicy不允许并发
据此我了解到,如果将startingDeadlineSeconds
设置为10
,并且由于某些原因cronjob无法在计划的时间启动,那么仍然可以尝试再次启动它只要还没有过去10
秒,但是10
秒之后,肯定不会开始,这是正确的吗?
此外,如果我将concurrencyPolicy
设置为Forbid
,如果已经计划运行一个cronjob,那么K8是否会将其视为失败?
答案 0 :(得分:13)
研究了Kubernetes repo的代码库之后,CronJob控制器的工作方式如下:
对于每个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可以找到多少个错过的时间表的确切实现。
如果上一步错过的时间表不超过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点中所述的方法计算的。