K8s Job постоянно воссоздается

У меня есть cronjob, который продолжает перезапускаться, несмотря на его установлен в :

      apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cron-zombie-pod-killer
spec:
  schedule: "*/9 * * * *"
  successfulJobsHistoryLimit: 1
  jobTemplate:
    spec:
      template:
        metadata:
          name: cron-zombie-pod-killer
        spec:
          containers:
            - name: cron-zombie-pod-killer
              image: bitnami/kubectl
              command:
                - "/bin/sh"
              args:
                - "-c"
                - "kubectl get pods --all-namespaces --field-selector=status.phase=Failed | awk '{print $2 \" --namespace=\" $1}' | xargs kubectl delete pod > /dev/null"
          serviceAccountName: pod-read-and-delete
          restartPolicy: Never

Я бы ожидал, что он будет запускаться каждую 9-ю минуту, но это не так. Что происходит, так это то, что когда есть модули для очистки (то есть, когда есть что-то, что нужно сделать для модуля), он будет работать нормально. Как только все проясняется, он продолжает перезапускаться -> сбой -> запуск и т. Д. В цикле каждую секунду.

Есть ли что-то, что мне нужно сделать, чтобы сообщить k8s, что задание выполнено успешно, даже если делать нечего (нет модулей для очистки)? Что делает цикл работы в перезапусках и сбоях?

2 ответа

То есть по дизайну. применяется не к CronJob, а к поду, который он создает.

Если restartPolicyустановлен на Never, он создаст новые модули, если предыдущий не удался. Установка его на OnFailureвызывает перезапуск пода и предотвращает поток новых подов.

Это обсуждалось в этой проблеме GitHub: задание постоянно воссоздается, несмотря на RestartPolicy: Never #20255.


Ваша команда приводит к коду выхода 123 (любой вызов завершился с ненулевым статусом), если нет подов в состоянии Failed . Это приводит к сбою задания и постоянным перезапускам.

Вы можете исправить это, заставив kubectlкоманда для выхода с кодом выхода 0 . Добавлять || exit 0до конца:

      kubectl get pods --all-namespaces --field-selector=status.phase=Failed | awk '{print $2 \" --namespace=\" $1}' | xargs kubectl delete pod > /dev/null || exit 0

...Once everything is cleared up, it keeps restarting -> failing -> starting, etc. in a loop every second.

Когда ваша первая команда не возвращает pod, завершающие команды (например, awk, xargs) терпят неудачу и возвращают ненулевой код выхода. Такой код выхода воспринимается контроллером как сбой задания и, следовательно, запускает новый модуль для повторного запуска задания. Вы должны просто выйти с нулем, когда нет возвращенного модуля.

Другие вопросы по тегам