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