it-swarm.com.de

Kubernetes Job Cleanup

Von dem, was ich verstehe, soll das Job-Objekt nach einer gewissen Zeit Pods ernten ... Aber auf meinem GKE-Cluster (Kubernetes 1.1.8) scheint es, dass "kubectl get pods -a" Pods von Tagen auflisten kann. 

Alle wurden mit der Job-API erstellt.

Ich habe festgestellt, dass nach dem Löschen des Jobs mit kubectl Löschjobs .__ Die Pods wurden ebenfalls gelöscht.

Meine Hauptsorge ist hier, dass ich Tausende und Zehntausende von Pods im Stapel in Batch-Jobs ausführen und das interne Backlog-System nicht überladen möchte.

16
Lior Regev

Wenn Sie mit Kubernetes 1.6 (und der v2alpha1 api-Version) beginnen, sieht es so aus, als würden Sie, wenn Sie Cronjobs verwenden, um die Jobs zu erstellen (die wiederum Ihre Pods erstellen), limit wie Viele alte Arbeitsplätze bleiben erhalten. Fügen Sie Ihrer Jobspezifikation einfach Folgendes hinzu:

successfulJobsHistoryLimit: X
failedJobsHistoryLimit: Y

Wobei X und Y die Grenzen für die Anzahl der zuvor ausgeführten Jobs sind, die das System beibehalten soll (es hält Jobs unbegrenzt in der Standardeinstellung [mindestens in Version 1.5.])

Bearbeiten 2018-09-29:

Für neuere K8S-Versionen finden Sie hier aktualisierte Links mit Dokumentation dazu:

38
JJC

Dies ist das beabsichtigte Verhalten von Jobs auch in Kubernetes 1.3. Sowohl der Job als auch die Pods bleiben im System, bis Sie sie manuell löschen. Auf diese Weise können Sie die Ergebnisse der Pods (d. H. Durch Protokolle) anzeigen, die von keinem Mechanismus bereits nach außen transportiert wurden, oder nach Fehlern, Warnungen oder anderen Diagnoseausgaben suchen.

Der empfohlene/ offizielle Weg, um die Pods loszuwerden, besteht darin, den Job wie oben erwähnt zu löschen. Bei Verwendung des Garbage Collectors würden nur die Pods gelöscht, der Job selbst wäre jedoch immer noch im System.

Wenn Sie den Job nicht manuell löschen möchten, können Sie ein kleines Skript schreiben, das in Ihrem Cluster ausgeführt wird, nach abgeschlossenen Jobs suchen und diese löschen. Leider sind geplante Jobs nur kommt in 1.4 , aber Sie können das Skript stattdessen in einem normalen Pod ausführen.

2
puja

Es ist wahr, dass Sie Jobs früher manuell löschen mussten. Die Antwort von @ puja war zum Zeitpunkt des Schreibens korrekt.

Kubernetes 1.12.0 hat eine TTL - Funktion (in Alpha) veröffentlicht, mit der Sie festlegen können, dass Jobs automatisch eine bestimmte Anzahl von Sekunden nach Abschluss gelöscht werden ( changelog ). Sie können es zur sofortigen Bereinigung auf Null setzen. Siehe die Jobs-Dokumente .

Beispiel aus dem Dokument:

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

In kubernetes v1.2 gibt es einen Garbage Collector, um abgebrochene Pods mit einem globalen Schwellenwert --terminated-pod-gc-threshold=12500 zu ernten (siehe die Flags in controller manager . Mir ist kein GC-Mechanismus für terminierte Pods in v1.1.8 bekannt. Sie können dies tun Sie möchten ein Skript/Pod ausführen, um die Pods/Jobs regelmäßig zu bereinigen, um zu verhindern, dass die Master-Komponenten überlastet werden. Es gibt übrigens ein offenes Problem mit , um den GC-Schwellenwert automatisch anzupassen.

1
Yu-Ju Hong

Ich habe vor kurzem einen Kubernetes-Operator für diese Aufgabe erstellt.

Nach der Bereitstellung werden ausgewählte Namespaces überwacht und abgeschlossene Jobs/Pods gelöscht, wenn sie ohne Fehler/Neustarts abgeschlossen wurden.

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

1
lwolf