
Une probe mal configurée peut provoquer plus d’indisponibilité que l’absence de probe. Ce guide vous apprend à choisir la bonne probe, à dimensionner ses paramètres, et à éviter les pièges qui transforment un healthcheck en source de pannes.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- La différence réelle entre liveness, readiness et startup
- Quand utiliser (et quand éviter) chaque type de probe
- Comment dimensionner les paramètres sans faux positifs
- Les anti-patterns qui causent des redémarrages en boucle
- Comment diagnostiquer une probe qui échoue
Ce que sont les probes Kubernetes
Section intitulée « Ce que sont les probes Kubernetes »Les probes (sondes) permettent à Kubernetes de surveiller l’état de vos conteneurs et d’agir en conséquence. Par défaut, Kubernetes considère qu’un conteneur est “en marche” tant que son processus principal tourne, même si l’application est bloquée ou incapable de traiter des requêtes.
Les probes comblent ce manque de signal applicatif en donnant au kubelet des indicateurs concrets sur l’état réel de l’application.
Les trois types de probes
Section intitulée « Les trois types de probes »Kubernetes propose trois types de probes, chacune avec un objectif distinct :
| Probe | Question posée | Action si échec |
|---|---|---|
| startupProbe | ”Le conteneur a-t-il fini de démarrer ?” | Redémarrage du conteneur |
| livenessProbe | ”Le conteneur est-il bloqué et irrécupérable ?” | Redémarrage du conteneur |
| readinessProbe | ”Le conteneur peut-il recevoir du trafic maintenant ?” | Retrait des endpoints du Service |
Startup Probe : gérer les démarrages lents
Section intitulée « Startup Probe : gérer les démarrages lents »La startupProbe est conçue pour les applications qui ont besoin d’un temps de
démarrage important. Tant qu’elle n’a pas réussi, Kubernetes n’exécute pas
les autres probes.
Cas d’usage :
- Application Java chargeant de nombreuses dépendances
- Base de données qui charge des données volumineuses en mémoire
- Application legacy avec initialisation complexe
startupProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 10 periodSeconds: 5 failureThreshold: 30 # 30 × 5s = 150s max pour démarrerLiveness Probe : détecter un conteneur bloqué
Section intitulée « Liveness Probe : détecter un conteneur bloqué »La livenessProbe vérifie si le conteneur est irrémédiablement bloqué et
doit être redémarré. Elle répond à la question : “faut-il tuer ce conteneur ?”
Cas d’usage :
- Deadlock applicatif
- Boucle infinie
- Thread principal suspendu
livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 15 periodSeconds: 20 timeoutSeconds: 5 failureThreshold: 3Readiness Probe : contrôler le trafic
Section intitulée « Readiness Probe : contrôler le trafic »La readinessProbe indique si le conteneur peut traiter des requêtes
maintenant. Tant qu’elle échoue, le Pod est retiré des endpoints des
Services et ne reçoit plus de trafic.
Cas d’usage :
- API qui doit établir une connexion à une base de données
- Application qui charge des fichiers de configuration
- Service qui attend une dépendance externe
readinessProbe: httpGet: path: /ready port: 8080 initialDelaySeconds: 5 periodSeconds: 10 timeoutSeconds: 3 failureThreshold: 3Ordre d’exécution des probes
Section intitulée « Ordre d’exécution des probes »L’ordre d’exécution n’est pas linéaire. Voici comment Kubernetes les orchestre :
-
Au démarrage du conteneur
Si une
startupProbeest définie, elle prend le contrôle. Les autres probes sont désactivées jusqu’à sa réussite. -
Après réussite de la startup probe
La
livenessProbeet lareadinessProbes’exécutent en parallèle, chacune selon sa propre logique et ses propres paramètres. -
En fonctionnement normal
- La
readinessProbecontrôle l’inclusion dans les endpoints - La
livenessProbesurveille les blocages irréversibles
- La
Quand éviter une liveness probe
Section intitulée « Quand éviter une liveness probe »Une liveness probe n’est pas toujours nécessaire. Kubernetes rappelle que
si votre application sait déjà crasher proprement en cas d’erreur, le kubelet
appliquera la politique de redémarrage (restartPolicy) sans avoir besoin
d’une liveness probe.
Situations où la liveness est inutile ou dangereuse
Section intitulée « Situations où la liveness est inutile ou dangereuse »| Situation | Pourquoi éviter la liveness |
|---|---|
| L’application crashe d’elle-même en cas de panne | Le restartPolicy suffit |
| Le check est coûteux ou instable | Risque de faux positifs |
| Le check dépend d’un service externe | Un problème externe provoquera des redémarrages |
| L’application est stateful et sensible aux redémarrages | Perte de données ou d’état |
Différencier liveness et readiness
Section intitulée « Différencier liveness et readiness »C’est l’erreur la plus fréquente : utiliser le même endpoint pour les deux probes sans réflexion.
Ce que chaque probe doit vérifier
Section intitulée « Ce que chaque probe doit vérifier »| Probe | Question | Ce qu’elle doit tester |
|---|---|---|
| readinessProbe | ”Puis-je traiter une requête maintenant ?” | État fonctionnel complet (base de données connectée, cache chargé, dépendances OK) |
| livenessProbe | ”Suis-je irrémédiablement bloqué ?” | État interne minimal (processus vivant, pas de deadlock) |
Exemple concret
Section intitulée « Exemple concret »# Readiness : vérifie que l'API peut vraiment répondrereadinessProbe: httpGet: path: /ready # Teste la connexion DB, le cache, etc. port: 8080 periodSeconds: 10 failureThreshold: 3
# Liveness : vérifie seulement que le processus n'est pas bloquélivenessProbe: httpGet: path: /healthz # Check léger, local, rapide port: 8080 periodSeconds: 20 failureThreshold: 5 # Plus tolérant que readinessMéthodes de vérification
Section intitulée « Méthodes de vérification »Kubernetes propose quatre méthodes pour vérifier l’état d’un conteneur :
Effectue une requête HTTP sur un chemin spécifié. Réussit si le code de réponse est entre 200 et 399.
livenessProbe: httpGet: path: /healthz port: http # Utilise un port nommé periodSeconds: 10Cas d’usage : Applications web, API REST.
TCPSocket
Section intitulée « TCPSocket »Tente d’établir une connexion TCP sur le port spécifié. Réussit si le port est ouvert.
readinessProbe: tcpSocket: port: 3306 periodSeconds: 10Cas d’usage : Bases de données, services TCP (MySQL, Redis, PostgreSQL).
Exec (Commande)
Section intitulée « Exec (Commande) »Exécute une commande dans le conteneur. Réussit si le code de retour est 0.
startupProbe: exec: command: - cat - /app/ready periodSeconds: 5Cas d’usage : Vérifications personnalisées, présence d’un fichier.
Teste directement un service gRPC via le protocole standard de health checking. Disponible nativement depuis Kubernetes v1.23.
readinessProbe: grpc: port: 50051 service: myapp.v1.Health periodSeconds: 10Cas d’usage : Services exposant une interface gRPC.
Headers HTTP personnalisés
Section intitulée « Headers HTTP personnalisés »Pour les probes HTTP, vous pouvez ajouter des en-têtes personnalisés :
readinessProbe: httpGet: path: /ready port: 8080 httpHeaders: - name: X-Probe-Type value: readinessCas d’usage :
- Distinguer les types de checks côté application
- Satisfaire un reverse proxy interne
- Ajouter des métadonnées pour l’observabilité
Récapitulatif des méthodes
Section intitulée « Récapitulatif des méthodes »| Méthode | Protocole | Cas d’usage | Coût |
|---|---|---|---|
| HTTPGet | HTTP(S) | Applications web, API | Faible |
| TCPSocket | TCP | Bases de données, services TCP | Très faible |
| Exec | Commande | Vérifications personnalisées | Élevé |
| gRPC | gRPC | Services gRPC | Faible |
Paramètres de configuration
Section intitulée « Paramètres de configuration »Tous les paramètres disponibles
Section intitulée « Tous les paramètres disponibles »| Paramètre | Défaut | Description |
|---|---|---|
initialDelaySeconds | 0 | Délai avant la première exécution |
periodSeconds | 10 | Intervalle entre chaque check |
timeoutSeconds | 1 | Durée maximale d’un check |
failureThreshold | 3 | Nombre d’échecs avant action |
successThreshold | 1 | Nombre de succès pour revenir OK (readiness uniquement) |
terminationGracePeriodSeconds | — | Délai de grâce spécifique à la probe |
Utiliser des ports nommés
Section intitulée « Utiliser des ports nommés »Pour une meilleure lisibilité, référencez les ports par leur nom :
spec: containers: - name: app image: myapp:1.0 ports: - name: http containerPort: 8080 - name: metrics containerPort: 9090 livenessProbe: httpGet: path: /healthz port: http # Référence le port nommé readinessProbe: httpGet: path: /ready port: httpDimensionner ses probes
Section intitulée « Dimensionner ses probes »Méthodologie
Section intitulée « Méthodologie »-
Mesurer le temps de démarrage réel
Lancez votre application et mesurez le temps jusqu’à ce qu’elle soit prête. Ajoutez une marge de 20-30%.
-
Définir la startup probe
failureThreshold × periodSecondsdoit être supérieur au temps de démarrage maximal. -
Configurer la readiness probe
Plus réactive que la liveness.
periodSecondscourt (5-10s),failureThresholdmodéré (3). -
Configurer la liveness probe
Plus tolérante que la readiness.
periodSecondsplus long (15-30s),failureThresholdplus élevé (5+).
Tableau de dimensionnement
Section intitulée « Tableau de dimensionnement »| Situation | Probe recommandée | Configuration suggérée |
|---|---|---|
| Démarrage en 45s | startupProbe | periodSeconds: 5, failureThreshold: 12 |
| API rapide, dépendante d’une DB | readinessProbe | periodSeconds: 10, failureThreshold: 3 |
| Process susceptible de deadlock | livenessProbe | periodSeconds: 20, failureThreshold: 5 |
| Service sensible aux pics de charge | Toutes | timeoutSeconds: 5, failureThreshold: 5 |
Exemple complet
Section intitulée « Exemple complet »apiVersion: apps/v1kind: Deploymentmetadata: name: apispec: replicas: 3 selector: matchLabels: app: api template: metadata: labels: app: api spec: containers: - name: api image: myapi:1.0 ports: - name: http containerPort: 8080 # Startup : pour les démarrages lents startupProbe: httpGet: path: /healthz port: http initialDelaySeconds: 5 periodSeconds: 5 failureThreshold: 30 # 150s max pour démarrer # Liveness : détection des blocages livenessProbe: httpGet: path: /healthz port: http periodSeconds: 20 timeoutSeconds: 5 failureThreshold: 5 # Readiness : contrôle du trafic readinessProbe: httpGet: path: /ready port: http periodSeconds: 10 timeoutSeconds: 3 failureThreshold: 3 successThreshold: 1Anti-patterns à éviter
Section intitulée « Anti-patterns à éviter »Les erreurs qui provoquent des pannes
Section intitulée « Les erreurs qui provoquent des pannes »| Anti-pattern | Conséquence | Solution |
|---|---|---|
| Liveness qui teste une DB externe | Cascade de redémarrages si la DB est lente | Tester uniquement l’état interne |
periodSeconds trop court | Charge CPU, faux positifs | Minimum 10s pour liveness |
timeoutSeconds de 1s par défaut | Faux positifs sous charge | Augmenter à 3-5s |
Probe exec avec script lourd | Consommation excessive de ressources | Préférer HTTPGet |
| Même endpoint pour liveness et readiness | Pas de distinction entre “bloqué” et “pas prêt” | Endpoints différents |
Oublier startupProbe sur une appli lente | Redémarrages pendant le démarrage | Ajouter une startup probe |
| Headers HTTP avec secrets | Exposition de credentials | Endpoint non authentifié |
La règle d’or
Section intitulée « La règle d’or »Une probe ne doit pas devenir elle-même la cause de l’instabilité qu’elle cherche à détecter.
Lien avec les Services
Section intitulée « Lien avec les Services »Quand une readinessProbe échoue, Kubernetes retire le Pod des endpoints
du Service. Le Pod existe toujours, mais ne reçoit plus de trafic.
Observer les endpoints
Section intitulée « Observer les endpoints »# Voir les endpoints d'un Servicekubectl get endpoints mon-service
# Résultat quand un Pod n'est pas readyNAME ENDPOINTS AGEmon-service 10.244.0.5:8080,10.244.0.6:8080 1h# Le Pod avec IP 10.244.0.7 n'apparaît plus car il n'est pas ReadyObserver la condition Ready
Section intitulée « Observer la condition Ready »kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IPapi-1 1/1 Running 0 1h 10.244.0.5api-2 1/1 Running 0 1h 10.244.0.6api-3 0/1 Running 0 1h 10.244.0.7 # Pas readyLa colonne READY montre 0/1 quand la readiness probe échoue.
Diagnostiquer une probe qui échoue
Section intitulée « Diagnostiquer une probe qui échoue »Étapes de diagnostic
Section intitulée « Étapes de diagnostic »-
Vérifier l’état du Pod
Fenêtre de terminal kubectl get pod mon-pod -o widekubectl describe pod mon-podCherchez les événements
Unhealthyavec le type de probe concerné. -
Lire les logs du conteneur
Fenêtre de terminal kubectl logs mon-podkubectl logs mon-pod --previous # Si le conteneur a redémarré -
Tester la probe manuellement
Fenêtre de terminal kubectl exec mon-pod -- curl -v http://localhost:8080/healthzkubectl exec mon-pod -- cat /app/ready -
Vérifier les événements du cluster
Fenêtre de terminal kubectl get events --sort-by=.lastTimestamp | grep mon-pod
Messages d’erreur courants
Section intitulée « Messages d’erreur courants »| Message | Cause probable | Solution |
|---|---|---|
Liveness probe failed: connection refused | Application pas encore démarrée | Ajouter startupProbe ou augmenter initialDelaySeconds |
Readiness probe failed: HTTP 503 | Dépendance non disponible | Vérifier les connexions externes |
Liveness probe failed: context deadline exceeded | Timeout trop court | Augmenter timeoutSeconds |
Back-off restarting failed container | Probe en échec répété | Vérifier les logs avec --previous |
Exemple de sortie describe
Section intitulée « Exemple de sortie describe »kubectl describe pod api-brokenEvents: Type Reason Age Message ---- ------ ---- ------- Warning Unhealthy 30s Liveness probe failed: HTTP probe failed with statuscode: 503 Warning Unhealthy 20s Liveness probe failed: HTTP probe failed with statuscode: 503 Warning Unhealthy 10s Liveness probe failed: HTTP probe failed with statuscode: 503 Normal Killing 10s Container api failed liveness probe, will be restartedContrôle de connaissances
Section intitulée « Contrôle de connaissances »Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
À retenir
Section intitulée « À retenir »- startupProbe désactive les autres probes jusqu’à sa réussite
- livenessProbe teste l’état interne, jamais les dépendances externes
- readinessProbe contrôle l’inclusion dans les endpoints du Service
- Une liveness trop agressive provoque des CrashLoopBackOff
timeoutSecondsà 1s par défaut est souvent trop court- Utilisez des endpoints différents pour liveness et readiness
- Les probes sont configurées sur les conteneurs, pas les Pods
- Sans startup probe, une appli lente redémarre pendant son init
- Les probes exec sont plus coûteuses que HTTPGet
kubectl describe podmontre les événements Unhealthy