Як автоматично видалити завершені завдання Kubernetes, створені CronJob?


82

Чи є спосіб автоматичного видалення виконаних завдань, крім створення CronJob для очищення виконаних завдань?

Документація про роботу K8s стверджує, що передбачувана поведінка виконаних завдань полягає у тому, щоб вони залишались у завершеному стані до видалення вручну. Оскільки я працюю тисячами вакансій щодня через CronJobs, і я не хочу тримати завершені вакансії.

Відповіді:


97

Тепер ви можете встановити обмеження історії або взагалі вимкнути історію, щоб невдалі або успішні CronJobs не тривали довгий час. Дивіться мою відповідь тут . Документація тут .

Щоб встановити обмеження історії :

.spec.successfulJobsHistoryLimitІ .spec.failedJobsHistoryLimitполя є необов'язковими. У цих полях вказано, скільки виконаних та невдалих завдань слід зберігати. За замовчуванням вони встановлюються на 3 та 1 відповідно. Встановлення обмеження 0відповідає збереженню жодного із відповідних видів робіт після їх закінчення.

Конфігурація з 0 обмеженнями виглядатиме так:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  successfulJobsHistoryLimit: 0
  failedJobsHistoryLimit: 0
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

2
Чи є спосіб встановити обмеження часу для історії, наприклад, видалити успішні завдання через тиждень?
Kamaraju

Не те, що я знаю, вибачте. Якщо ви знайдете спосіб, розмістіть тут повідомлення. Імовірно, я думаю, ви могли б написати завдання cron, яке б переглядало старі позначки часу стручків, а потім по черзі видаляло ті, що перевищували X днів.
JJC

Так, я створюю розгортання в Kubernetes, проект golang, створив канал для прослуховування списку стручків та спостереження за зміною стану.
Камараджу,

7
Зверніть увагу, що зв’язана відповідь стосується лише CronJobоб’єктів (про які згадував автор), але не Jobоб’єктів.
Cory Klein

можливо, також подивіться тут , схоже, є можливість прийти до визначення ttlSecondsAfterFinished, який "буде видаляти завдання каскадно, тобто видаляти його залежні об'єкти, такі як Pods, разом із завданням"
hilbert

19

Це можливо з версії 1.12 Alpha with 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

Note that this TTL mechanism is alpha, with feature gate TTLAfterFinished Я не зрозумів цієї частини функціональних воріт.
техназі

1
Функціональні ворота - це прапори, які вмикають або вимикають функціональність Kubernetes. Я не знаю, як їх налаштувати, і навіть якщо у вас є можливість це зробити за допомогою такої послуги, як EKS. Я підозрюю, що вам також потрібно налаштувати майстер-вузли, але я припускаю. @technazi
rath,

1
Дякую @rath! Так, поки я налаштовую завдання та підсистеми за допомогою шаблонів керма, я не бачу місця, де б я міг налаштувати ворота функцій, а отже, я не можу використовувати вдосконалення альфа-версії, по суті кажучи, ttlSecondsAfterFinishedце не має ефекту без входів функцій.
техназі

16

Я виявив, що наведене нижче працює

Щоб видалити невдалі завдання:

kubectl delete job $(kubectl get jobs | awk '$3 ~ 0' | awk '{print $1}')

Щоб видалити виконані завдання:

kubectl delete job $(kubectl get jobs | awk '$3 ~ 1' | awk '{print $1}')

2
Мені довелося оновити команду, щоб вона працювала:kubectl delete jobs $(kubectl get jobs | awk '$2 ~ 1/1' | awk '{print $1}')
user2804197

10

Я використовую 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

Для вашої awkкоманди, чи не хотіли б ви, щоб $2 ~ /^1/замість вас була друга умова $3 ~ 1? Я припускаю, що ви дивитесь на стовпець завершень, який є другим стовпцем, принаймні для мене, і завершення друкуються так, 0/1або 1/1так важливо, щоб отримати перший символ. Можливо, ваш результат для kubectl get jobінший.
Стівен

Ви також можете поєднати дві awkкоманди в одну. Я протестував наступне, і це буде працювати як заміна компоненту awk вищезазначеного:awk '$4 ~ /^[2-9]d/ || $2 ~ /^1/ {print $1}'
Стівен

7

Нещодавно я створив kubernetes-оператор для виконання цього завдання.

Після розгортання він буде контролювати вибраний простір імен і видаляти виконані завдання / підсистеми, якщо вони виконані без помилок / перезапусків.

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


8
Будь ласка, не просто публікуйте якийсь інструмент чи бібліотеку як відповідь. Принаймні продемонструйте, як це вирішує проблему, у самій відповіді.
Baum mit Augen

6

Використання jsonpath:

kubectl delete job $(kubectl get job -o=jsonpath='{.items[?(@.status.succeeded==1)].metadata.name}')

6

Інший спосіб використання селектора поля :

kubectl delete jobs --field-selector status.successful=1 

Іншим способом запустити це в cronjob, подібним до іншої відповіді, буде:

Створити обліковий запис служби зі списком пакетів / завдань та видалити дозвіл; Він використовує bitnami 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

2
Не могли б ви додати приклад того, як ви можете створити службовий акаунт із необхідними дозволами?
brechtvhb

5

Як зазначено в документації "Користувач повинен видалити старі завдання", див Http://kubernetes.io/docs/user-guide/jobs/#job-termination-and-cleanup

Я запустив би стручок, щоб виконати це очищення, виходячи з назви посади та певних умов, дозволяючи kubernetes принаймні подбати про доступність вашого процесу тут. Для цього ви можете запустити повторюване завдання (за умови, що ви запустили kubernetes 1.5).


4

Простий спосіб їх видалити, виконавши завдання cron:

kubectl get jobs --all-namespaces | sed '1d' | awk '{ print $2, "--namespace", $1 }' | while read line; do kubectl delete jobs $line; done

2
Не бажано проводити синтаксичний аналіз виводу тексту. Натомість вам слід запитати json, проаналізувати його за допомогою jq і переглядати результат.
Mikulas Dite

1
kubectl delete job $(kubectl get jobs -o jsonpath='{.items[?(@.status.completionTime)].metadata.name}')
Payman

5
Не роби цього. Це видаляє також запущені робочі місця
cristi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.