Я пытался думать о нескольких возможностях, но все может go ошибаться, в основном из-за того, что у вас есть работа, которую нужно выполнять каждые 2 минуты, и давайте предположим, что ваша ежедневная работа по любой причине занимает больше времени, чем вы ожидаете, новая 2-минутная работа начнется, и это не может произойти.
Наилучшим из возможных решений будет решение этой проблемы на уровне кода. Вы можете создать блокировку в своем приложении, чтобы предотвратить одновременное выполнение этих заданий.
Если вы действительно не можете придумать какое-либо решение для решения этой проблемы в своем коде, в Kubernetes есть механизм, который запрещает запуск новой работы из того же задания. Вы можете установить флаг spe c .concurrencyPolicy: Запретить , поэтому, если запуск вашей работы занимает более 2 минут, новая работа будет пропущена. Это не глобальный флаг, это только за cronjob.
Вы можете объединить эту возможность с spe c .initContainers и найти способ запустить обе задачи в одном и том же задании.
spe c .initContainers - это специализированные контейнеры, которые запускаются перед контейнерами приложения.
Вот пример:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
concurrencyPolicy: Forbid
schedule: "*/2 * * * *"
jobTemplate:
spec:
template:
spec:
initContainers
- name: hello1
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
containers:
- name: hello2
image: busybox
args:
- /bin/sh
- -c
- DATE=`date +"%H:%M"`; if [[ $DATE == "00:00" ]]; then date; echo Hello from the Kubernetes cluster; fi
restartPolicy: OnFailure
Этот манифест определяет cronJob, который будет запускаться каждые 2 минуты и запускать initContainer (ваше 2-минутное задание), а также будет запускать второй контейнер каждые 2 минуты Дело в том, что во втором контейнере у нас есть сценарий оболочки, проверяющий, наступила ли полночь (игнорируемые секунды, поскольку мы не можем быть уверены, когда он начнется).
Возможно, вам придется настроить эту часть кода:
DATE=`date +"%H:%M"; if [[ $DATE == "00:00" ]
Предположим, что выполнение вашего первого контейнера занимает больше минуты, это будет 00:01, а ваша вторая работа никогда не будет казнен.
Дайте мне знать, помогла ли вам эта информация и решение.