несколько расписаний для одной задачи в cronjob k8s

Вопрос или проблема

Предупреждение: новичок в k8s с этой стороны.

Мне нужно запустить задачу, которая будет настроена в k8s cronjob. Она должна выполняться каждые 45 минут. Наличие этого в schedule не работает:

0/45 * * * *

Потому что она будет выполняться в X:00, затем X:45, затем X+1:00, вместо X+1:30. Поэтому, возможно, мне придется настроить несколько правил расписания:

0,45 0/3 * * *
30   1/3 * * *
15   2/3 * * *

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

https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/cron-job-v1/

Обновление: Я только что прочитал, что возможно иметь более одного манифеста, написанного в одном yaml-файле, так что это может сработать с 3 манифестами… но знать, возможно ли это с одним манифестом, было бы здорово.

Попробуйте */45, потому что согласно руководству 0/45 означает каждую вторую 45 из 0…

Если спецификация crontab кажется неполной или неоднозначной, выяснение того, что она действительно делает, может прояснить документацию. Все тесты проводились на Linux Mint 19.3 (в котором crontab соответствует стандарту POSIX).

0/40 * * * * date >> Cron.log

crontab -e даже не позволит ввести вышеуказанный однострочный crontab. 0 – это конкретная минута. Нет смысла ставить пропуск на это. Это вызывает ошибку:

"/tmp/crontab.4BQ7AN/crontab":0: недопустимая минута
ошибки в файле crontab, не удается установить.
Вы хотите повторить тот же редактирование? (y/n) 

В отличие от

*/40 * * * * date >> Cron.log

Эта версия принимается, потому что * представляет собой список 0,1,2,…,59. Пропуск сокращает это до 0 и 40.

Я собрал crontab, предназначенный для демонстрации эффектов диапазонов и конструкций шага.

$ crontab -l
#.. Crontab для иллюстрации диапазонов и шагов.

#.. Каждые 20 минут с 0: 0, 20, 40.
*/20       13,14 * * * ~/Stamp 'Строка  4:: */20'

#.. Каждые 20 минут с 5: 5, 25, 45.
5-59/20    13,14 * * * ~/Stamp 'Строка  7:: 5-59/20'

#.. Каждые 7 минут с 9 до 35: 9, 16, 23, 30.
9-35/7     13,14 * * * ~/Stamp 'Строка 10:: 9-35/7'

#.. Каждые 13 минут с 33 до 59: 33, 46, 59.
33-59/13   13,14 * * * ~/Stamp 'Строка 13:: 33-59/13'

#.. Один раз.
14-14/2    13,14 * * * ~/Stamp 'Строка 16:: 14-14/2'

#.. Один раз.
11-59/999  13,14 * * * ~/Stamp 'Строка 19:: 11-59/999'

~/Stamp – это shell-скрипт, который записывает время его выполнения и значение минут из файла crontab.

$ cat ~/Stamp
#! /bin/bash
#: Stamp: демонстрация обработки crontab.

Log="./133000.cronLog"
printf >>"${Log}" '%(%T)T cron time spec %s\n' -1 "${1}"

Я установил crontab в 13:35, и он записал эти задачи. Он перестал записывать в 14:59 из-за значений часов 13,14, тем самым перебрав границу часа. Я считаю, что столбцы часов, дня месяца, месяца и дня недели работают идентично, но 90-минутный тест достаточно для меня.

paul@paul-RV415-RV515 ~ $ tail -F 133000.cronLog
tail: не удается открыть '133000.cronLog' для чтения: Нет такого файла или каталога
tail: '133000.cronLog' появился;  следит за новым файлом
13:40:01 cron time spec Строка  4:: */20
13:45:01 cron time spec Строка  7:: 5-59/20
13:46:01 cron time spec Строка 13:: 33-59/13
13:59:01 cron time spec Строка 13:: 33-59/13
14:00:01 cron time spec Строка  4:: */20
14:05:01 cron time spec Строка  7:: 5-59/20
14:09:01 cron time spec Строка 10:: 9-35/7
14:11:01 cron time spec Строка 19:: 11-59/999
14:14:01 cron time spec Строка 16:: 14-14/2
14:16:01 cron time spec Строка 10:: 9-35/7
14:20:01 cron time spec Строка  4:: */20
14:23:01 cron time spec Строка 10:: 9-35/7
14:25:01 cron time spec Строка  7:: 5-59/20
14:30:01 cron time spec Строка 10:: 9-35/7
14:33:01 cron time spec Строка 13:: 33-59/13
14:40:01 cron time spec Строка  4:: */20
14:45:01 cron time spec Строка  7:: 5-59/20
14:46:01 cron time spec Строка 13:: 33-59/13
14:59:01 cron time spec Строка 13:: 33-59/13
^C
paul@paul-RV415-RV515 ~ $ 

Ответ или решение

В мире Kubernetes (k8s) использование CronJobs для выполнения периодических задач стало стандартной практикой. Однако, с его особенностями, особенно в работе с расписаниями, может возникнуть ряд вопросов, особенно у начинающих пользователей. В этой статье мы подробно рассмотрим, как создать задачи с множественными расписаниями в Kubernetes CronJob и возможные варианты их реализации.

Задача: Запланировать выполнение задачи каждые 45 минут

Ваша задача состоит в том, чтобы запустить задачу каждые 45 минут. Несмотря на то что схема, которую вы пробовали использовать (0/45 * * * *), кажется логичной на первый взгляд, она действительно вызывает путаницу. Эта запись будет запускать задачу на 0 и 45 минут каждого часа, что означает X:00 и X:45. А вам нужно, чтобы задача выполнялась также в X:30.

Альтернативные решения с использованием нескольких расписаний

Как вы правильно заметили, для достижения желаемого результата можно использовать несколько строк расписаний. Здесь одним из простых решений является использование нескольких CronJobs, каждый из которых будет выполнять одно из расписаний:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob-every-30
spec:
  schedule: "0,30 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: my-task
            image: my-image
            args: ["run-task"]
          restartPolicy: OnFailure

---
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob-every-15
spec:
  schedule: "15 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: my-task
            image: my-image
            args: ["run-task"]
          restartPolicy: OnFailure

---
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob-every-45
spec:
  schedule: "45 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: my-task
            image: my-image
            args: ["run-task"]
          restartPolicy: OnFailure

Форматирование одного манифеста

К сожалению, в пределах одного CronJob манифеста нельзя указать несколько расписаний. К последнему моменту, который вы упомянули, о возможности добавления нескольких манифестов в один YAML-файл — это действительно возможно. Однако все они будут представлять собой отдельные ресурсы (CronJob).

Ваше альтернативное решение подразумевает создание одного CronJob с несколькими манифестами, и каждая задача будет иметь своё расписание, прописанное в отдельных блоках манифеста. Это позволяет организовать конфигурацию задач более упорядоченно и удобно для дальнейшей обработки.

Заключение

Создание CronJob для периодической задачи в Kubernetes требует особого внимания к формату расписания. В вашем случае, оптимальным решением оказывается использование нескольких CronJobs или включение множества манифестов в одном YAML-файле. Это предоставляет гибкость, нужную для задания сложных расписаний, как в вашем примере выполнения задачи каждые 45 минут.

Если у вас остались вопросы или нужна помощь в реализации, пожалуйста, обращайтесь, и мы сможем более глубоко разобраться в вашей ситуации!

Оцените материал
Добавить комментарий

Капча загружается...