V predošlom 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ý.
V tomto diele predstavíme dôležité funkcie systému Kubernetes, ktoré sa starajú o aktualizáciu nasadenia bez potreby reštartovania alebo vypnutia serverov (rolling updates) a v prípade problému aj o návrat do posledného funkčného stavu (Rollbacks).
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
Rolling updates
Vytvoríme súbor s názvom deployment-nginx-update-test.yaml
(prvý riadok), do ktorého zapíšeme definíciu nasadenia (ostatné riadky):
nano ~/deployment-nginx-update-test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx-update_test
labels:
app: nginx
spec:
replicas: 4
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.20.1
ports:
- containerPort: 80
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
.
Deployment nasadíme z vyššie vytvoreného konfiguračného súboru:
kubectl create -f ~/deployment-nginx-update-test.yaml
Skontrolujeme, či sa vytvorilo nasadenie (prvý riadok), či existujú pody (druhý riadok) a replicasety (tretí riadok):
kubectl get deployments
kubectl get pods
kubectl get replicasets
Vidíme, že je vytvorené jedno nasadenie a jeden replicaset, ktorý spravuje 4 pody.
V súbore deployment-nginx-update-test.yaml
teraz na riadku číslo 19
zmeníme verziu obrazu Nginx na 1.19.6 takto:
nano +19 ~/deployment-nginx-update-test.yaml
V riadku číslo 19 na konci prepíšeme verziu 1.20.1
na 1.19.6
, uložíme pomocou klávesovej skratky Ctrl + X
a následne stlačením klávesu y
a potvrdením klávesom Enter
.
Takto zmenu aplikujeme:
kubectl apply -f ~/deployment-nginx-update-test.yaml
Po kontrole replicasetov zistíme, že predošlý replicaset s verziou servera Nginx 1.20.1 obsahuje nula podov a nový (aktualizovaný) obsahuje 4 pody už s verziou servera Nginx 1.19.6:
kubectl get replicasets
Rollback
Prepíšme teraz verziu obrazu servera Nginx z 1.19.6 na 1.1.1 (prvý riadok), aplikujem zmeny (druhý riadok) a skontrolujem replicasety (tretí riadok):
nano ~/deployment-nginx-update-test.yaml
kubectl apply -f ~/deployment-nginx-update-test.yaml
kubectl get replicasets
Zistíme, že posledný replicaset obsahuje nula podov, pretože server Nginx vo verzii 1.1.1 neexistuje, teda sa pody nepodarilo nasadiť.
V takýchto prípadoch môžeme vďaka funkcii Rollback vrátiť systém Kubernets do stavu naposledy funkčného bez potreby reštartovania alebo vypnutia servera.
Pomocou príkazu vypísaného nižšie najskôr necháme vypísať zoznam revízií:
kubectl rollout history deployments deployment-nginx-update-test
Takto necháme vypísať detaily revízie číslo 2 (--revision=2
):
kubectl rollout history deployments deployment-nginx-update-test --revision=2
V našom prípade obnovujeme stav do bodu revízie číslo 2 (--revision=2
), keďže vtedy určite všetko fungovalo správne. Urobíme to takto:
kubectl rollout undo deployment deployment-nginx-update-test
Skontrolujeme, či nasadenia (prvý riadok), pody (druhý riadok) a replicasety (tretí riadok) naozaj fungujú správne:
kubectl get deployments
kubectl get pods
kubectl get replicasets
Nakoniec ešte vymažeme nasadenie (a s ním aj súvisiace pody), ktoré už teraz nie je potrebné:
kubectl delete -f ~/deployment-nginx-update-test.yaml
Zhrnutie
V siedmom diele sme ukázali, ako nasadený deployment aktualizovať bez akéhokoľvek výpadku. Tiež sme demonštrovali, ako sa v prípade chyby vrátiť do bodu, kedy všetko fungovalo správne – a to bez potreby reštartovania či vypnutia servera.