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.
V tomto diele si ukážeme, ako systém Kubernetes zdiela údaje medzi kontajnermi jedného podu (emptyDir), a tiež ako ukladá údaje, o ktoré nechceme prísť, keď sa pod ukončí (hostPath).
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
Nasadzujeme pod s úložiskom
Systém Kubernetes pracuje s viacerými mechanizmami, vďaka ktorým dokáže vytvoriť a použiť úložisko (storage) mimo samotného podu. V tomto návode predstavíme dva z nich:
- emptyDir – tento mechanizmus vytvorí priečinok až keď sa pod nasadí na nod a existuje iba dovtedy, pokiaľ existuje aj pod. Ide teda o dočasné interné úložisko, keďže spolu s vymazaním podu sa vymaže aj takto vytvorené úložisko.
- hostPath – tento mechanizmus pripojí súbor alebo priečinok k systému súborov podu, pričom takto vytvorené externé úložisko sa zachová aj po ukončení podu na systéme súborov nodu.
Mechanizmus emptyDir
Mechanizmus na pripojenie interného úložiska emptyDir vytvorí úložisko iba vo vnútri kontajnera. Spolu s odstránením podu sa vymaže aj úložisko vytvorené mechanizmom emptyDir. Všetky kontajneri nasadené na rovnakom pode zdieľajú úložisko vytvorené mechanizmom emptyDir, a to aj v iných priečinkoch. Toto úložisko zostáva zachované aj po páde kontajnera.
Vytvoríme súbor s názvom pod-volume-emptydir.yaml
(prvý riadok), do ktorého zapíšeme definíciu nasadenia podu (ostatné riadky):
nano ~/pod-volume-emptydir.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-volume-emptydir
spec:
containers:
- image: nginx
name: container-volume-emptydir
volumeMounts:
- mountPath: /opt/container-emptydir
name: volume-emptydir
volumes:
- name: volume-emptydir
emptyDir: {}
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-volume-emptydir.yaml
Zistíme, že vyššie spustený pod s názvom pod-volume-emptydir
sa nasadil na nod worker-1
(prvý riadok) a že pripojenie externého úložiska prebehlo správne (druhý riadok):
kubectl get pods -o wide
kubectl describe pod pod-volume-emptydir
Z nodu master
sa prihlásime do kontajnera podu s názvom pod-volume-emptydir
, ktorý bol nasadený na nod worker-1
, aby sme overili, že priečinok /opt/container-emptydir
existuje:
kubectl exec -it pod-volume-emptydir -- /bin/bash
ls /opt
Vymažeme vyššie špecifikované nasadenie podu a s ním aj úložisko vytvorené mechanizmom emptyDir:
kubectl delete -f ~/pod-volume-emptydir.yaml
Mechanizmus hostPath
Mechanizmus na pripojenie externého úložiska hostPath si nastavíme v textovom konfiguračnom súbore vo formáte YAML. Vytvoríme súbor s názvom pod-volume-hostpath.yaml
(prvý riadok), do ktorého zapíšeme definíciu nasadenia podu (ostatné riadky):
nano ~/pod-volume-hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-volume-hostpath
spec:
containers:
- image: nginx
name: container-volume-hostpath
volumeMounts:
- mountPath: /opt/container-dir
name: volume-hostpath
volumes:
- name: volume-hostpath
hostPath:
path: /host-dir
type: DirectoryOrCreate
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
.
V časti spec.containers.volumeMounts.mountPath
určujeme cestu k priečinku, ktorý sa má použiť v kontajneri podu. V časti spec.volumes.hostPath.path
zase špecifikujeme cestu k priečinku, ktorý existuje na worker nodoch (tu worker-1
a/alebo worker-2
). Vďaka DirectoryOrCreate
sa neexistujúce priečinky automaticky vytvoria.
Pod nasadíme z vyššie vytvoreného konfiguračného súboru:
kubectl create -f ~/pod-volume-hostpath.yaml
Zistíme, že vyššie spustený pod s názvom pod-volume-hostpath
sa nasadil na nod worker-1
(prvý riadok) a že pripojenie externého úložiska prebehlo správne (druhý riadok):
kubectl get pods -o wide
kubectl describe pod pod-volume-hostpath
Prihlásime sa cez SSH na nod worker-1
(prvý riadok), aby sme overili, že priečinok /host-dir
existuje (druhý riadok), čiže bol automaticky vytvorený:
ssh pouzivatel@worker-1
ls /
Rovnako sa z nodu master
prihlásime do kontajnera podu s názvom pod-volume-hostpath
, ktorý bol nasadený na nod worker-1
, aby sme overili, že existuje aj priečinok /opt/container-dir
vytvorený v kontajneri s názvom container-volume-hostpath
:
kubectl exec -it pod-volume-hostpath -- /bin/bash
ls /opt
Oba priečinky existujú a teraz ešte overíme, či sa súbor vytvorený v priečinku /host-dir
zobrazí aj v priečinku /opt/container-dir
. V priečinku /host-dir
vytvoríme súbor test.txt
, ktorý by sa mal zobraziť aj v priečinku kontajnera. Na node worker-1 teda spustíme príkaz:
sudo touch /host-dir/test.txt
Rovnaký súbor sa zobrazí aj v kontajneri podu s názvom pod-volume-hostpath
v priečinku /opt/container-dir
, čo si overíme príkazom v kontajneri:
ls /opt/container-dir
Vymažeme vyššie špecifikované nasadenie podu:
kubectl delete -f ~/pod-volume-hostpath.yaml
Zistíme, že aj po vymazaní podu pod-volume-hostpath
ostal obsah priečinka /host-dir
na node worker-1
zachovaný. Na node worker-1
spustíme príkaz:
ls /host-dir
Zhrnutie
V šiestom diele sme ukázali, ako k podu pripojiť interné úložisko (storage) pomocou mechanizmu emptyDir, ktorého obsah zostáva zachovaný, pokiaľ pod nevymažeme. Externé úložisko zo systému súborov nodu sme ku kontajneru pripojili pomocou mechanizmu hostPath, pričom sme si overili, že aj po vymazaní nasadeného podu obsah pripojeného priečinka zostal zachovaný.