Kubernetes CronJob запустить один раз в будущем

Кубернетес CronJob документы упоминают, что CronJob поддерживает вариант использования:

  • Один раз в указанный момент времени

Но я не вижу никаких примеров / документации о том, как это было бы возможно. В частности, я хочу начать работу один раз в N часов. Поддерживается ли это в какой-либо версии Kubernetes?

2 ответа

Согласно документации, CronJob использует общий формат расписания Cron:

Вот некоторые примеры:

  schedule: "1 2-14 * * 0-1,5-6" (first minute of every hour from 2am to 2pm UTC on Sun,Mon,Fri,Sat)
  schedule: "*/1 * * * *" (every minute)

У CronJobs также есть некоторые ограничения:

Задание cron создает объект задания примерно один раз за время выполнения своего расписания. Мы говорим "примерно", потому что есть определенные обстоятельства, когда могут быть созданы две работы, или работа не может быть создана. Мы пытаемся сделать это редким, но не полностью предотвращаем их. Поэтому рабочие места должны быть идемпотентными.

Если startingDeadlineSeconds установлен на большое значение или оставлен неустановленным (по умолчанию), и если concurrencyPolicy установлен в Allow, задания всегда будут выполняться хотя бы один раз.

Задания могут не запускаться, если контроллер CronJob не работает или не работает в течение определенного промежутка времени от времени начала CronJob до времени запуска плюс startingDeadlineSeconds или если промежуток охватывает несколько моментов запуска и concurrencyPolicy не допускает параллелизма. Например, предположим, что задание cron установлено точно с 08:30:00 И его startingDeadlineSeconds установлен в 10, если контроллер CronJob не работает с 08:29:00 в 08:42:00, работа не начнется. Установить более длинный startingDeadlineSeconds если начинать позже, лучше не начинать вообще.

Cronjob отвечает только за создание заданий, соответствующих его расписанию, а задание, в свою очередь, отвечает за управление модулями, которые оно представляет.

Другая важная вещь заключается в том, что Kubernetes использует исключительно UTC. Обязательно учитывайте это при создании расписания.

Чтобы запустить работу только один раз, вы можете использовать kubectl create -f job.yaml запускается по команде на машине администратора или на главном узле.

echo "kubectl create -f job.yaml" | at midnight 

Это так же, как обычный объект CronJob, но использующий формат для выражения cronjob для запуска в определенный момент времени:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: my-cronjob
  namespace: kube-system
spec:
  schedule: "7 7 7 7 6"
  restartPolicy: OnFailure
  jobTemplate:
    ...

например, это будет работать в "07:07, суббота 7 июля 2018 года".

Следующее вхождение произойдет в 2029 году, поэтому у вас будет достаточно времени, чтобы удалить объект cronJob. То есть, это создаст новую работу, если вы не удалите ее до сих пор, и, насколько я знаю, способов избежать этого нет.

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