Развертывание контейнера в качестве CronJob для (Google) Kubernetes Engine - Как остановить Pod после завершения задачи - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть контейнер, который выполняет выборку некоторых данных из базы данных MySQL и просто отображает результат в console.log (), и хочу запустить его как задание cron в GKE. Пока у меня есть контейнер, работающий на моей локальной машине, и я успешно развернул его в GKE (насколько я вижу, ошибок не было).

Тем не менее, созданные модули были оставлены как «Выполнение» вместо остановки после завершения задачи. Должны ли модули автоматически останавливаться после выполнения всего кода или они требуют явной инструкции для остановки, и если да, то какова команда для завершения модуля после создания (заданием Cron)?

Я читаю, что якобы есть какой-то льготный период завершения ~ 30 с по умолчанию, но после выполнения минутного выполнения cronjob в течение ~ 20 минут все модули все еще работали. Не уверен, есть ли способ завершить модули изнутри кода, иначе было бы немного глупо иметь cronjob, генерирующий множество модулей, оставшихся без дела .. Мой cronjob.yaml ниже:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: test
spec:
  schedule: "5 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: test
            image: gcr.io/project/test:v1
            # env:
            #   - name: "DELAY"
            #     value: 15
          restartPolicy: OnFailure

Ответы [ 3 ]

0 голосов
/ 15 сентября 2018

Добавление process.kill (); строка в коде для явного завершения процесса после завершения выполнения кода позволяет модулю автоматически останавливаться после выполнения

0 голосов
/ 15 сентября 2018

A job в Kubernetes предназначено для запуска одного экземпляра модуля и обеспечения его выполнения до конца. Как указывает другой ответ, CronJob - это фабрика для Job с, которая знает, как и когда создавать задание в соответствии с указанным расписанием.

Соответственно, в отличие от службы, которая предназначена для вечной работы, контейнеры в модуле, созданные модулем, должны завершиться после завершения задания. Есть существенная проблема с шаблоном коляски, которая часто требует ручной обработки жизненного цикла стручка; если вашему основному модулю требуются дополнительные модули для ведения журналов или доступа к базе данных, вы должны организовать их выход по завершении основного модуля, в противном случае они останутся работающими, и k8s не сочтет задание выполненным. В таких обстоятельствах модуль, связанный с заданием, никогда не прекратит работу.

Льготный период прекращения здесь не применим: этот таймер применяется после того, как Kubernetes запросил прекращение работы вашего модуля (например, если вы его удалите). Он определяет максимальное время, в течение которого стручку предоставляется возможность корректно завершить работу, прежде чем kubelet прекратит его. Если Kubernetes никогда не считает вашу работу завершенной, этот этап жизненного цикла модуля не будет введен.

Кроме того, старые блоки хранятся после завершения в течение некоторого времени, чтобы можно было просматривать журналы и тому подобное. В списке могут отображаться модули, которые не работают активно и поэтому не потребляют вычислительные ресурсы на рабочих узлах.


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

0 голосов
/ 13 сентября 2018

A CronJob по сути является резаком печенья для рабочих мест. То есть он знает, как создавать рабочие места и выполнять их в определенное время. Теперь, как говорится, глядя на сборку мусора и очистку поведения CronJob, мы можем просто взглянуть на то, что документы Kubernetes должны сказать по этой теме в контексте заданий :

Когда задание завершается, стручки больше не создаются, но стручки также не удаляются. Хранение их позволяет вам по-прежнему просматривать журналы завершенных модулей, чтобы проверить наличие ошибок, предупреждений или других диагностических результатов. Объект задания также остается после его завершения, чтобы вы могли просматривать его состояние. Пользователь может удалить старые задания, отметив их статус. Удалите работу с помощью kubectl (например, kubectl delete jobs/pi или kubectl delete -f ./job.yaml).

...