Wie entferne ich abgeschlossene Kubernetes-Jobs, die von einem CronJob erstellt wurden, automatisch?


75

Gibt es eine Möglichkeit, abgeschlossene Jobs automatisch zu entfernen, außer einen CronJob zum Bereinigen abgeschlossener Jobs zu erstellen?

In der K8-Jobdokumentation heißt es, dass das beabsichtigte Verhalten abgeschlossener Jobs darin besteht, dass sie bis zum manuellen Löschen in einem abgeschlossenen Zustand bleiben. Weil ich täglich Tausende von Jobs über CronJobs ausführe und keine abgeschlossenen Jobs behalten möchte.

Antworten:


87

Sie können jetzt Verlaufsbeschränkungen festlegen oder den Verlauf insgesamt deaktivieren, damit fehlgeschlagene oder erfolgreiche CronJobs nicht unbegrenzt beibehalten werden. Siehe meine Antwort hier . Die Dokumentation ist hier .

So legen Sie die Verlaufsgrenzen fest :

Die Felder .spec.successfulJobsHistoryLimitund .spec.failedJobsHistoryLimitsind optional. Diese Felder geben an, wie viele abgeschlossene und fehlgeschlagene Jobs beibehalten werden sollen. Standardmäßig sind sie auf 3 bzw. 1 eingestellt. Das Festlegen eines Limits auf 0entspricht dem Beibehalten keiner der entsprechenden Arten von Jobs nach deren Abschluss.

Die Konfiguration mit 0 Grenzwerten würde folgendermaßen aussehen:

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
Gibt es eine Möglichkeit, das Zeitlimit für den Verlauf festzulegen, z. B. das Löschen der erfolgreichen Jobs nach einer Woche?
Kamaraju

Nicht das ich wüsste, sorry. Veröffentlichen Sie hier ein Follow-up, wenn Sie einen Weg finden. Vermutlich könnte ich mir vorstellen, dass Sie einen Cron-Job schreiben könnten, der alte Pods-Zeitstempel betrachtet und dann nacheinander diejenigen löscht, die älter als X Tage sind.
JJC

Ja, ich erstelle eine Bereitstellung in Kubernetes, einem Golang-Projekt, habe einen Kanal erstellt, um die Liste der Pods anzuhören und die Änderung des Zustands zu beobachten.
Kamaraju

7
Beachten Sie, dass die verknüpfte Antwort nur für CronJobObjekte gilt (die der Fragesteller erwähnt hat), nicht jedoch für JobObjekte.
Cory Klein

Vielleicht schauen Sie auch hier , es sieht so aus, als ob es eine Möglichkeit gibt, ein ttlSecondsAfterFinished zu definieren, das "den Job kaskadierend löscht, dh seine abhängigen Objekte wie Pods zusammen mit dem Job
löscht

18

Dies ist ab Version 1.12 Alpha mit möglich ttlSecondsAfterFinished. Ein Beispiel aus Automatische Bereinigung abgeschlossener Jobs :

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 Ich habe diesen Feature-Gate-Teil nicht verstanden.
Technazi

1
Feature-Gates sind Flags, die die Kubernetes-Funktionalität aktivieren oder deaktivieren. Ich weiß nicht, wie ich sie einrichten soll oder ob Sie dies mit einem gehosteten Dienst wie EKS tun können. Ich vermute, Sie müssen auch die Masterknoten konfigurieren, aber ich spekuliere. @technazi
rath

1
Danke @rath! Ja, während ich die Jobs und Pods über Helmvorlagen konfiguriere, sehe ich keinen Ort, an dem ich die Feature-Gates konfigurieren kann, und daher kann ich die Alpha-Verbesserungen nicht verwenden. Im Wesentlichen ttlSecondsAfterFinishedhat dies ohne die Feature-Gates keine Auswirkungen.
Technazi

15

Ich habe festgestellt, dass das Folgende funktioniert

So entfernen Sie fehlgeschlagene Jobs:

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

So entfernen Sie abgeschlossene Aufträge:

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

1
Ich musste den Befehl aktualisieren, damit er funktioniert:kubectl delete jobs $(kubectl get jobs | awk '$2 ~ 1/1' | awk '{print $1}')
user2804197

9

Ich benutze das Kubectl-Bild von wernight / kubectl

einen Cron geplant, der alles löscht, was ist

  • completed
  • 2 - 9 days old (Ich habe also 2 Tage Zeit, um fehlgeschlagene Jobs zu überprüfen.)

Es läuft alle 30 Minuten, daher berücksichtige ich keine Jobs, die mehr als 10 Tage alt sind

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

Möchten Sie für Ihren awkBefehl nicht, dass Ihre zweite Bedingung $2 ~ /^1/statt $3 ~ 1? Ich nehme an, Sie bei der Fertig Spalte suchen , die in der zweiten Spalte ist, zumindest für mich, und Ergänzungen sind gedruckt wie 0/1oder 1/1so ist es wichtig , das erste Zeichen zu erhalten. Vielleicht ist Ihre Ausgabe für kubectl get jobanders.
Stephen

Sie können die beiden awkBefehle auch zu einem kombinieren . Ich habe Folgendes getestet und es wird als Ersatz für die awk-Komponente des oben genannten funktionieren:awk '$4 ~ /^[2-9]d/ || $2 ~ /^1/ {print $1}'
Stephen


6

Verwenden von jsonpath:

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

5

Wie in der Dokumentation "Es ist Sache des Benutzers, alte Jobs zu löschen" angegeben, siehe http://kubernetes.io/docs/user-guide/jobs/#job-termination-and-cleanup

Ich würde einen Pod ausführen, um diese Bereinigung basierend auf dem Jobnamen und bestimmten Bedingungen durchzuführen, sodass Kubernetes sich zumindest um die Verfügbarkeit Ihres Prozesses hier kümmern kann. Sie könnten hierfür einen wiederkehrenden Job ausführen (vorausgesetzt, Sie führen kubernetes 1.5 aus).


5

Eine einfache Möglichkeit, sie durch Ausführen eines Cron-Jobs zu löschen:

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

2
Es ist nicht ratsam, die Textausgabe zu analysieren. Stattdessen sollten Sie einen json anfordern, ihn mit jq analysieren und das Ergebnis durchlaufen.
Mikulas Dite

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

4
Tu das nicht. Dies löscht auch laufende Jobs
Cristi

4

Ein anderer Weg mit einem Feldwähler :

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

Eine andere Möglichkeit, dies in einem Cronjob auszuführen, ähnlich einer anderen Antwort, wäre:

Erstellen Sie ein Dienstkonto mit Stapel- / Auftragsliste und löschen Sie die Berechtigung. Es wird Bitnami Kubectl verwendet, da das vorgeschlagene Kubectl-Bild nicht über die field-selectorOption verfügt

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
Können Sie ein Beispiel hinzufügen, wie Sie eine Service-Kanzlei mit den erforderlichen Berechtigungen erstellen können?
Brechtvhb
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.