文档首页/ 云容器引擎 CCE/ 常见问题/ 工作负载/ 其他/ 定时任务停止一段时间后,为何无法重新启动?
更新时间:2024-09-30 GMT+08:00

定时任务停止一段时间后,为何无法重新启动?

定时任务在运行过程中,如果被暂停,再次被开启时,控制器会检查上一次调度的时间点到现在所错过了调度次数。如果错过的调度次数超过100次, 那么它就不会启动这个任务并记录这个错误,详情请参考CronJob限制

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

例如,假设一个CronJob被设置为从08:30:00开始每隔1分钟创建一个新的Job,且startingDeadlineSeconds字段未被设置。如果CronJob控制器从08:29:00到10:21:00终止运行,则该Job将不会启动,因为从08:29:00到10:21:00超过了100分钟,即错过的调度次数超过了100(示例中一个调度周期为1分钟)

但如果设置了startingDeadlineSeconds字段,则控制器会统计从startingDeadlineSeconds设置的值到现在的时间,计算期间错过了多少次Job。 例如,如果startingDeadlineSeconds是 200,则控制器会统计在过去200秒中错过了多少次Job。此时如果CronJob控制器同样在08:29:00到10:21:00时间段终止运行,则Job仍将从10:22:00开始,因为最近200秒中仅错过了3个调度(示例中一个调度周期为1分钟)。

解决方法

如果想要解决这个问题,可以在定时任务的CronJob中配置参数:startingDeadlineSeconds。该参数只能使用kubectl命令,或者通过API接口进行创建或修改。

YAML示例如下:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  startingDeadlineSeconds: 200
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox:1.28
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo Hello
          restartPolicy: OnFailure

如果重新创建CronJob,也可以临时规避这个限制。