Kubernetes má analogický způsob spouštění jednorázových procesů Pracovní místa a periodické procesy jako úlohy cron.
Začneme typickým příkladem toho, co jsou Jobs, a ukážeme standardní příklad z oficiálních dokumentů. Z tohoto příkladu bude snadné pochopit, co to znamená úspěšným spuštěním úlohy v kontextu Kubernetes.
Chcete-li pokračovat, doporučil bych vám použít hřiště Kataconda pro Kubernetes, které poskytne klastr Kubernetes mimo krabici, aniž byste museli ručně konfigurovat jeden nebo riskovat produkční cluster pro experimenty.
Kubernetes Jobs
Úlohy jsou vyšší úrovně Kubernetes abstrakce, podobné ReplicaSets a Deployments. Ale na rozdíl od lusků spravovaných nasazením a ReplicaSets, lusky provádějící úlohu dokončují svou práci a opouštějí se.
Když zadaný počet lusků dosáhne dokončení, říká se, že úloha byla úspěšně dokončena. Jaká jsou kritéria, která definují úspěšné ukončení modulu, definujeme v souboru YAML Job. Řadič úlohy pak zajistí, že určitý počet lusků byl úspěšně ukončen a úloha je považována za úplnou.
Vytvořme úlohu, která vytiskne číslice pí až 2 000 míst ve svých protokolech, které prozkoumáme. Vytvořte soubor a zavolejte jej moje práce.yaml a uložte do něj následující obsah;
apiVersion: batch / v1druh: Job
metadata:
jméno: pi
spec:
šablona:
spec:
kontejnery:
- jméno: pi
obrázek: perl
příkaz: ["perl", "-Mbignum = bpi", "-wle", "tisknout bpi (2000)"]
restartPolicy: Nikdy
backoffLimit: 4
Vytvořte úlohu pomocí tohoto souboru:
$ kubectl create -f ./práce.yamlVšimnete si, že spuštění úlohy trvá několik sekund až pár minut a jakmile je hotovo. Když se pokusíte vypsat všechny pody pomocí:
$ kubectl získat luskySTAV JMÉNA PŘIPRAVENO VĚC RESTARTŮ
pi-wg6zp 0/1 Dokončeno 0 50 s
Uvidíte, že Stav pod související s pí je Dokončeno neběží ani není ukončeno.Můžete také zkopírovat název podu, abychom mohli ověřit, že pí bylo skutečně vypočteno na 2 000 číslic. Konkrétní název podložky se může ve vašem případě lišit.
$ kubectl protokoly pi-wg6zpJe zajímavé, že lusk ne Ukončeno je stále velmi aktivní, jen v něm nejsou spuštěny žádné aplikace. Podobně jako pouhé zapnutí počítače a nepoužívání. Pokud by byl modul ukončen, vůbec bychom z něj nemohli vytáhnout protokoly.
Chcete-li vyčistit úlohu a všechny pody, které byly vytvořeny, spusťte příkaz:
$ kubectl delete -f my-jobs.yamlDalší informace o specifikacích úlohy a o tom, jak napsat svou specifikaci, najdete v oficiální dokumentaci.
Cron Jobs
Cron Jobs jsou podobné nástroji Cron v Unixu, který běží pravidelně podle plánu, který si přejeme. V době psaní tohoto článku to není v Kubernetes superstabilní věc, takže možná budete chtít být opatrní při používání. Citovat oficiální dokumenty:
"Úloha cron vytvoří objekt úlohy." o jednou za čas provedení svého plánu. Říkáme „o“, protože za určitých okolností mohou být vytvořeny dvě pracovní místa nebo nemusí být vytvořena žádná. Pokoušíme se je učinit vzácnými, ale nezabraňujeme jim úplně. Pracovní místa by proto měla být idempotentní“
Termín idempotent znamená, že Cron Job, ať už provedený jednou nebo dvakrát nebo libovolně často, bude mít stejný účinek na systém. Při kontrole aktualizací lze monitorování těchto druhů operací považovat za idempotentní. Ale úprava dat nebo zápis do databáze mezi ně nepatří.
Pojďme napsat cron úlohu, která by napsala „Hello, World!„Zpráva ve svých protokolech spolu s časovým razítkem, kdy byla tato zpráva napsána. Vytvořte soubor s názvem my-cronjob.yaml a do něj napsat následující obsah:
apiVersion: batch / v1beta1druh: CronJob
metadata:
jméno: my-cronjob
specifikace:
plán: "* / 1 * * * *"
šablona úlohy:
spec:
šablona:
spec:
kontejnery:
- jméno: ahoj
obrázek: busybox
args:
- / bin / sh
- -C
- datum; echo Dobrý den z klastru Kubernetes
restartPolicy: OnFailure
Nejdůležitější je naplánovaná část práce. Řídí se standardní Cronovou konvencí, existuje seznam čísel oddělených mezerami. Těchto pět čísel představuje,
- Minuta (0-59)
- Hodina (0-23)
- Den v měsíci (1-31)
- Měsíc (1-12)
- Den v týdnu (0-6) počínaje nedělí
Pomocí hvězdičky (*) pro pole znamená jakoukoli dostupnou hodnotu tohoto pole (jako zástupný znak) a první položka v našem plánu „* / 1 * * * *“ naznačila, že úloha musí být spuštěna každou minutu bez ohledu na hodinu, den nebo měsíc rok. Pomocí * / 5 se zpráva vytiskne každých 5 minut.
Další informace o specifikaci cronjob yaml se můžete dozvědět v oficiálních dokumentech. Podívejme se na všechny lusky běžící pro úlohu, kterou jsme pojmenovali my-cronjob.
$ kubectl získat luskySTAV JMÉNA PŘIPRAVENO VĚC RESTARTUJE
my-cronjob-1534457100-hfhzf 0/1 Dokončeno 0 2 m
my-cronjob-1534457160-gk85l 0/1 Dokončeno 0 1 m
my-cronjob-1534457220-bj22x 0/1 Dokončeno 0 57 s
Kopání do protokolů každého z podů by odhalilo jednu zprávu s časovým razítkem, protože všechny byly vytvořeny v různých časech, všechny budou mít různá časová razítka.
$ kubectl log my-cronjob-1534457100-hfhzfChcete-li odstranit cronjob, jednoduše spusťte:
$ kubectl delete -f my-cronjob.yamlTím také odstraníte všechny pody, které byly vytvořeny v rámci procesu.
Reference
Více o Kubernetes Jobs se můžete dozvědět zde a pro úlohy Cron můžete navštívit tuto sekci jejich dobře strukturované dokumentace.