Как автоматически удалить завершенные задания 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-оператор для выполнения этой задачи.

После развертывания он будет отслеживать выбранное пространство имен и удалять завершенные задания / модули, если они завершены без ошибок / перезапусков.

https://github.com/lwolf/kube-cleanup-operator

Используя 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
Другие вопросы по тегам