Контроллеры в Kubernetes: Cron Job
Cron Job создает Job'ы по расписанию.
Один объект CronJob похож на одну строку файла crontab (таблицы cron). Он запускает работу периодически по заданному расписанию, написанному в формате Cron.
Примечание. Все расписание CronJob: время основано на часовом поясе мастера, в котором запущено задание.
Ограничения Cron Job
Cron Job создает объект Job примерно один раз за время выполнения своего расписания. "Примерно", потому что есть определенные обстоятельства, когда могут быть созданы два Job, или Job не может быть создан. Поэтому Job'ы должны быть идемпотентными.
Если для startDeadlineSeconds задано большое значение или не задано значение (по умолчанию), а для параметра concurrencyPolicy задано значение Allow, Job'ы всегда будут запускаться хотя бы один раз.
Для каждого CronJob Контроллер CronJob проверяет, сколько расписаний он пропустил за время с его последнего запланированного времени до настоящего времени. Если пропущено более 100 расписаний, Job не запускается и регистрирует ошибку.
Cannot determine if job needs to be started. Too many missed start time (> 100). Set or decrease .spec.startingDeadlineSeconds or check clock skew.
Важно отметить, что если установлено поле startDeadlineSeconds (не nil), контроллер подсчитывает, сколько пропущенных Job произошло по значению startingDeadlineSeconds до настоящего момента, а не с последнего запланированного времени до настоящего момента. Например, если startingDeadlineSeconds равен 200, контроллер подсчитывает, сколько пропущенных Job произошло за последние 200 секунд.
CronJob считается пропущенным, если его не удалось создать в запланированное время. Например, если для параметра concurrencyPolicy задано значение Forbid и была предпринята попытка запланировать CronJob, когда еще выполнялось предыдущее расписание, оно будет считаться пропущенным.
Например, предположим, что CronJob настроен на планирование нового Job каждую минуту, начиная с 08:30:00, а его поле startDeadlineSeconds не задано. Если происходит сбой контроллера CronJob с 08:29:00 до 10:21:00, Job не запустится, поскольку число пропущенных Job, пропустивших график, превышает 100.
Чтобы проиллюстрировать эту концепцию далее, предположим, что CronJob настроен на планирование нового Job каждую минуту, начиная с 08:30:00, а его startDeadlineSeconds установлен на 200 секунд. Если контроллер CronJob не работает в течение того же периода, что и в предыдущем примере (с 08:29:00 до 10:21:00), Job все равно будет запущен в 10:22:00. Это происходит, поскольку контроллер теперь проверяет, сколько пропущенных Job произошло за последние 200 секунд (т.е. 3 пропущенных расписания), а не с последнего запланированного времени до настоящего момента.
CronJob отвечает только за создание Job, соответствующих его расписанию, а Job, в свою очередь, отвечает за управление Pod'ами, которые он представляет.
Читайте также:
- Контроллеры в Kubernetes: Job, пример
- Контроллеры в Kubernetes: ReplicaSet
- Контроллеры в Kubernetes: StatefulSet
Комментарии
Отправить комментарий