как запускать cronjob каждые 10 секунд в kubernetes?

#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, заключив его в символы «?