Kubernetes heeft een analoge manier om eenmalige processen uit te voeren Banen en periodieke processen zoals cron-jobs.
We beginnen met een typisch voorbeeld van wat banen zijn en demonstreren een standaardvoorbeeld uit de officiële documenten. Uit dit voorbeeld zal het gemakkelijk zijn om te begrijpen wat het betekent door een taak met succes uit te voeren in de context van Kubernetes.
Om dit te volgen, raad ik u aan Kataconda Playground voor Kubernetes te gebruiken, dat een kant-en-klaar Kubernetes-cluster zal bieden zonder dat u er een handmatig hoeft te configureren of een productiecluster voor experimenten riskeert.
Vacatures bij Kubernetes
Taken zijn Kubernetes-abstracties op een hoger niveau, vergelijkbaar met ReplicaSets en Deployments. Maar in tegenstelling tot pods die worden beheerd door implementaties en ReplicaSets, voltooien pods die een taak uitvoeren hun werk en sluiten af.
Wanneer een gespecificeerd aantal pods is voltooid, wordt de taak met succes voltooid. Wat zijn de criteria die een succesvolle beëindiging van een pod definiëren, zullen we definiëren in het YAML-bestand van Job. Vervolgens zorgt de Jobcontroller ervoor dat een bepaald aantal pods met succes is beëindigd en dat de Job is voltooid.
Laten we een taak maken die cijfers van pi tot 2000 plaatsen in zijn logboeken afdrukt, die we zullen onderzoeken. Maak een bestand en noem het mijn werk.yaml en sla de volgende inhoud erin op;
apiVersion: batch/v1soort: baan
metagegevens:
naam: pi
specificaties:
sjabloon:
specificaties:
containers:
- naam: pi
afbeelding: perl
commando: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
herstartbeleid: Nooit
backoffLimiet: 4
Maak de taak aan met behulp van dit bestand:
$ kubectl create -f ./ baan.yamlU zult merken dat het een paar seconden tot een paar minuten duurt om de taak uit te voeren en als het eenmaal klaar is. Wanneer u probeert alle pods op te sommen met:
$ kubectl krijg podsNAAM GEREED STATUS HERSTART LEEFTIJD
pi-wg6zp 0/1 Voltooid 0 50s
U zult zien dat de Status van de pi-gerelateerde pod is: Voltooid niet actief of beëindigd.Je kunt ook de naam van de pod kopiëren, zodat we kunnen verifiëren dat pi inderdaad is berekend tot 2000 cijfers. De specifieke naam van de pod kan in uw geval verschillen.
$ kubectl logt pi-wg6zpInteressant genoeg heeft de pod dat niet Beëindigd het is nog steeds erg actief, alleen dat er geen applicaties in draaien. Vergelijkbaar met gewoon je computer aanzetten en niet gebruiken. Als de pod was beëindigd, hadden we in de eerste plaats de logboeken er niet uit kunnen trekken.
Voer de opdracht uit om de taak en alle gemaakte pods op te schonen:
$ kubectl delete -f mijn-jobs.yamlU kunt meer leren over de taakspecificaties en hoe u uw specificatie kunt schrijven in de officiële documentatie.
Cron-banen
Cron Jobs zijn vergelijkbaar met het Cron-hulpprogramma in Unix dat periodiek wordt uitgevoerd volgens een schema dat we wensen. Het is niet superstabiel in Kubernetes, op het moment van schrijven, dus misschien wil je voorzichtig zijn met het gebruik. Om de officiële documenten te citeren:
“Een cron-job creëert een job-object over eenmaal per uitvoeringstijd van zijn schema. We zeggen "over" omdat er bepaalde omstandigheden zijn waarin twee banen kunnen worden gecreëerd, of geen baan kan worden gecreëerd. We proberen deze zeldzaam te maken, maar voorkomen ze niet volledig. Daarom moeten banen idempotent”
De term idempotent betekent dat de Cron Job, of deze nu een of twee keer of een willekeurig aantal keren wordt uitgevoerd, hetzelfde effect op het systeem zou hebben. Controleren op updates, toezicht houden op dat soort bewerkingen kan als idempotent worden beschouwd. Maar het wijzigen van gegevens of het schrijven naar een database hoort daar niet bij.
Laten we een cron-job schrijven die een "Hallo, wereld" zou schrijven!” bericht in de logboeken samen met een tijdstempel van wanneer dat bericht is geschreven. Maak een bestand met de naam my-cronjob.yaml en schrijf er de volgende inhoud op:
apiVersion: batch/v1beta1soort: CronJob
metagegevens:
naam: mijn-cronjob
specificaties:
planning 1 * * * *"
jobSjabloon:
specificaties:
sjabloon:
specificaties:
containers:
- naam: hallo
afbeelding: busybox
argumenten:
- /bin/sh
- -c
- datum; echo Hallo van het Kubernetes-cluster
restartPolicy: OnFailure
Het roostergedeelte van de baan is het meest cruciale crucial. Het volgt de standaard Cron-conventie, er is een lijst met getallen gescheiden door spaties. De vijf cijfers vertegenwoordigen,
- Minuut (0-59)
- Uur (0-23)
- Dag van de maand (1-31)
- Maand (1-12)
- Dag van de week (0-6) vanaf zondag
Sterretje gebruiken (*) voor een veld betekent elke beschikbare waarde van dat veld (zoals een jokerteken) en de eerste invoer in ons schema "*/1 * * * *" gaf aan dat de taak elke minuut moet worden uitgevoerd, ongeacht het uur, de dag of de maand van het jaar. Als u */5 gebruikt, wordt het bericht elke 5 minuten afgedrukt.
U kunt meer leren over de cronjob yaml-specificatie in de officiële documenten. Laten we eens kijken naar alle pods die voor de taak werken, die we my-cronjob hebben genoemd.
$ kubectl krijg podsNAAM GEREED STATUS HERSTART LEEFTIJD
my-cronjob-1534457100-hfhzf 0/1 Voltooid 0 2m
my-cronjob-1534457160-gk85l 0/1 Voltooid 0 1m
my-cronjob-1534457220-bj22x 0/1 Voltooid 0 57s
Als je in de logs van elk van de pods graaft, krijg je een enkel bericht met een tijdstempel te zien, aangezien ze allemaal op verschillende tijdstippen zijn gemaakt, ze hebben allemaal verschillende tijdstempels.
$ kubectl log mijn-cronjob-1534457100-hfhzfOm de cronjob te verwijderen, voert u eenvoudig het volgende uit:
$ kubectl delete -f mijn-cronjob.yamlHiermee worden ook alle pods verwijderd die tijdens het juiste proces zijn gemaakt.
Referenties
U kunt hier meer leren over Kubernetes Jobs en voor Cron-taken kunt u dit gedeelte van hun goed gestructureerde documentatie bezoeken.