CronJobs


CronJobs sind ab Version 1.21 von Google Kubernetes Engine (GA) allgemein verfügbar. In diesem Dokument wird erläutert, wie CronJobs in GKE ausgeführt werden. CronJobs sind eine in Kubernetes integrierte Funktion. Weitere Informationen finden Sie in der Kubernetes-Dokumentation zu CronJobs.

Übersicht

CronJobs erstellen Kubernetes-Jobs nach einem sich wiederholenden Zeitplan. Mit CronJobs können Sie regelmäßige Aufgaben wie das Erstellen von Sicherungen, das Erstellen von Berichten, das Senden von E-Mails oder das Bereinigen von Aufgaben automatisieren.

CronJobs werden genauso erstellt, verwaltet, skaliert und gelöscht wie Jobs. Die genaue Anzahl der erstellten Jobobjekte hängt von mehreren Faktoren ab. Weitere Informationen finden Sie unter CronJob-Einschränkungen.

Weitere Informationen zu Jobs finden Sie unter Job ausführen.

Vorbereitung

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

  • Aktivieren Sie die Google Kubernetes Engine API.
  • Google Kubernetes Engine API aktivieren
  • Wenn Sie die Google Cloud CLI für diese Aufgabe verwenden möchten, müssen Sie die gcloud CLI installieren und dann initialisieren. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit gcloud components update ab.

CronJobs erstellen

Sie können einen CronJob mithilfe einer Manifestdatei erstellen. Das folgende YAML-Manifest gibt beispielsweise jede Minute die aktuelle Zeit und einen String aus, wobei die Standardwerte für CronJob-Parameter beibehalten werden:

# cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  concurrencyPolicy: Allow
  startingDeadlineSeconds: 100
  suspend: false
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo "Hello, World!"
          restartPolicy: OnFailure

Zum Erstellen dieses CronJobs speichern Sie das YAML-Manifest in einer Datei und wenden es auf den Cluster an:

kubectl apply -f PATH_TO_FILE

Ersetzen Sie PATH_TO_FILE durch den Pfad zum YAML-Manifest.

CronJobs konfigurieren

Beim Erstellen eines CronJobs können Sie die folgenden Parameter angeben:

Festlegen, wann der CronJob ausgeführt wird

Im Feld spec.schedule legen Sie im Unix-Standardformat crontab fest, wann und wie oft der CronJob ausgeführt wird. Alle CronJob-Zeiten werden in UTC angegeben. Dabei gibt es fünf durch Leerzeichen getrennte Felder. Diese Felder stellen Folgendes dar:

  1. Minuten (zwischen 0 und 59)
  2. Stunden (zwischen 0 und 23)
  3. Tag des Monats (zwischen 1 und 31)
  4. Monat (zwischen 1 und 12)
  5. Wochentag (zwischen 0 und 6 ab Sonntag)

In den spec.schedule-Feldern können Sie folgende Sonderzeichen verwenden:

  • ? ist ein Platzhalterwert, der einem einzelnen Zeichen entspricht.
  • * ist ein Platzhalterwert, der null oder mehr Zeichen entspricht.
  • / ermöglicht es Ihnen, für ein Feld ein Intervall anzugeben. Wenn beispielsweise das erste Feld (das Feld für die Minuten) den Wert */5 enthält, bedeutet dies "alle fünf Minuten". Wenn das fünfte Feld (das Feld für den Wochentag) auf 0/5 festgelegt ist, bedeutet dies "jeden fünften Sonntag".

Festlegen, was der CronJob ausführt

Die Vorlage spec.jobTemplate beschreibt, was der CronJob ausführt, einschließlich seiner Container-Images, der Befehle, die die Container ausführen, und der Neustartrichtlinie für den CronJob. Weitere Informationen zur Verwendung von spec.jobTemplate finden Sie in der Kubernetes CronJob-Dokumentation.

Frist festlegen

Das optionale Feld startingDeadlineSeconds gibt an, wie viele Sekunden der CronJob höchstens zum Starten benötigen darf, wenn die geplante Startzeit aus irgendeinem Grund verpasst wurde. Nicht ausgeführte CronJobs gelten als fehlgeschlagen.

Wenn Sie eine Frist festlegen möchten, fügen Sie in der Manifestdatei des Jobs den Wert startingDeadlineSeconds in das Feld spec ein. Im folgenden Manifest ist zum Beispiel festgelegt, dass dem CronJob 100 Sekunden für den Start der Ausführung bleiben:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  startingDeadlineSeconds: 100
  jobTemplate:
    spec:
    ...

Gleichzeitigkeitsrichtlinie festlegen

Im optionalen Feld spec.concurrencyPolicy legen Sie fest, was geschieht, wenn ein vom CronJob-Controller erstellter Job mehrmals gleichzeitig ausgeführt wird. Falls Sie keinen Wert festlegen, sind mehrere gleichzeitige Jobs standardmäßig zulässig.

concurrencyPolicy kann folgende Werte haben:

Wert Bedeutung
Allow Gleichzeitige Jobs sind zulässig. Das ist die Standardeinstellung.
Forbid Gleichzeitige Jobs sind unzulässig und neue Jobs können erst gestartet werden, nachdem vorherige Jobs abgeschlossen wurden oder zu einer Zeitüberschreitung geführt haben.
Replace Gleichzeitige Jobs sind unzulässig und alte Jobs werden zugunsten neuer Jobs abgebrochen.

Nachfolgende Ausführungen aussetzen

Wenn das optionale Feld spec.suspend auf true festgelegt ist, wird die Ausführung neuer Jobs verhindert, die Fertigstellung derzeit laufender Ausführungen jedoch zugelassen.

Verlaufsgrenzwerte definieren

Ein CronJob erstellt bei jeder Ausführung einen Pod. Informationen zum Ansehen des Beendigungsstatus der letzten Ausführungen eines CronJobs sowie der Logs eines einzelnen Pods finden Sie unter CronJob-Verlauf ansehen.

Sie können festlegen, wie viele erfolgreiche und fehlgeschlagene CronJob-Ausführungen gespeichert werden sollen, wenn Sie Werte für spec.successfulJobsHistoryLimit und spec.failedJobsHistoryLimit angeben. Standardmäßig ist successfulJobsHistoryLimit auf 3 und failedJobsHistoryLimit auf 1 festgelegt.

Das folgende Manifest weist GKE beispielsweise an, maximal fünf erfolgreiche CronJob-Ausführungen und maximal 10 fehlgeschlagene CronJob-Ausführungen zu speichern:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  startingDeadlineSeconds: 100
  successfulJobsHistoryLimit: 5
  failedJobsHistoryLimit: 10
  jobTemplate:
    spec:
    ...

Wenn Sie die Aufbewahrung eines Verlaufs erfolgreicher oder fehlgeschlagener CronJob-Ausführungen deaktivieren möchten, legen Sie den entsprechenden Wert auf 0 fest. Durch das Deaktivieren der Verlaufsaufbewahrung kann das Debuggen von Fehlern erschwert werden. Das folgende Manifest weist beispielsweise GKE an, nur fehlgeschlagene CronJob-Ausführungen zu speichern:

kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  startingDeadlineSeconds: 100
  successfulJobsHistoryLimit: 0
  failedJobsHistoryLimit: 10
  jobTemplate:
    spec:
    ...

CronJobs prüfen

Verwenden Sie kubectl describe zum Prüfen der CronJob-Konfiguration:

kubectl describe cronjob CRONJOB_NAME

Ersetzen Sie CRONJOB_NAME durch den Namen der zu prüfenden VM.

CronJob-Verlauf ansehen

Ein CronJob wird in einem Pod ausgeführt. Standardmäßig bewahrt Kubernetes die Logs für beendete Pods auf, also die letzten drei erfolgreichen Ausführungen eines CronJobs und den letzten fehlgeschlagenen Job. Sie können diese Standardeinstellungen ändern oder deaktivieren, indem Sie die Limits für den CronJob-Verlauf ändern.

Zum Ansehen des Verlaufs eines CronJobs listen Sie zuerst alle Pods auf. Abgeschlossene CronJobs werden mit dem Status Completed angezeigt und fehlgeschlagene Jobs haben den Status RunContainerError, CrashLoopBackOff oder einen anderen Status, der einen Fehler anzeigt.

NAME                                READY   STATUS              RESTARTS   AGE
hello-1556555640-9bc5r              0/1     Completed           0          3m6s
hello-1556555700-cm6wk              0/1     Completed           0          2m6s
hello-1556555760-62wf5              0/1     Completed           0          66s
hello-1556555820-rl8kl              0/1     Completed           0          5s
hello-failed-1556555820-wrvt2       0/1     RunContainerError   1          5s

Führen Sie den folgenden Befehl aus, um die Logs für einen bestimmten CronJob aufzurufen:

kubectl logs POD_NAME

Ersetzen Sie POD_NAME durch den Namen des Pods, den Sie prüfen möchten.

Die Ausgabe sieht etwa so aus:

container_linux.go:247: starting container process caused
"exec: \"/in/sh\": stat /in/sh: no such file or directory"

CronJobs löschen

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

kubectl delete cronjob CRONJOB_NAME

Wenn Sie einen CronJob löschen, löscht der Kubernetes Garbage Collector die zugehörigen Jobs und verhindert, dass neue Jobs gestartet werden.

Weitere Informationen