Kubernetes – 3. Job a deployment

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.

Chcete si vytvoriť vlastný Kubernetes (K8s) klaster? Vyskúšajte si ho vo Virtuálnom dátovom centre od Websupportu.

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 metadataname) 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

Hľadáte manažovaný Kubernetes? Využite služby našich skúsených profesionálov na cloud native – radi vám pripravíme riešnie na mieru.

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.

Aktualizované 14. júna 2022

Bol pre vás tento návod nápomocný?

Mohlo by vás tiež zaujímať:

Spýtajte sa nás, radi poradíme
Po - Ne 8:00-22:00
Kontaktovať podporu