Kubernetes – 5. Taints a Tolerations

Vo štvrtej časti sme si ukázali, ako obmedziť nasadenie podov iba na konkrétne nody za pomoci štítkov (labels), ktorými sme označili požadovaný nod. Získali sme tak lepšiu kontrolu nad zaťažovaním jednotlivých nodov. Rovnako sme nastavili aj minimálne a maximálne využitie procesora (CPU) a operačnej pamäte (RAM). Predišli sme tak prípadnému výpadku podov, prípadne celého Kubernetes Clustra.

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

Tento diel bude o obmedzovaní nasadenia podov iba na vybrané nody, podobne ako predošlý. Tu ale namiesto Node Affinity použijeme označenie nodov pomocou Taint. Podom nastavíme tolerovanie označených nodov, aby tak systém Kubernetes mohol rozhodnúť, ktoré pody (ne)nasadí na konkrétne nody.

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 (tu je nepotrebná služba nazvaná nginx-service a nepotrebné nasadenie nginx-deployment):

kubectl delete service nginx-service
kubectl delete deployment nginx-deployment

Obmedzujeme nasadenie podov na konkrétne nody

Označenie nodov pomocou Taint má tieto efekty (effects):

  • NoSchedule – pody, ktoré netolerujú takéto označenia nodu pomocou Taint nie sú naplánované nasadiť sa na takto označený nod, ale už nasadené pody z nodu nie sú odstránené.
  • PreferNoSchedule – systéme Kubernetes vylúči nasadenie podov, ktoré netolerujú takto označené nody.
  • NoExecute – pody, ktoré sú nasadené na takto označenom node a nemajú nastavené tolerovanie takto označeného nodu, sú odstránené. Zároveň sa na takto označený nod neplánuje nasadenie podov, ktoré nemajú nastavené tolerovanie označenia nodu.

Aby sme mohli pridať označenie nodu pomocou Taint, najskôr zistíme, ktoré nody máme k dispozícii:

kubectl get nodes

Skontrolujeme nod worker-1, či je označený pomocou Taint:

kubectl describe node worker-1 | grep Taints

Žiadne označenie pomocou Taint sme nezistili (vypísalo <none>), takto pridáme vlastné:

kubectl taint nodes worker-1 app=frontend:NoSchedule

Overíme, či sa označenie pomocou Taint pridalo:

kubectl describe node worker-1 | grep Taints

Nod worker-1 teraz je označený pomocou Taint app=frontend:NoSchedule, a tak môžeme vytvoriť pod, ktorý najskôr nebude obsahovať tolerovanie označenia nodu a následne iný pod, ktorý naopak bude tolerovať vyššie priradené označenie nodu.

Vytvoríme textový konfiguračný súbor vo formáte YAML s názvom pod-without-toleration.yaml (prvý riadok), do ktorého zapíšeme definíciu nasadenia bez tolerancie označenia nodu (ostatné riadky):

nano ~/pod-without-toleration.yaml
apiVersion: v1
kind: Pod
metadata:
  name: frontend-without-toleration
spec:
  containers:
  - image: nginx
    name: frontend-nginx-without-toleration

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.

Pod nasadíme z vyššie vytvoreného konfiguračného súboru:

kubectl create -f ~/pod-without-toleration.yaml

Zistíme, že pod sa nasadil iba na nod worker-2, pretože ten nie je označený pomocou Taint, a tak akceptuje nasadenie podov aj bez tolerancie. Nod worker-1 je označený pomocou Taint, takže sa naň pod bez tolerancie nenasadil:

kubectl get pods -o wide
kubectl describe pod frontend-without-toleration

Vytvoríme textový konfiguračný súbor vo formáte YAML s názvom pod-with-toleration.yaml (prvý riadok), do ktorého zapíšeme definíciu nasadenia s toleranciou označenia nodu (ostatné riadky):

nano ~/pod-with-toleration.yaml
apiVersion: v1
kind: Pod
metadata:
  name: frontend-with-toleration
spec:
  containers:
  - image: nginx
    name: frontend-nginx-with-toleration
  tolerations:
  - key: app
    value: frontend
    effect: NoSchedule
    operator: Equal

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.

Pod nasadíme z vyššie vytvoreného konfiguračného súboru:

kubectl create -f ~/pod-with-toleration.yaml

Zistíme, že pod sa nasadil iba na nod worker-1, pretože ten je označený pomocou Taint, a tak akceptuje nasadenie podov iba s nastavenou toleranciou. Nod worker-2 nie je označený pomocou Taint, takže sa naň pod s nastavenou toleranciou nenasadil:

kubectl get pods -o wide
kubectl describe pod frontend-with-toleration

Nakoniec nasadené pody vymažeme (prvé dva riadky) a v prípade potreby aj odstránime označenie Taint nodu worker-1 (tretí riadok):

kubectl delete -f ~/pod-without-toleration.yaml
kubectl delete -f ~/pod-with-toleration.yaml
kubectl taint node worker-1 app=frontend:NoSchedule-

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 piatom diele sme predstavili ďalší spôsob obmedzenia nasadenia podov iba na určité nody. Zatiaľčo pomocou sady pravidiel Node Affinity obmedzujeme nasadenie podov označením nodov pomocou štítkov (Labels), v rámci druhej možnosti označujeme nody pomocou Taint. V oboch prípadoch však dosiahneme podobný efekt a je na zvážení, ktorý spôsob pri nasadzovaní konkrétnych podov či celého deploymentu vyhovuje viac.

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