Job ausführen

Auf dieser Seite wird erläutert, wie Jobs in Google Kubernetes Engine ausgeführt werden.

Übersicht

In GKE ist ein Job ein Controllerobjekt, das eine endliche Aufgabe darstellt. Jobs unterscheiden sich von anderen Controllerobjekten dadurch, dass Jobs die Aufgabe so verwalten, wie sie ausgeführt wird, anstatt einen laufenden gewünschten Status zu verwalten (z. B. die Gesamtzahl der laufenden Pods).

Jobs sind nützlich für große Berechnungen und batchorientierte Aufgaben. Jobs können verwendet werden, um die parallele Ausführung von Pods zu unterstützen. Mit einem Job können Sie unabhängige, aber verwandte Arbeitsaufgaben parallel ausführen: E-Mails senden, Frames rendern, Dateien transcodieren, Datenbankschlüssel scannen usw. Jobs sind jedoch nicht für intensiv kommunizierende parallele Prozesse wie kontinuierliche Hintergrundprozesse ausgelegt.

In GKE gibt es zwei Arten von Jobs:

  • Nicht paralleler Job: Ein Job, der nur einen Pod erstellt (der neu erstellt wird, wenn der Pod nicht erfolgreich beendet wird) und der abgeschlossen wird, wenn der Pod erfolgreich beendet wird.
  • Parallele Jobs mit einem Abschlusszähler: Ein Job, der abgeschlossen ist, nachdem eine bestimmte Anzahl von Pods erfolgreich beendet worden ist. Sie geben die gewünschte Anzahl an Ausführungen in das Feld completions ein.

Jobs werden durch Kubernetes-Jobobjekte (nur auf Englisch verfügbar) dargestellt. Beim Erstellen eines Jobs erstellt der Jobcontroller einen oder mehrere Pods und gewährleistet, dass seine Pods erfolgreich beendet werden. Bei Beendigung seiner Pods erfasst ein Job, wie viele Pods ihre Aufgaben erfolgreich ausgeführt haben. Sobald die gewünschte Anzahl erfolgreicher Ausführungen erreicht ist, wird der Job abgeschlossen.

Ähnlich wie bei anderen Controllern erstellt ein Job-Controller einen neuen Pod, wenn einer seiner Pods ausfällt oder gelöscht wird.

Vorbereitung

Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:

Mit den folgenden Methoden können Sie die gcloud-Einstellungen festlegen:

  • Verwenden Sie gcloud init, wenn Sie die Standardeinstellungen ansehen möchten.
  • Verwenden Sie gcloud config, um Ihre Projekt-ID, Zone und Region individuell festzulegen.

gcloud init verwenden

Wenn Sie die Fehlermeldung One of [--zone, --region] must be supplied: Please specify location erhalten, führen Sie diesen Abschnitt aus.

  1. Führen Sie gcloud init aus und folgen Sie der Anleitung:

    gcloud init

    Wenn Sie SSH auf einem Remote-Server verwenden, können Sie mit dem Flag --console-only verhindern, dass mit dem Befehl ein Browserfenster geöffnet wird:

    gcloud init --console-only
  2. Folgen Sie der Anleitung, um gcloud zur Verwendung Ihres Google Cloud-Kontos zu autorisieren.
  3. Erstellen Sie eine neue Konfiguration oder wählen Sie eine vorhandene aus.
  4. Wählen Sie ein Google Cloud-Projekt aus.
  5. Wählen Sie eine Compute Engine-Standardzone aus.

gcloud config verwenden

  • Legen Sie Ihre standardmäßige Projekt-ID fest:
    gcloud config set project project-id
  • Wenn Sie mit zonalen Clustern arbeiten, legen Sie die Compute-Standardzone fest:
    gcloud config set compute/zone compute-zone
  • Wenn Sie mit regionalen Clustern arbeiten, legen Sie die Standardregion für Compute Engine fest:
    gcloud config set compute/region compute-region
  • Aktualisieren Sie gcloud auf die neueste Version:
    gcloud components update

Job erstellen

Sie können einen Job erstellen, wenn Sie kubectl apply mit einer Manifestdatei verwenden.

Das folgende Beispiel zeigt ein Jobmanifest:

apiVersion: batch/v1
kind: Job
metadata:
  # Unique key of the Job instance
  name: example-job
spec:
  template:
    metadata:
      name: example-job
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl"]
        args: ["-Mbignum=bpi", "-wle", "print bpi(2000)"]
      # Do not restart containers after they exit
      restartPolicy: Never
  # of retries before marking as failed.
  backoffLimit: 4

Kopieren Sie das Manifest in eine Datei mit dem Namen config.yaml und erstellen Sie den Job:

kubectl apply -f config.yaml

Dieser Job berechnet Pi bis zu 2.000 Stellen und druckt es dann aus.

Die einzige Voraussetzung für ein Jobobjekt ist, dass das Pod-Feld template obligatorisch ist.

Anzahl der Jobvervollständigungen

Ein Job ist abgeschlossen, nachdem eine bestimmte Anzahl von Pods erfolgreich beendet worden ist. Standardmäßig wird ein nicht paralleler Job mit einem einzelnen Pod abgeschlossen, sobald der Pod erfolgreich beendet wird.

Bei einem parallelen Job können Sie mit dem optionalen Feld completions eine Zählung der Vervollständigungen festlegen. Dieses Feld gibt an, wie viele Pods erfolgreich beendet werden sollten, bevor der Job abgeschlossen wird. Das Feld completions akzeptiert einen positiven Wert ungleich Null.

Wenn Sie completions weglassen oder den Wert Null festlegen, signalisiert der Erfolg eines Pods den Erfolg aller Pods.

Kopieren Sie die Datei config.yaml aus dem vorherigen Beispiel in eine Datei mit dem Namen config-2.yaml. Ändern Sie in config-2.yaml das Wort name in example-job-2 und fügen Sie completions: 8 in das Feld spec des Jobs ein. Damit wird angegeben, dass acht erfolgreiche Vervollständigungen vorhanden sein sollten:

apiVersion: batch/v1
kind: Job
metadata:
  name: example-job-2
spec:
  completions: 8
  template:
    metadata:
      name: example-job-2
    spec:
      ...

Erstellen Sie den Job:

kubectl apply -f config-2.yaml

Der Standardwert von completions ist 1. Wenn completions gesetzt ist, wird das Feld parallelism standardmäßig auf 1 gesetzt, sofern nichts anderes festgelegt ist. Wenn beide Felder nicht gesetzt sind, sind ihre Standardwerte 1.

Parallelität verwalten

Standardmäßig werden Job-Pods nicht parallel ausgeführt. Das optionale Feld parallelism gibt die maximal gewünschte Anzahl von Pods an, die ein Job zu einem bestimmten Zeitpunkt gleichzeitig ausführen soll.

Die tatsächliche Anzahl von Pods, die in einem stabilen Zustand ausgeführt werden, ist möglicherweise kleiner als der Wert von parallelism, wenn die verbleibende Arbeit kleiner als parallelism ist. Wenn Sie außerdem completions gesetzt haben, überschreitet die tatsächliche Anzahl der parallel ausgeführten Pods nicht die Anzahl der verbleibenden Vervollständigungen. Ein Job kann die Pod-Erstellung als Reaktion auf zu viele Fehler bei der Pod-Erstellung drosseln.

Kopieren Sie die Datei config.yaml aus dem vorherigen Beispiel in eine Datei mit dem Namen config-3.yaml. Ändern Sie in config-3.yaml das Wort name in example-job-3 und fügen Sie parallelism: 5 in das Feld spec des Jobs ein. Dadurch wird angegeben, dass fünf Pods gleichzeitig ausgeführt werden sollen:

apiVersion: batch/v1
kind: Job
metadata:
  name: example-job-3
spec:
  parallelism: 5
  template:
    metadata:
      name: example-job-3
    spec:
      ...

Erstellen Sie den Job:

kubectl apply -f config-3.yaml

Der Standardwert für parallelismist 1, wenn das Feld ausgelassen wird oder wenn nichts anderes festgelegt ist. Wenn der Wert auf 0 gesetzt ist, wird der Job angehalten, bis der Wert erhöht wird.

Wiederholungsversuche angeben

Standardmäßig wird ein Job ohne Unterbrechung ausgeführt. Wenn allerdings ein Fehler auftritt, prüft der Job backoffLimit. Das Feld backoffLimit gibt die Anzahl der Wiederholungsversuche an, die erfolgen, bevor der Job als fehlgeschlagen markiert wird. Der Standardwert ist 6. Die Anzahl der Wiederholungsversuche gilt pro Pod, nicht global. Wenn also mehrere Pods fehlschlagen (wenn parallelism größer als 1 ist), wird der Job so lange ausgeführt, bis die Anzahl der Ausfälle eines einzelnen Pods dem Wert von backoffLimit entspricht. Sobald backoffLimit erreicht ist, wird der Job als fehlgeschlagen markiert und alle ausgeführten Pods werden beendet.

In unserem Beispieljob legen wir beispielsweise die Anzahl der Wiederholungsversuche auf 4 fest:

apiVersion: batch/v1
kind: Job
metadata:
  name: example-job
spec:
  template:
    metadata:
      name: example-job
    spec:
      containers:
      ...
  backoffLimit: 4

Pod-Ersetzung

Der Job erstellt Pods unter Berücksichtigung von backoffLimit neu, wenn der aktuelle Pod in Szenarien wie den folgenden als fehlgeschlagen gilt:

  • Der Pod-Container wird mit einem Fehlercode ungleich null beendet.
  • Wenn ein Knoten neu gestartet wird, markiert das Kubelet den Pod nach dem Neustart möglicherweise als Failed.

In bestimmten Szenarien ersetzt ein nicht abgeschlossener Job den Pod ohne Berücksichtigung von backoffLimit. Beispiele:

  • Wenn Sie einen Pod manuell beenden, wird die Pod-Phase nicht auf Failed gesetzt. Der Ersatz-Pod kann erstellt werden, noch bevor der Kulanzzeitraum für die Beendigung des aktuellen Pods abgelaufen ist.
  • Wenn ein Knoten (manuell oder während eines automatischen Upgrades) per Drain beendet wird, wird der Pod unter Berücksichtigung des Kulanzzeitraums beendet und ersetzt.
  • Wenn ein Knoten gelöscht wird, wird der Pod automatisch bereinigt (als gelöscht markiert) und ersetzt.

Frist festlegen

Standardmäßig erstellt ein Job immer weiter neue Pods, wenn seine Pods kontinuierlich fehlschlagen. Wenn Sie nicht möchten, dass der Job diesen Vorgang endlos wiederholt, können Sie mit dem optionalen Feld activeDeadlineSeconds eine Frist festlegen.

Eine Frist garantiert, dass einem Job eine bestimmte Zeit in Sekunden eingeräumt wird, um seine Aufgaben erfolgreich abzuschließen, bevor er beendet wird.

Wenn Sie eine Frist festlegen möchten, fügen Sie den Wert activeDeadlineSeconds in das Feld spec in der Manifestdatei des Jobs ein. Zum Beispiel gibt die folgende Konfiguration an, dass der Job 100 Sekunden hat, um erfolgreich abgeschlossen zu werden:

apiVersion: batch/v1
kind: Job
metadata:
  name: example-job
spec:
  activeDeadlineSeconds: 100
  template:
    metadata:
      name: example-job
    spec:
      ...

Wenn ein Job vor Ablauf der Frist nicht erfolgreich abgeschlossen wird, endet der Job mit dem Status DeadlineExceeded. Dadurch wird die Erstellung von Pods angehalten und vorhandene Pods werden gelöscht.

Pod-Selektor festlegen

Einen Selektor manuell festzulegen ist dann sinnvoll, wenn Sie die Pod-Vorlage eines Jobs aktualisieren möchten und die aktuellen Pods des Jobs unter dem aktualisierten Job ausgeführt werden sollen.

Ein Job wird mit einem selector-Feld instanziiert. Der selector generiert eine eindeutige Kennung für die Pods des Jobs. Die generierte ID weist keine Überschneidung mit anderen Jobs auf. Im Allgemeinen sollten Sie dieses Feld nicht selbst setzen. Ein selector-Wert, der sich mit dem eines anderen Jobs überschneidet, kann zu Problemen mit den Pods in dem anderen Job führen. Wenn Sie das Feld selbst festlegen möchten, müssen Sie manualSelector: True im Feld spec des Jobs festlegen.

Beispiel: Sie können kubectl get job my-job --output=yaml ausführen, um die Spezifikation des Jobs anzuzeigen, die den Selektor enthält, der für seinen Pod generiert wurde:

kind: Job
metadata:
  name: my-job
...
spec:
  completions: 1
  parallelism: 1
  selector:
    matchLabels:
      controller-uid: a8f3d00d-c6d2-11e5-9f87-42010af00002
...

Wenn Sie einen neuen Job erstellen, können Sie den Wert manualSelector auf True setzen. Dann setzen Sie im Feld selector den Wert job-uid folgendermaßen:

kind: Job
metadata:
  name: my-new-job
  ...
spec:
  manualSelector: true
  selector:
    matchLabels:
      controller-uid: a8f3d00d-c6d2-11e5-9f87-42010af00002
  ...

Pods, die von my-new-job erstellt wurden, verwenden die vorherige Pod-UID.

Job überprüfen

kubectl

Führen Sie den folgenden Befehl aus, um den Status eines Jobs zu überprüfen:

kubectl describe job my-job

Zum Anzeigen aller Pod-Ressourcen in Ihrem Cluster, einschließlich Pods, die von dem abgeschlossenen Job erstellt wurden, führen Sie Folgendes aus:

kubectl get pods -a

Das Flag -a gibt an, dass alle Ressourcen des angegebenen Typs (in diesem Fall Pods) angezeigt werden sollen.

Console

Nachdem Sie einen Job mit kubectl erstellt haben, können Sie ihn so überprüfen:

  1. Rufen Sie in der Cloud Console das Google Kubernetes Engine-Menü "Arbeitslasten" auf.

    Zum Menü "Arbeitslasten"

  2. Wählen Sie die gewünschte Arbeitslast aus dem Menü aus.

Sie können den Job auf folgende Arten überprüfen:

  • Klicken Sie auf YAML, um die Live-Konfiguration des Jobs anzuzeigen.
  • Klicken Sie auf Ereignisse, um alle Ereignisse im Zusammenhang mit dem Job anzuzeigen.
  • Klicken Sie auf Überarbeitungsverlauf, um den Überarbeitungsverlauf des Jobs zu sehen.

Job löschen

Wenn ein Job abgeschlossen ist, stoppt der Job und die Pods werden erstellt. Das API-Objekt des Jobs wird nicht entfernt, wenn der Vorgang abgeschlossen ist. So können Sie dessen Status anzeigen. Pods, die vom Job erstellt wurden, werden nicht gelöscht, aber sie werden beendet. Durch die Erhaltung der Pods können Sie ihre Logs anzeigen lassen und mit ihnen interagieren.

kubectl

Führen Sie den folgenden Befehl aus, um einen Job zu löschen:

kubectl delete job my-job

Wenn Sie einen Job löschen, werden auch alle Pods gelöscht.

Geben Sie das Flag --cascade false an, um einen Job zu löschen, seine Pods jedoch beizubehalten:

kubectl delete jobs my-job --cascade false

Console

Mit den folgenden Schritten löschen Sie einen Job:

  1. Rufen Sie in der Cloud Console das Google Kubernetes Engine-Menü "Arbeitslasten" auf.

    Zum Menü "Arbeitslasten"

  2. Wählen Sie im Menü die gewünschte Arbeitslast aus.

  3. Klicken Sie auf Löschen.

  4. Klicken Sie im Bestätigungsdialogfeld auf Löschen.

Weitere Informationen