Lab 11 – Deployments a probes
Lab 11 – Deployments a probes
Cíl: nasadit novou verzi, rozbít ji, vrátit se – a pochopit, proč to nebolelo. Kapitola: Deployments
# 1 – generovat, nepsat ručně
cd ~
kubectl create deploy web --image nginx:1.27 --replicas 3 \
--dry-run=client -o yaml > web-deploy.yaml
kubectl apply -f web-deploy.yaml
kubectl get deploy,rs,pods -l app=web
Tři objekty z jednoho příkazu: Deployment, který jste chtěli, ReplicaSet, který vytvořil, a pody, které vytvořil ten ReplicaSet.
# 2 – nová verze
kubectl set image deploy/web nginx=nginx:1.28
kubectl rollout status deploy/web
kubectl get rs -l app=web
Teď jsou ReplicaSety dva: starý na nule, nový na třech. Starý se schválně nechává – je to váš rollback.
# 3 – historie
kubectl rollout history deploy/web
kubectl rollout history deploy/web --revision=2
# 4 – schválně to rozbijte
kubectl set image deploy/web nginx=nginx:doesnotexist
kubectl rollout status deploy/web --timeout=30s # nikdy nedoběhne
kubectl get pods -l app=web
kubectl get rs -l app=web
Podívejte se pozorně: staré pody pořád běží a pořád obsluhují. Protože je
maxUnavailable rovno 1, Deployment odmítá odstranit zdravé pody, dokud nejsou
připravené ty nové – a ty připravené nebudou nikdy. Špatný image rollout
zastaví, výpadek nezpůsobí.
# 5 – návrat zpět
kubectl rollout undo deploy/web
kubectl rollout status deploy/web
kubectl get pods -l app=web -o jsonpath='{.items[0].spec.containers[0].image}{"\n"}'
Probes
# 6 – readiness probe, která nemůže uspět
kubectl patch deploy web -p '{"spec":{"template":{"spec":{"containers":[{"name":"nginx","readinessProbe":{"httpGet":{"path":"/nope","port":80},"periodSeconds":3}}]}}}}'
kubectl get pods -l app=web
Nové pody jsou Running, ale 0/1 READY. Selhání readiness nic nerestartuje –
vyřadí pod z endpointů Service. A protože rollout na readiness čeká, i tenhle
rollout se bezpečně zasekl.
# 7 – opravte cestu probe
kubectl patch deploy web -p '{"spec":{"template":{"spec":{"containers":[{"name":"nginx","readinessProbe":{"httpGet":{"path":"/","port":80},"periodSeconds":3}}]}}}}'
kubectl rollout status deploy/web
kubectl get pods -l app=web
Objevovací část
InfodiscoveryÚkol A. Nastavte rollout tak, aby byl striktně bez výpadku: nikdy méně než plný počet dostupných podů, nejvýš jeden pod navíc. Pak spusťte rollout a ověřte, že počet neklesl.
Úkol B. Restartujte všechny pody Deploymentu beze změny image a bez ručního mazání podů.
Úkol C. Zjistěte, který ReplicaSet je aktivní a kolik starých si Deployment drží.
Úklid
kubectl delete -f web-deploy.yaml