【问题标题】:What does Kubernetes cronjobs `startingDeadlineSeconds` exactly mean?Kubernetes cronjobs `startingDeadlineSeconds` 到底是什么意思?
【发布时间】:2018-12-06 12:17:32
【问题描述】:

在 Kubernetes cronjobs 中,limitations section 中表示

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

我从中了解到的是,如果 startingDeadlineSeconds 设置为 10 并且 cronjob 由于某种原因无法在其预定时间启动,那么它仍然可以尝试重新启动,只要那些10秒还没有过去,但是,在10秒之后,它肯定不会启动,对吗?

另外,如果我将concurrencyPolicy 设置为Forbid,如果一个cronjob 已经在运行,K8s 是否会将其视为失败?

【问题讨论】:

    标签: kubernetes kubernetes-cronjob


    【解决方案1】:

    在调查了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),它将统计从startingDeadlineSeconds 的值到现在发生了多少错过的工作。例如,如果startingDeadlineSeconds = 200,它将计算在最后200 秒内发生了多少错过的作业。计算错过的时间表的具体实现可以在here找到。

    1. 如果上一步错过的计划不超过 100 个,CronJob 控制器将检查时间 now 是否不晚于其 scheduledTime + startingDeadlineSeconds 的时间,即现在开始工作(通过了最后期限)。如果还不算太晚,作业将继续尝试由 CronJob 控制器启动。但是,如果已经太晚了,那么它就不会开始工作并记录事件:

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

    还有一点重要需要注意,如果startingDeadlineSeconds这个字段没有设置,那么就意味着根本没有截止日期。这意味着作业将由 CronJob 控制器尝试启动,而不检查它是否更晚。

    因此回答以上问题:

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

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

    2。如果我将 concurrencyPolicy 设置为 Forbid,如果一个 cronjob 尝试被调度,而 K8s 是否会将其视为失败,而此时已经有一个 cronjob 正在运行?

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

    【讨论】:

    • 赫舍姆。我有一份工作错过了 100 多次,我已将 concurrencyPolicy 设置为 Forbid 并且没有设置startingDeadlineSeconds。我如何通过“错过的开始时间太多(> 100)”错误来防止它,因为基于作业需要更少或更多时间的数据大小。
    • 例如假设作业计划在凌晨 5 点每分钟运行一次,并且 concurrencyPolicy 设置为禁止。如果第一份工作(早上 5 点)在早上 7 点完成了它的工作,我们在 2 小时内错过了 119 个计划,这是 > 100 并且 cronjob 会抛出错误如果我将startingDeadlineSeconds 添加到200 秒会检查有多少错过时间表发生在最后 200 秒或(2 小时 + 200 秒)
    • @k_vishwanath 将 startingDeadlineSeconds 设置为 200,将计算过去 200 秒内发生的错过的计划 -> 在您的情况下只有 3 个错过的计划,因为它计划每 1 分钟运行一次。这意味着控制器将再次开始调度它。根据需要。
    • 这个设计非常非常混乱。
    • 只是检查,当你说“...被设置(不是nil),那么这意味着没有截止日期......”,这是倒退吗?基于它是答案中前面的重复文本,并且根据您描述的行为,似乎应该是“......未设置(nil),那么这意味着没有截止日期......”
    猜你喜欢
    • 2017-08-07
    • 2017-07-20
    • 2014-09-23
    • 2014-07-25
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多