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.

kubectl patch deploy web -p \
  '{"spec":{"strategy":{"rollingUpdate":{"maxUnavailable":0,"maxSurge":1}}}}'
kubectl set image deploy/web nginx=nginx:1.27-alpine
kubectl get pods -l app=web -w         # Ctrl-C až budete hotovi

Cenou je kapacita: potřebujete místo na jeden pod navíc.

Úkol B. Restartujte všechny pody Deploymentu beze změny image a bez ručního mazání podů.

kubectl rollout restart deploy/web
kubectl rollout status deploy/web

Takhle donutíte Deployment načíst změněnou ConfigMapu nebo Secret, které konzumuje jako proměnné prostředí.

Úkol C. Zjistěte, který ReplicaSet je aktivní a kolik starých si Deployment drží.

kubectl get rs -l app=web
kubectl get deploy web -o jsonpath='{.spec.revisionHistoryLimit}{"\n"}'

Výchozí hodnota je 10 uchovaných ReplicaSetů.

Úklid

kubectl delete -f web-deploy.yaml