Kubernetes hat eine analoge Methode, einmalige Prozesse auszuführen Arbeitsplätze und periodische Prozesse wie Zeitgesteuerte Aufgaben.
Wir beginnen mit einem typischen Beispiel dafür, was Jobs sind, und zeigen ein Standardbeispiel aus den offiziellen Docs. Aus diesem Beispiel wird leicht zu verstehen, was es bedeutet, einen Job erfolgreich im Kubernetes-Kontext auszuführen.
Um weiterzumachen, würde ich Ihnen empfehlen, Kataconda Playground für Kubernetes zu verwenden, das einen sofort einsatzbereiten Kubernetes-Cluster bereitstellt, ohne dass Sie einen manuell konfigurieren oder einen Produktionscluster für Experimente riskieren müssen.
Kubernetes-Jobs
Jobs sind Kubernetes-Abstraktionen auf höherer Ebene, ähnlich wie ReplicaSets und Deployments. Aber im Gegensatz zu Pods, die von Deployments und ReplicaSets verwaltet werden, beenden Pods, die einen Job ausführen, ihre Arbeit und werden beendet.
Wenn eine bestimmte Anzahl von Pods abgeschlossen ist, gilt der Job als erfolgreich abgeschlossen. Was sind die Kriterien, die eine erfolgreiche Beendigung eines Pods definieren, werden wir in der YAML-Datei des Jobs definieren. Dann stellt der Job-Controller sicher, dass eine bestimmte Anzahl von Pods erfolgreich beendet wurde und der Job als abgeschlossen gilt.
Lassen Sie uns einen Job erstellen, der Ziffern von pi bis zu 2000 Stellen in seinen Protokollen druckt, die wir untersuchen werden. Erstellen Sie eine Datei und rufen Sie sie auf mein Job.yaml und speichern Sie die folgenden Inhalte darin;
apiVersion: Batch/v1Art: Job
Metadaten:
Name: pi
spezifikation:
Vorlage:
spezifikation:
Behälter:
- Name: pi
Bild: Perle
Befehl: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
Neustart-Richtlinie: Nie
backoffLimit: 4
Erstellen Sie den Job mit dieser Datei:
$ kubectl create -f ./Job.yamlSie werden feststellen, dass die Ausführung des Jobs einige Sekunden bis einige Minuten dauert und sobald er abgeschlossen ist. Wenn Sie versuchen, alle Pods aufzulisten, verwenden Sie Folgendes:
$ kubectl Pods erhaltenNAME BEREIT STATUS NEUSTARTEN ALTER
pi-wg6zp 0/1 Abgeschlossen 0 50 s
Sie werden sehen, dass der Status des pi-bezogenen Pods ist Abgeschlossen nicht ausgeführt oder beendet.Sie können auch den Namen des Pods kopieren, damit wir überprüfen können, ob pi tatsächlich auf 2000 Stellen berechnet wurde. Der spezifische Name des Pods kann in Ihrem Fall abweichen.
$ kubectl logs pi-wg6zpInteressanterweise hat der Pod nicht Beendet es ist immer noch sehr aktiv, nur dass darin keine Anwendungen laufen. Ähnlich wie wenn Sie Ihren Computer einfach einschalten und nicht verwenden. Wenn der Pod beendet worden wäre, hätten wir die Protokolle überhaupt nicht daraus ziehen können.
Führen Sie den folgenden Befehl aus, um den Job und alle erstellten Pods zu bereinigen:
$ kubectl delete -f my-jobs.yamlIn der offiziellen Dokumentation erfahren Sie mehr über die Job-Spezifikationen und wie Sie Ihre Spezifikation schreiben.
Zeitgesteuerte Aufgaben
Cron-Jobs ähneln dem Cron-Dienstprogramm in Unix, das regelmäßig nach einem von uns gewünschten Zeitplan ausgeführt wird. Zum Zeitpunkt des Schreibens dieses Artikels ist es in Kubernetes keine superstabile Sache, daher sollten Sie bei der Verwendung vorsichtig sein. Um die offiziellen Dokumente zu zitieren:
„Ein Cron-Job erstellt ein Job-Objekt Über einmal pro Ausführungszeit seines Zeitplans. Wir sagen „ungefähr“, weil es bestimmte Umstände gibt, in denen möglicherweise zwei oder gar keine Arbeitsplätze geschaffen werden. Wir versuchen, diese selten zu machen, verhindern sie aber nicht vollständig. Daher sollten Arbeitsplätze sein idempotent”
Der Begriff idempotent bedeutet, dass der Cron-Job, ob er ein- oder zweimal oder beliebig oft ausgeführt wird, die gleiche Wirkung auf das System hat. Die Suche nach Updates und die Überwachung dieser Art von Vorgängen kann als idempotent angesehen werden. Aber das Ändern von Daten oder das Schreiben in eine Datenbank gehören nicht dazu.
Lassen Sie uns einen Cron-Job schreiben, der ein "Hello, World" schreiben würde!”-Nachricht in seinen Protokollen zusammen mit einem Zeitstempel, wann diese Nachricht geschrieben wurde. Erstellen Sie eine Datei namens my-cronjob.yaml und schreibe dazu folgenden Inhalt:
apiVersion: batch/v1beta1Art: CronJob
Metadaten:
Name: mein-cronjob
spezifikation:
Anhang 1 * * * *"
JobVorlage:
spezifikation:
Vorlage:
spezifikation:
Behälter:
- Name: hallo
Bild: Busybox
Argumente:
- /bin/sh
- -c
- Datum; echo Hallo vom Kubernetes-Cluster
restartPolicy: OnFailure
Der Zeitplan-Teil des Jobs ist der wichtigste. Es folgt der Standard-Cron-Konvention, es gibt eine Liste von Zahlen, die durch Leerzeichen getrennt sind. Die fünf Zahlen repräsentieren,
- Minute (0-59)
- Stunde (0-23)
- Tag des Monats (1-31)
- Monat (1-12)
- Wochentag (0-6) ab Sonntag
Verwenden von Sternchen (*) für ein Feld bedeutet jeden verfügbaren Wert dieses Felds (wie ein Platzhalter) und der erste Eintrag in unserem Zeitplan „*/1 * * * *“ gab an, dass der Job jede Minute ausgeführt werden muss, unabhängig von Stunde, Tag oder Monat month das Jahr. Bei Verwendung von */5 wird die Nachricht alle 5 Minuten gedruckt.
Weitere Informationen zur cronjob-yaml-Spezifikation finden Sie in den offiziellen Dokumenten learn. Sehen wir uns alle Pods an, die für den Job laufen, den wir my-cronjob genannt haben.
$ kubectl Pods erhaltenNAME BEREIT STATUS NEUSTARTEN ALTER
my-cronjob-1534457100-hfhzf 0/1 Abgeschlossen 0 2 m
my-cronjob-1534457160-gk85l 0/1 Abgeschlossen 0 1m
my-cronjob-1534457220-bj22x 0/1 Abgeschlossen 0 57s
Das Durchsuchen der Protokolle jedes der Pods würde eine einzelne Nachricht mit einem Zeitstempel anzeigen, da sie alle zu unterschiedlichen Zeiten erstellt wurden, haben sie alle unterschiedliche Zeitstempel.
$ kubectl log my-cronjob-1534457100-hfhzfUm den Cronjob zu löschen, führen Sie einfach aus:
$ kubectl delete -f mein-cronjob.yamlDadurch werden auch alle Pods gelöscht, die im Rahmen des ordnungsgemäßen Prozesses erstellt wurden.
Verweise
Sie können hier mehr über Kubernetes-Jobs erfahren und für Cron-Jobs können Sie diesen Abschnitt der gut strukturierten Dokumentation besuchen.