1. Báza znalostí
  2. Cloud a servery
  3. Kontajnery
  4. Kubernetes
  5. Kubernetes – 6. Storage pomocou emptyDir a hostPath

Kubernetes – 6. Storage pomocou emptyDir a hostPath

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.

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

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

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

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