Что в точности означает Kuronnetes cronjobs для "initialDeadlineSeconds"?

В cronjobs Kubernetes, в разделе ограничений сказано, что

Задания могут не запускаться, если контроллер CronJob не работает или не работает в течение определенного промежутка времени, начиная с времени начала CronJob до времени начала плюс начальные значения DeadlineSeconds, или если этот промежуток охватывает многократное время запуска, а concurrencyPolicy не разрешает параллелизм.

Из этого я понимаю, что если startingDeadlineSeconds установлен в 10 и cronjob не может запуститься по какой-то причине в назначенное время, тогда его можно попытаться запустить снова, пока те 10 секунды не прошли, однако, после 10 секунд, это точно не запустится, это правильно?

Кроме того, если у меня есть concurrencyPolicy установлен в ForbidK8s считает это неудачей, если cronjob пытается быть запланированным, когда он уже запущен?

1 ответ

Решение

После изучения кодовой базы репо Kubernetes, вот как работает контроллер CronJob:

  1. Контроллер CronJob будет каждые 10 секунд проверять список cronjobs в данном клиенте Kubernetes.
  2. Для каждого CronJob он проверяет, сколько расписаний он пропустил за время от lastScheduleTime до сих пор. Если пропущено более 100 расписаний, задание не запускается и записывается событие:

    "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 секунд. Точную реализацию подсчета количества пропущенных расписаний можно найти здесь.

  1. Если на предыдущем шаге не более 100 пропущенных расписаний, контроллер CronJob проверит, now не после времени его scheduledTime + startingDeadlineSeconds то есть, что еще не поздно приступить к работе (пройден крайний срок). Если не было слишком поздно, CronJob Controller продолжит попытки запуска задания. Однако, если уже слишком поздно, он не запускает задание и записывает событие:

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

Также важно отметить, что если поле startingDeadlineSeconds установлено (не nil), то это означает, что крайний срок вообще не установлен, что означает, что задание будет пытаться запустить какой-либо из них контроллером CronJob без проверки, будет ли он позднее или нет.

Поэтому, чтобы ответить на вопросы выше:

1. Если для initialDeadlineSeconds задано значение 10, а cronjob по какой-то причине не удалось запустить в назначенное время, то можно попытаться запустить его снова, если эти 10 секунд не прошли, однако через 10 секунд это точно не запустится, это правильно?

Контроллер CronJob попытается запустить задание, и оно будет успешно запланировано, если еще не прошло 10 секунд после запланированного времени. Однако, если срок истек, этот запуск не будет запущен, и он будет засчитан как пропущенный график в последующих выполнениях.

2. Если для параметра concurrencyPolicy установлено значение Forbid, считается ли K8 ошибкой, если cronjob пытается быть запланированным, когда он уже запущен?

Да, это будет считаться пропущенным графиком. Поскольку пропущенные графики рассчитываются так, как я изложил выше в пункте 2.

Другие вопросы по тегам