Что в точности означает Kuronnetes cronjobs для «initialDeadlineSeconds»? - PullRequest
0 голосов
/ 27 июня 2018

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

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

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

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

1 Ответ

0 голосов
/ 28 июня 2018

После изучения базы кода Kubernetes repo , вот как работает контроллер 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.

...