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:
- Wann der CronJob ausgeführt wird
- Funktionsweise des CronJobs
- Frist für den Start des CronJobs
- Ob gleichzeitige Jobs für den CronJob zulässig sind
- Ob neue Jobs angehalten werden
- Wie viele Ausführungen der CronJob im Verlauf speichert
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:
- Minuten (zwischen 0 und 59)
- Stunden (zwischen 0 und 23)
- Tag des Monats (zwischen 1 und 31)
- Monat (zwischen 1 und 12)
- 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) auf0/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.