Module 2 · k8s par la pratique (via k9s)¶
Objectifs
- Consolider les objets k8s en les manipulant, pas en les lisant.
- Debugger les pannes classiques :
CrashLoopBackOff,ImagePullBackOff,Pending. - Maîtriser scale, rollout, ConfigMap/Secret depuis k9s.
- Durée : ~3 h · Pré-requis : Module 1.
1. Le cycle de vie d'un pod¶
graph LR
P[Pending] --> R[Running]
R --> S[Succeeded]
R --> F[Failed]
P -.image KO.-> W[ImagePullBackOff]
R -.process meurt.-> C[CrashLoopBackOff]
| État | Signification | Où regarder |
|---|---|---|
Pending |
Pas encore planifié (ressources ? volume ?) | d describe → events |
ContainerCreating |
En cours de création | events |
Running |
OK | logs |
CrashLoopBackOff |
Le conteneur démarre puis meurt en boucle | logs (--previous) |
ImagePullBackOff |
Image introuvable / accès refusé | describe → events |
La règle d'or du debug k8s
describe → events → logs. Dans cet ordre. 90 % des pannes se lisent dans les events.
2. ConfigMaps & Secrets¶
Un ConfigMap stocke de la config non sensible ; un Secret des données sensibles (base64).
bash
kubectl create configmap app-config --from-literal=COLOR=blue
kubectl create secret generic app-secret --from-literal=API_KEY=s3cr3t
Dans k9s : :cm et :secret. Sur un secret, x peut décoder les valeurs (selon version) ;
sinon y montre le base64.
Warning
Un Secret k8s n'est pas chiffré par défaut, juste encodé en base64. La « sécurité » vient du RBAC (qui peut le lire) — on en parle au module 3.
3. Scaling & rollout¶
bash
kubectl scale deploy web --replicas=5
kubectl set image deploy/web nginx=nginx:1.27 # déclenche un rolling update
kubectl rollout status deploy/web
kubectl rollout undo deploy/web # rollback
Dans k9s, sur un deployment : s pour scaler, r pour restart, l pour suivre les logs pendant le déploiement.
4. Exercices¶
Exercice 2.1 — CrashLoopBackOff
bash
kubectl run crash --image=busybox -- sh -c "echo demarrage; exit 1"
1. Dans k9s, observe le pod passer en CrashLoopBackOff.
2. Lis les logs (l) : que voit-on ? Et avec kubectl logs crash --previous ?
3. Explique pourquoi k8s le redémarre en boucle (restartPolicy).
Exercice 2.2 — ImagePullBackOff
bash
kubectl run fantome --image=nexistepas/super-app:9.9.9
1. d describe → trouve l'event exact.
2. Corrige : supprime et relance avec nginx.
Exercice 2.3 — Config injectée
bash
kubectl create configmap demo --from-literal=MESSAGE="Salut la sandbox"
kubectl run reader --image=busybox --env-from=configmap/demo --restart=Never -- env
1. Dans k9s, ouvre les logs du pod reader.
2. Retrouve la variable MESSAGE dans la sortie.
Exercice 2.4 — Rolling update + rollback
bash
kubectl create deployment site --image=nginx:1.25 --replicas=3
kubectl set image deploy/site nginx=nginx:1.27
1. Suis le rollout dans k9s (les pods se remplacent un à un).
2. Casse-le volontairement : kubectl set image deploy/site nginx=nginx:nope.
3. Observe les pods bloqués, puis kubectl rollout undo deploy/site.
5. Ce qu'il faut retenir¶
- describe → events → logs : le triptyque du debug.
CrashLoopBackOff= problème applicatif (logs--previous).ImagePullBackOff/Pending= problème plateforme (events du describe).- Scale / rollout / rollback : Kubernetes gère le remplacement progressif pour toi.
➡️ Suite : Module 3 — Administration cluster