#kubernetes #k8s-cronjobber
#kubernetes #k8s-cronjobber
Вопрос:
«Я просто хочу запускать cronjob в Kubernetes каждые 10 секунд. какая была бы обязательная команда для этого?»
Комментарии:
1. Каков именно ваш вариант использования? Возможно, было бы лучше выполнить задание из приложения, которое вы уже развернули.
2. Что вы уже пробовали?
3. Вы могли бы создать приложение без головы, которое запускает cron внутри, у меня все работало нормально с asp.net Core, Quartz и OpenShift.
Ответ №1:
Вы не можете использовать объект CronJob kubernetes для выполнения менее 1 минуты. Возможно, вы используете неправильный инструмент для процесса, который приходится запускать так часто. https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs /
Создайте бесконечный цикл при развертывании (демонизируйте его)
Вам нужно будет использовать формулу bash (или любой другой язык программирования, который вам больше нравится, Go, Java, Python или Ruby), чтобы создать бесконечный цикл и переходить в режим ожидания по 10 секунд на каждое выполнение внутри развертывания. Вот пример с bash / sh:
apiVersion: apps/v1
kind: Deployment
metadata:
name: cronjob-deployment
labels:
app: cronjob
spec:
replicas: 1
selector:
matchLabels:
app: cronjob
template:
metadata:
labels:
app: cronjob
spec:
containers:
- name: cronjob
image: busybox
args:
- /bin/sh
- -c
- while true; do echo call ./script.sh here; sleep 10; done
Создайте 1 CronJob с несколькими контейнерами
Если вы все еще хотите использовать CronJobs, вы можете сделать это с 6 контейнерами внутри определения. Один без задержки, а другие с задержкой в 10, 20, 30, 40 и 50 секунд.
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: no_delay
image: busybox
args:
- /bin/sh
- -c
- echo call ./script.sh here
- name: 10_seconds
image: busybox
args:
- /bin/sh
- -c
- sleep 10; echo call ./script.sh here
- name: 20_seconds
image: busybox
args:
- /bin/sh
- -c
- sleep 20; echo call ./script.sh here
- name: 30_seconds
image: busybox
args:
- /bin/sh
- -c
- sleep 30; echo call ./script.sh here
- name: 40_seconds
image: busybox
args:
- /bin/sh
- -c
- sleep 40; echo call ./script.sh here
- name: 50_seconds
image: busybox
args:
- /bin/sh
- -c
- sleep 50; echo call ./script.sh here
restartPolicy: OnFailure
Конечно, одна из проблем, с которой вы можете столкнуться, заключается в том, что ваш процесс может перекрываться (выполняться одновременно в одно и то же время). Это будет зависеть от количества секунд, необходимого вашему процессу для запуска, и времени, необходимого kubernetes для планирования и создания контейнера.
Комментарии:
1. Следует упомянуть, что «pod» не будет указан в качестве
CronJob
ресурса. Что можно было бы сделать, так это запланироватьCronJob
каждую минуту и в рамках этогоCronJob
выполнять скрипт каждые 10 секунд, шесть раз подряд.2. Спасибо @Turing85! Обновленный ответ с вашей хорошей идеей.
3. это более или менее похоже на демонтаж.
4. Да! Это. Я обновлю основной ответ с той терминологией, которая кажется более правильной
Ответ №2:
Если ваша задача должна выполняться так часто, cron — это неправильный инструмент.
Помимо того факта, что он просто не будет запускать задания так часто, вы также рискуете столкнуться с серьезными проблемами, если выполнение задания займет больше времени, чем интервал между запусками. Перепишите свою задачу в daemonize и выполняйте постоянно, затем запустите ее из cron, если необходимо (убедившись, что она не будет перезапущена, если она уже запущена).
Ответ №3:
Вы можете написать скрипт, который выполняется 6 раз с интервалом в 10 секунд. и настройте Kubernetes cron job на выполнение каждую минуту. таким образом, каждую минуту запускается ваш скрипт, который, в свою очередь, выполняет задачу каждые 10 секунд.
скрипт для запуска логики каждые 10 секунд в течение 6 раз, когда задание cron выполняется через одну минуту.
Это будет печатать hello world каждые 10 секунд 6 раз: #!/bin/bash -x a= 0
пока [$ a -gt 5] не будет выполнено echo «hello world» a = expr $a 1
sleep 10
пример cronjob :
apiVersion: batch / v1beta1 вид: CronJob метаданные: имя: hello спецификация: расписание: «*/1 * * * *» jobTemplate: спецификация: шаблон: спецификация: контейнеры: — имя: hello image: imagePullPolicy: команда IfNotPresent: — /bin/sh — -c — ./sample.sh Политика перезапуска: сбой ~
Таким образом, ваше задание cron выполняется каждую минуту.который, в свою очередь, запускает ваш srcipt, который запускается каждые 10 секунд и выполняет бизнес-логику в течение 6 минут.
Это идея, которой вы можете следовать, чтобы заставить задание cron работать за считанные секунды, поскольку Kubernetes не предоставляет значения для планирования менее 1 минуты.
Хотя при таком подходе вам нужно установить стратегию, чтобы не перекрывать следующее выполнение задания cron. например, если выполнение вашей бизнес-логики занимает 15 секунд, и вы запускаете бизнес-логику каждые 10 секунд 6 раз в минуту. Поскольку бизнес-логика занимает 15 секунд, в идеале она должна выполняться 4 раза, а не 6 раз в минуту. Соответственно, вам нужно настроить повторение внутри скрипта.
Комментарии:
1. Не могли бы вы, пожалуйста, привести простой, конкретный пример для вашего предложения?
2. Спасибо! Не могли бы вы, пожалуйста, отформатировать скрипт оболочки bash и yaml, заключив его в символы «?