Erori, rollback și curățare
În ultima parte a laboratorului introducem două erori controlate și folosim informațiile oferite de Kubernetes pentru a le diagnostica.
Imagine inexistentă
Aplicați Deployment-ul care referă o imagine inexistentă:
kubectl apply -f k8s/scenarios/deployment-broken-image.yaml
kubectl rollout status deployment/ticketing-api -n cc-lab2 --timeout=30s
Este de așteptat ca ultima comandă să expire. Inspectați starea:
kubectl get deployments,replicasets,pods -n cc-lab2
kubectl describe deployment ticketing-api -n cc-lab2
kubectl describe pod <nume-pod-cu-eroare> -n cc-lab2
kubectl get events -n cc-lab2 --sort-by=.metadata.creationTimestamp
Pod-ul nou va ajunge, de regulă, în starea ImagePullBackOff sau ErrImagePull. Deoarece noul Pod nu devine Ready și strategia are maxUnavailable: 0, vechile replici funcționale sunt păstrate.
Consultați istoricul și reveniți la ultima revizie funcțională:
kubectl rollout history deployment/ticketing-api -n cc-lab2
kubectl rollout undo deployment/ticketing-api -n cc-lab2
kubectl rollout status deployment/ticketing-api -n cc-lab2
Pentru revenirea la o revizie anume se poate folosi:
kubectl rollout undo deployment/ticketing-api \
-n cc-lab2 \
--to-revision=<număr-revizie>
Selector greșit
Opriți orice sesiune port-forward rămasă activă. O sesiune deja stabilită poate continua să comunice direct cu Pod-ul ales anterior și nu ar demonstra corect problema selectorului.
Aplicați Service-ul al cărui selector nu corespunde Pod-urilor:
kubectl apply -f k8s/scenarios/service-broken-selector.yaml
kubectl describe service ticketing-api -n cc-lab2
kubectl get endpointslices -n cc-lab2 \
-l kubernetes.io/service-name=ticketing-api
Service-ul există, dar nu mai are endpoint-uri funcționale. O nouă încercare de port-forward către Service nu va putea selecta un Pod:
kubectl port-forward service/ticketing-api -n cc-lab2 8080:80
Restaurați Service-ul corect:
kubectl apply -f k8s/base/30-service.yaml
kubectl get endpointslices -n cc-lab2 \
-l kubernetes.io/service-name=ticketing-api
Porniți din nou port-forward, dacă este necesar, și executați testul final:
kubectl port-forward service/ticketing-api -n cc-lab2 8080:80
În alt terminal:
curl http://localhost:8080/health
curl http://localhost:8080/info
Curățare
Opriți port-forward cu Ctrl+C, apoi ștergeți clusterul:
kind delete cluster --name cc-lab2
Ce am obținut
Am pornit de la imaginea aplicației din Laboratorul 1 și am ajuns la:
- o aplicație declarată printr-un Deployment
- mai multe replici menținute automat
- un endpoint stabil oferit de un Service
- self-healing și scalare
- actualizare graduală și rollback
- diagnosticarea unor erori uzuale.
În Laboratorul 3 vom adăuga PostgreSQL și persistență și vom analiza ce se întâmplă cu datele și disponibilitatea atunci când componentele eșuează.