V druhom diele sme ukázali, ako nainštalovať Kubernetes Cluster vo Virtuálnom dátovom centre (VDC), ako spustiť Kubernetes Master Server a ako naň nasadiť sieť podov. Následne sme pripojili uzly k spustenému serveru, na ktoré sme nasadili službu – konkrétne webový server Nginx.
Doteraz sme používali iba predpripravené textové konfiguračné súbory vo formáte YAML. V tomto diele si vytvoríme vlastné jednoduché YAML súbory a postupne vysvetlíme ich obsah.
Mažeme nepotrebné služby a nasadenia
Pred tým, ako budeme pokračovať, vymažeme nepotrebné služby (services) a nasadenia (deployments), aby sme Kubernetes Cluster zbytočne nezaťazovali. Najskôr vypíšeme zoznam spustených služieb (prvý riadok) a aktívnych nasadení (druhý riadok) na VPS master
:
kubectl get services
kubectl get deployments
Potom nepotrebné služby (prvý riadok) a nasadenia (druhý riadok) na VPS master
zmažeme:
kubectl delete service <nazov-nepotrebnej-sluzby>
kubectl delete deployment <nazov-nepotrebneho-nasadenia>
Spúšťame jednoduchú úlohu (job)
Job (úloha) slúži na spustenie jednoduchej úlohy, pričom spustí jeden alebo viacero podov. Vykoná sa konkrétna úloha (napr. príkaz sleep
) a pod sa ukončí. Po vymazaní jobu sa vymažú aj pody, ktoré job spustil.
Overíme, že nie sú nasadené nepotrebné joby (prvý riadok) a/alebo nepotrebné pody (druhý riadok):
kubectl get pods
kubectl get jobs
Ak boli vypísané pody alebo joby, ktoré nie sú potrebné, môžeme ich vymazať, aby nezaberali čas procesora (CPU) alebo miesto v operačnej pamäti (RAM):
kubectl delete pods <nazov-nepotrebneho-podu>
kubectl delete jobs <nazov-nepotrebneho-jobu>
Teraz je všetko pripravené na vytvorenie textového konfiguračného súboru vo formáte YAML (prvý riadok), do ktorého zapíšeme jednoduché nastavenia pre job (ostatné riadky):
nano ~/simple-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: simple-job
spec:
template:
spec:
containers:
- name: job
image: busybox
args:
- /bin/sh
- -c
- date; echo 30-sekundový spánok; sleep 30s; echo Koniec spánku; date
restartPolicy: Never
Vložíme skopírovaný obsah, uložíme pomocou klávesovej skratky Ctrl + X
a následne stlačením klávesu y
a potvrdením klávesom Enter
.
Textový konfiguračný súbor vo formáte YAML (YAML Ain’t Markup Language – YAML nie je značkovací jazyk) obsahuje položky rôznych úrovní. Najvyššiu úroveň majú položky, ktoré sú úplne vľavo (tu napr. apiVersion
alebo kind
) a podradené sú položky, ktoré sú odsadené zľava vždy o 2 medzery (napr. podradená voči položke metadata
je položka name
).
Ak potrebujeme odkázať na podradenú položku (napr. args
), jednotlivé položky od seba oddelíme bodkou:
spec.template.spec.containers.args
Každý konfiguračný súbor objektu v rámci systému Kubernetes začína prvým riadkom, ktorý špecifikuje názov a verziu použitého API (tu apiVersion: batch/v1
). Nasleduje druh objektu (tu kind: Job
), metaúdaje (tu metadata
> name
) a hlavná špecifikácia s uvedením šablóny kontajnera (template.containers
) a jej názvu (name
), obrazu (image
) a argumentov (args
).
Vyššie opísaný job teda spustí pod s názvom simple-job
. Pod bude obsahovať jeden kontajner s názvom job
, pričom kontajner sa vytvorí z obrazu s názvom busybox
. V kontajneri sa spustí sada jednoduchých príkazov (date; echo 30-sekundový spánok; sleep 30s; echo Koniec spánku; date
). No a automatický reštart podu je vypnutý (restartPolicy: Never
).
Takto nasadíme job z vyššie vytvoreného konfiguračného súboru:
kubectl create -f ~/simple-job.yaml
Job aj pod boli naozaj vytvorené, pričom po uplynutí 30 sekúnd sa stav podu (stĺpec STATUS) zmení na Completed a v stĺpci COMPLETIONS jobu bude uvedené 1/1:
kubectl get pods
kubectl get jobs
Job sa síce ukončil (Completed), ale stále je spustený, takže ho teraz vymažeme podobne, ako sme ho spustili, ibaže namiesto možnosti create
použijeme delete
(prvý riadok). Následne overíme, či job a pod naozaj boli vymazané (druhý a tretí riadok):
kubectl delete -f ~/simple-job.yaml
kubectl get pods
kubectl get jobs
Ak potrebujeme, aby sa job ukončil po konkrétnom čase, doplníme do YAML súboru (prvý riadok) špecifikáciu spec.activeDeadlineSeconds
takto (ostatné riadky):
nano ~/simple-job-time-limit.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: simple-job-time-limit
spec:
activeDeadlineSeconds: 20
template:
spec:
containers:
- name: job-time-limit
image: busybox
args:
- /bin/sh
- -c
- date; echo 30-sekundový spánok; sleep 30s; echo Koniec spánku; date
restartPolicy: Never
Vložíme skopírovaný obsah, uložíme pomocou klávesovej skratky Ctrl + X
a následne stlačením klávesu y
a potvrdením klávesom Enter
.
Nasadíme job z vyššie vytvoreného konfiguračného súboru (prvý riadok) a skontrolujeme, či sa job a pod naozaj vytvorili (druhý a tretí riadok):
kubectl create -f ~/simple-job-time-limit.yaml
kubectl get pods
kubectl get jobs
Síce sme zadali 30-sekundový spánok, ale ten sa nestihol zrealizovať, pretože sme určili časový limit na 20 sekúnd, a tak sa po 20 sekundách job ukončil predčasne. Zistíme to na konci rozšíreného výpisu jobu:
kubectl get job simple-job-time-limit -o yaml
Následne job vymažeme:
kubectl delete -f ~/simple-job-time-limit.yaml
Spúšťame nasadenie (deployment)
Nasadenie (deployment) vytvorí viacero rovnakých podov. Nasadenie teda spúšťa viacero kópií rovnakej aplikácie a v prípade pádu jednej kópie ju automaticky nahradí. Takto zabezpečíme neustálu funkčnosť jednej alebo viacerých kópií aplikácie.
Vytvoríme textový konfiguračný súbor vo formáte YAML (prvý riadok), do ktorého zapíšeme jednoduché nastavenia pre nasadenie (ostatné riadky):
nano ~/deployment-httpd-frontend.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: httpd-frontend
name: httpd-frontend
spec:
replicas: 3
selector:
matchLabels:
app: httpd-frontend
template:
metadata:
labels:
app: httpd-frontend
spec:
containers:
- image: httpd:2.4-alpine
name: httpd
Vložíme skopírovaný obsah, uložíme pomocou klávesovej skratky Ctrl + X
a následne stlačením klávesu y
a potvrdením klávesom Enter
.
Po spustení nasadenia z vyššie uvedeného YAML súboru sa vytvorí nasadenie s názvom (metadata.name
) a označením (metadata.labels
) httpd-frontend
. Nasadenie spustí 3 pody (spec.replicas
), pričom každý pod bude označený štítkom (label) httpd-frontend
(spec.template.metadata.labels
) a bude obsahovať kontajner s operačným systémom Alpine Linux vo verzii 2.4 so spusteným http serverom (spec.template.spec.containers.image
). No a spec.selector.matchLabels
určuje, že nasadenie bude s podmi komunikovať cez štítok (label) httpd-frontend
.
Spustíme nasadenie z vyššie vytvoreného konfiguračného súboru (prvý riadok) a skontrolujeme, či sa nasadenie naozaj vytvorilo (druhý riadok):
kubectl create -f ~/deployment-httpd-frontend.yaml
kubectl get deployments | grep httpd-frontend
Nasadenie (deployment) vytvorilo ovládač (controller) replicaset
(súbor kópií) pod označením httpd-frontend
, ktorý neustále kontroluje, či je spustený požadovaný počet podov. Zabezpečuje tak neustálu funkčnosť všetkých kópií nasadenej aplikácie. Takto overíme, či je náš ovládač replicaset
spustený:
kubectl get replicasets | grep httpd-frontend
Tiež overíme, či je spustený požadovaný počet podov:
kubectl get pods | grep httpd-frontend
Ovládač aj pody sú spustené. Teraz môžeme overiť, či sa v prípade vymazania jedného podu automaticky vytvorí náhradný. Vymažeme teda jeden zo spustených podov (prvý riadok) a následne skontrolujeme, či sa vytvoril náhradný pod (druhý riadok) namiesto vymazaného:
kubectl delete pod httpd-frontend-5ddf995bdf-q7cgk
kubectl get pods | grep httpd-frontend
Zistili sme, že vymazaný pod neexistuje a vytvoril sa nový pod, ktorý nahradil ten vymazaný. Orchestrácia podov teda funguje správne.
Vymazať ale môžeme aj celý replicaset
(čiže všetky pody) a nasadenie (deployment) vytvorí nový. Zistíme názov replicasetu (prvý riadok), vymažeme ho (druhý riadok) a skontrolujeme, či sa vytvoril nový (tretí riadok):
kubectl get replicasets | grep httpd-frontend
kubectl delete replicaset httpd-frontend-5ddf995bdf
kubectl get replicasets | grep httpd-frontend
Zistili sme, že replicaset bol vymazaný a vytvoril sa nový replicaset (s novým podmi), ktorý nahradil ten vymazaný. Manažment podov teda funguje správne.
Podrobné informácie o všetkých podoch, ktoré spustilo nasadenie (deployment), zistíme pomocou štítku httpd-frontend
:
kubectl describe pod httpd-frontend
Po vymazaní celého nasadenia (deployment) sa už pody nespustia a všetky kópie aplikácie sa teda ukončia:
kubectl delete deployment httpd-frontend
Zhrnutie
V treťom diele sme spustili jednoduchú úlohu (job) s jednym podom bez časového obmedzenia, a tiež s časovým obmedzením. Viacero podov sme spustili pomocou nasadenia (deployment) a overili sme jednu zo základných funkcií systému Kubernetes: rýchle spustenie podov, ktoré nahradia vypadnuté pody.