定时任务停止一段时间后,为何无法重新启动?
定时任务在运行过程中,如果被暂停,再次被开启时,控制器会检查上一次调度的时间点到现在所错过了调度次数。如果错过的调度次数超过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,也可以临时规避这个限制。