Как автоматически удалить завершенные задания Kubernetes?
Есть ли способ автоматического удаления завершенных заданий, кроме выполнения задания для очистки завершенных заданий?
Документация заданий K8s утверждает, что предполагаемое поведение завершенных заданий заключается в том, чтобы они оставались в завершенном состоянии до тех пор, пока не будут удалены вручную. Потому что я выполняю тысячи рабочих мест в день через cronjobs k8s, и я не хочу, чтобы сохранялась полная работа.
6 ответов
Это возможно с версии 1.12 Альфа с ttlSecondsAfterFinished
, Пример автоматической очистки готовых заданий:
apiVersion: batch/v1
kind: Job
metadata:
name: pi-with-ttl
spec:
ttlSecondsAfterFinished: 100
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
Другой способ использования селектора полей:
kubectl delete jobs --field-selector status.successful=1
Другой способ запустить это в cronjob, похожий на другой ответ:
Создайте учетную запись службы со списком пакетов / заданий и разрешением на удаление; Он использует битнами kubectl, потому что предлагаемый образ kubectl не имеетfield-selector
вариант
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: jobs-cleanup
spec:
schedule: "*/30 * * * *"
jobTemplate:
spec:
template:
spec:
serviceAccountName: my-sa-name
containers:
- name: kubectl-container
image: bitnami/kubectl:latest
command: ["sh", "-c", "kubectl delete jobs --field-selector status.successful=1"]
restartPolicy: Never
Я нашел ниже, чтобы работать
Чтобы удалить сбойные задания:
kubectl delete job $(kubectl get jobs | awk '$3 ~ 0' | awk '{print $1}')
Чтобы удалить выполненные задания:
kubectl delete job $(kubectl get jobs | awk '$3 ~ 1' | awk '{print $1}')
Я использую wernight / kubectl"s kubectl изображение
запланировал cron удаление всего, что есть
completed
2 - 9 days old
(так что у меня есть 2 дня, чтобы проверить все неудавшиеся работы)
он запускается каждые 30 минут, поэтому я не учитываю вакансии старше 10 дней
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cleanup
spec:
schedule: "*/30 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: kubectl-runner
image: wernight/kubectl
command: ["sh", "-c", "kubectl get jobs | awk '$4 ~ /[2-9]d$/ || $3 ~ 1' | awk '{print $1}' | xargs kubectl delete job"]
restartPolicy: Never
Я недавно построил kubernetes-оператор для выполнения этой задачи.
После развертывания он будет отслеживать выбранное пространство имен и удалять завершенные задания / модули, если они завершены без ошибок / перезапусков.
Используя jsonpath:
kubectl delete job $(kubectl get job -o=jsonpath='{.items[?(@.status.succeeded==1)].metadata.name}')
Как указано в документации "Пользователь может удалить старые задания", см. http://kubernetes.io/docs/user-guide/jobs/.
Я бы запустил модуль для выполнения этой очистки на основе имени задания и определенных условий, что позволило бы kubernetes по крайней мере позаботиться о доступности вашего процесса здесь. Вы можете запустить повторяющуюся работу для этого (при условии, что вы запускаете kubernetes 1.5).
Простой способ удалить их, запустив задание cron:
kubectl get jobs --all-namespaces | sed '1d' | awk '{ print $2, "--namespace", $1 }' | while read line; do kubectl delete jobs $line; done