¿Qué debo hacer si no se puede reiniciar una tarea programada después de haber sido detenida durante un período de tiempo?
Si una tarea programada se detiene durante la ejecución, antes de su reinicio, el sistema calcula la diferencia entre la última vez que la tarea se ejecutó con éxito y la hora actual y compara la diferencia de tiempo con el período de tarea programada multiplicado por 100. Si la diferencia de tiempo es mayor que el período multiplicado por 100, la tarea programada no se activará de nuevo. Para obtener más información, consulte Limitaciones de CronJob.
Por ejemplo, supongamos que un trabajo cron está configurado para crear un trabajo cada minuto a partir de las 08:30:00 y que el campo startingDeadlineSeconds no está definido. Si el controlador de trabajo cron deja de ejecutarse de 08:29:00 a 10:21:00, el trabajo no se iniciará debido a la diferencia de tiempo entre 08:29:00 y 10:21:00. 00 supera los 100 minutos, es decir, el número de tiempos de programación perdidos supera los 100 (en el ejemplo, un período de programación es de 1 minuto).
Si se establece el campo startingDeadlineSeconds, el controlador calcula el número de trabajos perdidos en los últimos x segundos (el x indica el valor de startingDeadlineSeconds). Por ejemplo, si startingDeadlineSeconds se establece en 200, el controlador cuenta el número de trabajos perdidos en los últimos 200 segundos. En este caso, si el controlador de trabajo cron deja de ejecutarse de 08:29:00 a 10:21:00, el trabajo comenzará de nuevo a las 10:22:00, porque solo se pierden tres solicitudes de programación en los últimos 200 segundos (en el ejemplo, un periodo de programación es de 1 minuto).
Solución
Configure el parámetro startingDeadlineSeconds en un trabajo cron. Este parámetro solo se puede crear o modificar mediante kubectl o las API.
Ejemplo de 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
Si vuelve a crear un trabajo cron, puede evitar temporalmente este problema.