1. Les probes #
Dire à Kubernetes si l'application va bien.
Les trois sondes #
| Probe | Question posée | Si elle échoue |
|---|---|---|
| startupProbe | L'application a-t-elle fini de démarrer ? | Redémarrage du conteneur (après un long délai autorisé) |
| readinessProbe | Peut-elle recevoir du trafic ? | Retirée du Service (pas redémarrée) |
| livenessProbe | Est-elle toujours vivante ? | Redémarrage du conteneur |
containers:
- name: api
image: exemple/api:1.4.2
startupProbe:
httpGet: { path: /healthz, port: 8080 }
failureThreshold: 30
periodSeconds: 5 # jusqu'à 150 s pour démarrer
readinessProbe:
httpGet: { path: /ready, port: 8080 }
periodSeconds: 5
failureThreshold: 3
livenessProbe:
httpGet: { path: /healthz, port: 8080 }
periodSeconds: 10
timeoutSeconds: 2Erreur Courante : Une liveness probe qui vérifie une dépendance externe (base de données) provoque des redémarrages en cascade quand cette dépendance tombe. Gardez-la simple : « mon processus répond ».
2. Ressources et qualité de service #
requests, limits et QoS.
Dimensionner correctement #
resources:
requests: { cpu: 250m, memory: 256Mi } # base du scheduling et du HPA
limits: { memory: 512Mi } # limite mémoire ; CPU sans limite pour éviter le throttling
kubectl top pods --containers
kubectl describe pod <pod> | grep -E 'QoS|Last State|OOMKilled'
kubectl get pods -o custom-columns=NOM:.metadata.name,QOS:.status.qosClass| Classe QoS | Condition | En cas de pression sur le nœud |
|---|---|---|
| Guaranteed | requests = limits pour tous les conteneurs | Évincé en dernier |
| Burstable | requests < limits | Intermédiaire |
| BestEffort | aucune requête ni limite | Évincé en premier |
3. Autoscaling #
HPA, VPA et Cluster Autoscaler.
Horizontal Pod Autoscaler #
kubectl autoscale deployment web --cpu-percent=70 --min=2 --max=10
kubectl get hpa -w
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata: { name: web }
spec:
scaleTargetRef: { apiVersion: apps/v1, kind: Deployment, name: web }
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource: { name: cpu, target: { type: Utilization, averageUtilization: 70 } }
- type: Pods
pods: { metric: { name: http_requests_per_second }, target: { type: AverageValue, averageValue: "100" } }
behavior:
scaleDown: { stabilizationWindowSeconds: 300 }# Générer de la charge pour observer le scaling
kubectl run load --rm -it --image=busybox --restart=Never -- sh -c "while true; do wget -q -O- http://web; done"
kubectl get hpa web -wVPA, Cluster Autoscaler et KEDA #
- VPA : recommande ou ajuste requests/limits selon la consommation réelle (mode
Offpour les recommandations). - Cluster Autoscaler / Karpenter : ajoute ou retire des nœuds quand des pods restent en
Pending. - KEDA : autoscaling piloté par événements (longueur de file Kafka/RabbitMQ, cron, métriques Prometheus), jusqu'à zéro réplica.
4. Disponibilité pendant les opérations #
PDB et arrêt propre.
PodDisruptionBudget et graceful shutdown #
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata: { name: web }
spec:
minAvailable: 2 # ou maxUnavailable: 1
selector: { matchLabels: { app: web } }kubectl drain <noeud> --ignore-daemonsets --delete-emptydir-data # respecte les PDB
kubectl cordon <noeud> && kubectl uncordon <noeud>
# Arrêt propre : laisser le temps de terminer les requêtes
terminationGracePeriodSeconds: 45
lifecycle:
preStop: { exec: { command: ["sh", "-c", "sleep 10"] } } # laisse l'Ingress retirer le pod avant SIGTERMBonne Pratique : Combinez au moins 2 réplicas, unereadinessProbe, unPodDisruptionBudgetet destopologySpreadConstraintspour survivre à une panne de nœud ou de zone.
