Ku­ber­netes überwacht aktiv die Aus­füh­rung von CronJobs und führt bei auf­tre­ten­den Fehlern be­nut­zer­de­fi­nier­te Aktionen aus. Die Kon­fi­gu­ra­ti­on von Ku­ber­netes CronJobs erfolgt un­kom­pli­ziert über YAML-Dateien.

Was ist ein CronJob?

Ein CronJob ist eine Methode zur Au­to­ma­ti­sie­rung von Aufgaben. Es ist wie ein Wecker, der zu einer be­stimm­ten Uhrzeit klingelt. Ähnlich dazu können Sie einen CronJob so kon­fi­gu­rie­ren, dass er fest­ge­leg­te Aufgaben zu vor­de­fi­nier­ten Zeiten au­to­ma­tisch ausführt. Ein CronJob kann ver­schie­de­ne Arten von Aufgaben au­to­ma­ti­sie­ren, wie bei­spiels­wei­se das Ak­tua­li­sie­ren von Da­ten­ban­ken, das Sichern von Dateien, das Ausführen von Skripten oder das Versenden von E-Mails in re­gel­mä­ßi­gen In­ter­val­len. Durch die In­te­gra­ti­on von CronJobs in Ku­ber­netes können Aufgaben überwacht und in Con­tai­nern isoliert gesteuert werden.

Tipp

Managed Ku­ber­netes von IONOS bietet Ihnen eine hoch per­for­man­te In­fra­struk­tur, in der Sie Worker Nodes nach Ihren in­di­vi­du­el­len An­for­de­run­gen kon­fi­gu­rie­ren können. Die um­fas­sen­de IONOS Cloud Ma­nage­ment-Lösung sorgt für einen rei­bungs­lo­sen Betrieb Ihres Ku­ber­netes-Clusters.

Ku­ber­netes: CronJob ein­rich­ten

Die Er­stel­lung eines CronJobs ähnelt stark der eines regulären Jobs in Ku­ber­netes. Sie müssen dazu eine YAML-Ma­ni­fest­da­tei anlegen. Hierbei handelt es sich um eine struk­tu­rier­te Be­schrei­bung, die alle re­le­van­ten Details für den CronJob enthält. In dieser Datei werden wichtige Parameter fest­ge­legt, bei­spiels­wei­se der Zeitplan für die Aus­füh­rung des Jobs, die Container sowie die genauen Befehle, die in diesen Con­tai­nern aus­ge­führt werden sollen.

YAML-Datei erstellen

Öffnen Sie einen Text­edi­tor Ihrer Wahl, um die YAML-Kon­fi­gu­ra­ti­ons­da­tei für den CronJob zu erstellen. Achten Sie darauf, den Zeitplan des CronJobs im Cron-Format zu de­fi­nie­ren. Fügen Sie die Job-De­fi­ni­ti­on hinzu, ein­schließ­lich der aus­zu­füh­ren­den Aufgabe. Speichern Sie dann die Datei mit der Endung .yaml.

apiVersion: batch/v1
kind: CronJob
metadata:
    name: new_cronjob
spec:
    schedule: "0     ****    "
    jobTemplate:
        spec:
            template:
                spec:
                    containers:
                    - name: container
                        image: image:latest
                        command: 
                     - /bin/sh
yaml

Fügen Sie der Pod-Spe­zi­fi­ka­ti­on Res­sour­cen­an­for­de­run­gen und andere Ein­stel­lun­gen hinzu, falls er­for­der­lich:

spec:
    containers:
    - name: container
        resources:
            requests:
                memory: "64Mi"
                cpu: "250m"
            limits:
                memory: "128Mi"
                cpu: "500m"
yaml

CronJob ak­ti­vie­ren

Geben Sie folgenden Befehl in ein Terminal ein, um den CronJob im Ku­ber­netes-Cluster zu erstellen:

kubectl apply -f [filename].yaml
shell

CronJob über­wa­chen

Wenn Sie folgendes Kommando ausführen, erhalten Sie eine Liste der vor­han­de­nen Ku­ber­netes CronJobs und der Watch-Modus sorgt dafür, dass die Ausgabe au­to­ma­tisch ak­tua­li­siert wird, wenn sich der Status von CronJobs ändert.

kubectl get cronjob --watch
shell

CronJob Schedule-Syntax

Die Schedule-Syntax für Ku­ber­netes CronJobs basiert auf dem klas­si­schen Cron-Format mit fünf Feldern in folgender Rei­hen­fol­ge: Minute, Stunde, Tag des Monats, Monat und Tag der Woche. Hier ein kurzer Überblick:

  • Minute (0–59)
  • Stunde (0–23)
  • Tag des Monats (1–31)
  • Monat (1–12 oder Jan–Dec)
  • Tag der Woche (0–7 oder Sun–Sat)

Spezielle Zeichen:

  • *: Jeder gültige Wert für das Feld
  • ,: Angabe von mehreren Werten
  • /: Angabe von Schritten

Beispiele:

0 ****: Jede Stunde 15 2 ***: Täglich um 2:15 Uhr 0 0 1 **: Am ersten Tag jedes Monats um Mit­ter­nacht 0 0 *3*: Täglich um Mit­ter­nacht im März 0 2 ** 1: Jeden Montag um 2 Uhr morgens

CronJob Con­cur­ren­cy Policy

Die Con­cur­ren­cy Policy kann in der Kon­fi­gu­ra­ti­on eines CronJobs spe­zi­fi­ziert werden und hat Aus­wir­kun­gen darauf, wie parallele Jobs innerhalb desselben Ku­ber­netes CronJobs behandelt werden.

  • Allow (Standard): Wenn die Con­cur­ren­cy Policy auf __Allow__ gesetzt ist, wird ein neuer Job gestartet, auch wenn der vorherige Job noch nicht ab­ge­schlos­sen ist. Das bedeutet, dass mehrere Instanzen desselben Jobs gleich­zei­tig laufen können.
  • Forbid: Bei dieser Ein­stel­lung wird ein neuer Job nicht gestartet, wenn ein vor­he­ri­ger Job noch nicht ab­ge­schlos­sen ist. Dies stellt sicher, dass zu einem be­stimm­ten Zeitpunkt nur eine Instanz des Jobs aus­ge­führt wird.
  • Replace: Nicht ab­ge­schlos­se­ne Jobs werden ab­ge­bro­chen, damit neue Jobs fort­fah­ren können. Es dürfen keine Instanzen desselben Jobs gleich­zei­tig laufen.

Frist für die Aus­füh­rung festlegen

Das Feld startingDeadlineSeconds in einem Ku­ber­netes CronJob gibt an, wie viele Sekunden nach der geplanten Aus­füh­rungs­zeit ein Job maximal gestartet werden darf. Wenn der Job nicht innerhalb dieser Zeit­gren­ze läuft, wird er als fehl­ge­schla­gen be­trach­tet.

apiVersion: batch/v1
kind: CronJob
metadata:
    name: new_cronjob
spec:
    schedule: "0     ****    "
    startingDeadlineSeconds: 300 
    jobTemplate:
        spec:
            template:
                spec:
                    containers:
                    - name: container
                        image: image:latest
                        command:
                     - /bin/sh
yaml

In diesem Beispiel muss der Job, der durch den CronJob definiert ist, innerhalb von 300 Sekunden (5 Minuten) nach dem geplanten Zeitpunkt gestartet werden, sonst gilt er als fehl­ge­schla­gen.

Job-Historie begrenzen

In Ku­ber­netes CronJobs bieten die Ein­stel­lun­gen spec.successfulJobsHistoryLimit und spec.failedJobsHistoryLimit die Mög­lich­keit, die Anzahl der im Verlauf des CronJobs auf­be­wahr­ten Jobs zu begrenzen. spec.successfulJobsHistoryLimit ist ein op­tio­na­les Feld, das angibt, wie viele er­folg­reich ab­ge­schlos­se­ne Jobs im Verlauf ge­spei­chert werden sollen. Das ist hilfreich, um die Res­sour­cen­nut­zung zu steuern und si­cher­zu­stel­len, dass der Verlauf nicht mit einer über­mä­ßi­gen Anzahl von er­folg­reich beendeten Jobs überfüllt wird. Analog dazu er­mög­licht spec.failedJobsHistoryLimit die Kontrolle über die Anzahl der fehl­ge­schla­ge­nen Jobs.

apiVersion: batch/v1beta1
kind: CronJob
metadata:
    name: new_cronjob
spec:
    schedule: "0     ****    "
    successfulJobsHistoryLimit: 3    # Keep only the last 3 successfully completed jobs in history.
    failedJobsHistoryLimit: 1                    # Keep only the last failed job in history.
    jobTemplate:
        spec:
            template:
                spec:
                    containers:
                    - name: container
                        image: image:latest
                        command:
                     - /bin/sh
yaml

Hier geben wir an, nur die letzten drei er­folg­reich ab­ge­schlos­se­nen Jobs und den letzten fehl­ge­schla­ge­nen Job im Verlauf des Ku­ber­netes CronJobs new_cronjob auf­zu­be­wah­ren.

Ku­ber­netes Cronjob Errors und Trou­ble­shoo­ting

In Ku­ber­netes CronJobs können ver­schie­de­ne Fehler auftreten, daher sollten Sie effektive Trou­ble­shoo­ting-Techniken kennen. Hier sind einige häufige Feh­ler­quel­len und Vor­ge­hens­wei­sen zur Behebung:

Job startet nicht

Wenn ein CronJob in Ku­ber­netes nicht gestartet wird, kann dies ver­schie­de­ne Ursachen haben. Möglich sind ein nicht ver­füg­ba­res oder feh­ler­haf­tes Container-Image sowie fehlende Be­rech­ti­gun­gen für den Service-Account des Pods. Um das Problem zu dia­gnos­ti­zie­ren, un­ter­su­chen Sie die Container-Logs mit kubectl logs <pod-name>, die Er­eig­nis­se des CronJobs mit kubectl describe cronjob <cronjob-name>, und die Er­eig­nis­se des Pods mit kubectl describe pod <pod-name>. Stellen Sie sicher, dass der Service-Account die not­wen­di­gen Be­rech­ti­gun­gen hat, indem Sie die Rolle und Rol­len­bin­dung über­prü­fen.

Feh­ler­haf­te CronJob-Kon­fi­gu­ra­ti­on

Eine feh­ler­haf­te CronJob-Kon­fi­gu­ra­ti­on kann an Syn­tax­feh­lern in der YAML-Datei oder un­gül­ti­gen Ein­stel­lun­gen für Schedule und Re­start­Po­li­cy liegen. Um solche Probleme zu iden­ti­fi­zie­ren, kon­trol­lie­ren Sie die YAML-Datei auf korrekte Syntax und Ein­stel­lun­gen. Mit kubectl describe cronjob <cronjob-name> können Sie de­tail­lier­te In­for­ma­tio­nen über die Kon­fi­gu­ra­ti­on erhalten und even­tu­el­le Fehler oder Un­stim­mig­kei­ten erkennen.

Res­sour­cen­li­mits über­schrit­ten

Das Über­schrei­ten von Res­sour­cen­li­mits kann dazu führen, dass CronJobs nicht ord­nungs­ge­mäß aus­ge­führt werden. Um das Problem zu beheben, über­prü­fen Sie die Res­sour­cen­li­mits im CronJob und den zu­ge­hö­ri­gen Pods mit kubectl describe cronjob <cronjob-name> und kubectl describe pod <pod-name>. Zudem kann die Über­wa­chung der Cluster-Res­sour­cen­nut­zung mit kubectl top nodes und kubectl top pods wertvolle Einblicke liefern. Passen Sie ge­ge­be­nen­falls die Res­sour­cen­li­mits in der YAML-Datei an.

Als Einstieg in das Cluster-Ma­nage­ment in Ku­ber­netes empfehlen wir Ihnen das Ku­ber­netes-Tutorial aus unserem Digital Guide.

Managed Ku­ber­netes
Ku­ber­netes als Managed Service von IONOS Cloud

Die ideale Plattform für per­for­man­te und hoch­ska­lier­ba­re Container-An­wen­dun­gen. Umfassend ins IONOS Cloud Ökosystem in­te­griert und rund um die Uhr pro­fes­sio­nell betreut.

Zum Hauptmenü