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) терпят неудачу и возвращают ненулевой код выхода. Такой код выхода воспринимается контроллером как сбой задания и, следовательно, запускает новый модуль для повторного запуска задания. Вы должны просто выйти с нулем, когда нет возвращенного модуля.