Kubernetes

Kubernetes-banen en Cron-banen

Kubernetes-banen en Cron-banen
De meeste applicaties die op een gedistribueerd systeem zoals Kubernetes draaien, zijn altijd live, zoals webservers of databases of API-servers. Maar er is een aparte klasse van objecten die bedoeld zijn om een ​​keer te rennen of om af en toe wakker te worden en hun koers te lopen. Periodieke taken zoals verlenging van TLS-certificaten met agenten zoals Certbot zijn een klassiek voorbeeld van dergelijke taken die op traditionele servers worden uitgevoerd. Deze worden gedaan met behulp van het Cron-hulpprogramma in Unix-systemen.

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/v1
soort: 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.yaml

U 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 pods
NAAM       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-wg6zp

Interessant 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.yaml

U 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/v1beta1
soort: 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,

  1. Minuut (0-59)
  2. Uur (0-23)
  3. Dag van de maand (1-31)
  4. Maand (1-12)
  5. 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 pods
NAAM                     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-hfhzf

Om de cronjob te verwijderen, voert u eenvoudig het volgende uit:

$ kubectl delete -f mijn-cronjob.yaml

Hiermee 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.

Hoe een spel op Linux te ontwikkelen
Tien jaar geleden zouden niet veel Linux-gebruikers voorspellen dat hun favoriete besturingssysteem ooit een populair spelplatform voor commerciële vi...
Open source-poorten van commerciële game-engines
Gratis, open source en platformonafhankelijke game-engine-recreaties kunnen worden gebruikt om zowel oude als enkele van de vrij recente gametitels te...
Beste opdrachtregelspellen voor Linux
De opdrachtregel is niet alleen je grootste bondgenoot bij het gebruik van Linux, hij kan ook de bron van entertainment zijn omdat je hem kunt gebruik...