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.successfulJobsHistoryLimit
und .spec.failedJobsHistoryLimit
sind 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 0
entspricht 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
CronJob
Objekte gilt (die der Fragesteller erwähnt hat), nicht jedoch fürJob
Objekte.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
quelle
Note that this TTL mechanism is alpha, with feature gate TTLAfterFinished
Ich habe diesen Feature-Gate-Teil nicht verstanden.ttlSecondsAfterFinished
hat dies ohne die Feature-Gates keine Auswirkungen.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}')
quelle
kubectl delete jobs $(kubectl get jobs | awk '$2 ~ 1/1' | awk '{print $1}')
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
quelle
awk
Befehl 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 wie0/1
oder1/1
so ist es wichtig , das erste Zeichen zu erhalten. Vielleicht ist Ihre Ausgabe fürkubectl get job
anders.awk
Befehle 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}'
Ich habe kürzlich einen Kubernetes-Operator erstellt, um diese Aufgabe zu erledigen.
Nach der Bereitstellung wird der ausgewählte Namespace überwacht und abgeschlossene Jobs / Pods gelöscht, wenn sie ohne Fehler / Neustarts abgeschlossen wurden.
https://github.com/lwolf/kube-cleanup-operator
quelle
Verwenden von jsonpath:
kubectl delete job $(kubectl get job -o=jsonpath='{.items[?(@.status.succeeded==1)].metadata.name}')
quelle
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).
quelle
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
quelle
kubectl delete job $(kubectl get jobs -o jsonpath='{.items[?(@.status.completionTime)].metadata.name}')
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-selector
Option verfügtapiVersion: 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
quelle