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. То есть, это создаст новую работу, если вы не удалите ее до сих пор, и, насколько я знаю, способов избежать этого нет.