Aller au contenu
English
Conteneurs & Orchestration medium

Débugger une application Kubernetes

45 min de lecture

logo kubernetes

Kubernetes offre plusieurs outils de diagnostic intégrés. Vous utiliserez principalement kubectl logs pour les erreurs applicatives, kubectl describe et kubectl get events pour les problèmes d'orchestration, et kubectl exec ou kubectl debug pour l'investigation interactive. Ce guide vous montre comment combiner ces outils efficacement.

  • Diagnostiquer avec kubectl get, kubectl describe et kubectl get events
  • Analyser les logs avec kubectl logs
  • Exécuter des commandes avec kubectl exec
  • Utiliser les conteneurs éphémères (kubectl debug)
  • Investiguer les problèmes réseau et de service
  • Résoudre les erreurs courantes (CrashLoopBackOff, ImagePullBackOff, OOMKilled, Pending)

Le diagnostic d'un Pod suit toujours la même progression, et la sauter coûte du temps plutôt que d'en gagner. Chaque phase produit en effet l'information dont la suivante a besoin : sans avoir lu l'état et les événements, vous ne savez ni quel conteneur inspecter ni quels journaux demander. Les quatre étapes ci-dessous structurent tout le guide.

  1. Observer : quel est l'état actuel du Pod, des événements ?
  2. Comprendre : pourquoi cet état ? Logs, conditions, exit codes
  3. Investiguer : plonger dans le conteneur si nécessaire
  4. Corriger : appliquer la solution et vérifier

Ce tableau se lit par la colonne de gauche, celle du symptôme observé, et donne les deux commandes à lancer dans cet ordre. L'ordre n'est pas interchangeable : sur un CrashLoopBackOff, kubectl logs --previous vient avant describe parce que le conteneur courant n'a peut-être pas encore produit de logs, alors que l'instance précédente en a laissé. Si les deux commandes ne suffisent pas, la section correspondante plus bas détaille le diagnostic.

SymptômePremière commandeDeuxième commande
Pod en CrashLoopBackOffkubectl logs --previouskubectl describe pod
Pod en Pendingkubectl describe podkubectl get events
Pod Running mais application KOkubectl logskubectl port-forward / debug réseau
Image minimale sans shellkubectl debug --image=busybox:1.37@sha256:9db7b59979c38555a39def84a31fb98b5296952f9e3afd4f6f11f05b07adfab0ps, ss, nslookup, curl
Suspicion OOMkubectl describe podkubectl top pod
Problème de Servicekubectl get endpointslicekubectl port-forward pod

Cinq commandes couvrent la quasi-totalité des diagnostics, et l'ordre dans lequel vous les enchaînez compte autant que les commandes elles-mêmes. On part toujours du plus large, l'état, vers le plus précis, le contenu du conteneur : chaque étape élimine une famille de causes avant de creuser la suivante.

Première commande pour voir l'état de vos ressources :

Fenêtre de terminal
# État des Pods dans un namespace
kubectl get pods -n mon-namespace
# État de TOUS les Pods du cluster
kubectl get pods -A
# Plus de détails (node, IP)
kubectl get pods -o wide
# Rafraîchissement continu
kubectl get pods -w

Exemple de sortie :

NAME READY STATUS RESTARTS AGE
app-healthy 1/1 Running 0 2h
app-crashloop 0/1 CrashLoopBackOff 5 (30s ago) 3m
app-pending 0/1 Pending 0 5m

Un nombre élevé de redémarrages signale une instabilité à instruire. La cause peut être applicative, venir de sondes trop agressives, d'un dépassement de mémoire, ou de la configuration du Pod. Ne concluez pas au « problème applicatif » sans avoir examiné les journaux et le statut détaillé.

Commande sous-estimée mais extrêmement utile. Les événements donnent une vue chronologique de ce qui s'est passé :

Fenêtre de terminal
# Événements du namespace courant, triés par date
kubectl get events --sort-by=.lastTimestamp
# Événements de tous les namespaces
kubectl get events -A --sort-by=.lastTimestamp
# Événements d'un namespace spécifique
kubectl get events -n mon-namespace --sort-by=.lastTimestamp

Exemple de sortie :

LAST SEEN TYPE REASON OBJECT MESSAGE
2m Warning FailedScheduling pod/app-pending 0/3 nodes are available: 3 Insufficient memory
3m Normal Pulling pod/app-new Pulling image "nginx:1.25"
5m Warning BackOff pod/app-crashloop Back-off restarting failed container

kubectl describe pod montre les événements d'un seul Pod. kubectl get events montre tous ceux du namespace, ce qui est plus efficace tant que vous ignorez quel Pod pose problème.

Pour comprendre pourquoi un Pod est dans un état donné :

Fenêtre de terminal
kubectl describe pod mon-pod

Sections clés à examiner :

SectionInformation
StatusÉtat actuel du Pod
ConditionsReady, Initialized, ContainersReady, PodScheduled
ContainersÉtat de chaque conteneur, codes de sortie, raison
EventsHistorique chronologique des actions sur ce Pod

La section Events, en bas de describe, contient souvent la réponse : échec de téléchargement d'image, volume introuvable, ressources insuffisantes. Pour un conteneur arrêté, la raison se lit dans State s'il n'a pas redémarré, dans Last State s'il a redémarré.

kubectl logs lit les logs via le kubelet sur le nœud, à partir des fichiers de logs du conteneur. C'est pourquoi votre application doit écrire vers stdout et stderr.

Fenêtre de terminal
# Logs d'un Pod (conteneur unique)
kubectl logs mon-pod
# Logs d'un conteneur spécifique (Pod multi-conteneurs)
kubectl logs mon-pod -c mon-conteneur
# Dernières 100 lignes
kubectl logs mon-pod --tail=100
# Logs en temps réel
kubectl logs mon-pod -f
# Logs de l'instance précédente du conteneur (après crash)
kubectl logs mon-pod --previous

Après un CrashLoopBackOff, kubectl logs --previous permet de récupérer les logs de l'instance précédente du conteneur, si elle existe. Si le conteneur n'a pas encore redémarré ou s'il n'y a pas d'instance précédente, la commande retourne une erreur.

Sur un Pod multi-conteneurs, kubectl logs ne devine pas. Sans -c, il choisit le premier conteneur déclaré, ou refuse si l'ambiguïté le permet. Nommez-le, ou demandez tout :

Sur un Pod avec plusieurs conteneurs, vous devez spécifier lequel avec -c nom-conteneur. Sinon, kubectl logs échoue ou choisit le premier conteneur.

Pour exécuter des commandes dans un conteneur en cours d'exécution :

Fenêtre de terminal
# Commande unique
kubectl exec mon-pod -- ls -la /app
# Shell interactif
kubectl exec -it mon-pod -- /bin/sh
# Avec conteneur spécifique (Pod multi-conteneurs)
kubectl exec -it mon-pod -c sidecar -- /bin/bash

Les conteneurs éphémères sont stables depuis Kubernetes v1.25. Ils permettent d'injecter un conteneur de debug temporaire dans un Pod existant :

Fenêtre de terminal
# Ajouter un conteneur éphémère basique
kubectl debug mon-pod -it --image=busybox:1.37@sha256:9db7b59979c38555a39def84a31fb98b5296952f9e3afd4f6f11f05b07adfab0 --target=app
# Avec des outils réseau complets
kubectl debug mon-pod -it --image=nicolaka/netshoot:v0.16@sha256:b09d9b21381f47a79b3cbcb30da25266dc17186ea00ae65e99fdc51396f48e70 --target=app

L'option --target permet de partager le namespace de processus avec le conteneur cible. Vous pourrez voir ses processus avec ps aux, lire /proc/1/environ, etc.

Exemple pratique dans le conteneur de debug :

Fenêtre de terminal
# Voir les processus du conteneur cible
ps aux
# Variables d'environnement du processus principal
cat /proc/1/environ | tr '\0' '\n'
# Ports en écoute
ss -tlnp
# Test de connectivité réseau
curl -v http://mon-service:8080/health

Un conteneur éphémère sert au diagnostic ponctuel. Ce n'est pas un vrai conteneur applicatif : il ne supporte ni probes ni lifecycle hooks, et l'API est catégorique là où elle posait une condition pour les init containers :

spec.ephemeralContainers[0].livenessProbe: Forbidden:
cannot be set for an Ephemeral Container

Il ne remplace donc ni un sidecar ni un conteneur défini dans le Pod d'origine.

La syntaxe reprend celle de scp : la source vient en premier, la destination ensuite, et le pod se désigne par pod:/chemin. Une limite à connaître avant de l'utiliser en incident, détaillée juste après : la commande s'appuie sur tar présent dans le conteneur distant, ce qui la rend inopérante sur les images minimales. Évitez également de récupérer un fichier volumineux d'un pod en production, la copie transite par le serveur d'API.

Fenêtre de terminal
# Pod → Local
kubectl cp mon-pod:/app/logs/error.log ./error.log
# Local → Pod
kubectl cp ./config.yaml mon-pod:/app/config.yaml
# Avec conteneur spécifique
kubectl cp mon-pod:/app/dump.txt ./dump.txt -c app

Voir la consommation CPU/mémoire en temps réel nécessite metrics-server installé dans le cluster. C'est un prérequis courant à l'examen CKAD.

Vérifier que metrics-server est présent :

Fenêtre de terminal
kubectl get pods -n kube-system | grep metrics-server
kubectl top nodes # Si metrics-server est absent : "error: Metrics API not available"

Installer metrics-server si absent (environnements de test) :

Fenêtre de terminal
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.9.0/components.yaml
# Attendre la disponibilité (30-60 secondes)
kubectl rollout status deployment/metrics-server -n kube-system

Commandes utiles :

Fenêtre de terminal
# Pods du namespace courant
kubectl top pods
# Tous les Pods (tous les namespaces)
kubectl top pods -A
# Nœuds
kubectl top nodes
# Trier par mémoire décroissante
kubectl top pods --sort-by=memory
# Trier par CPU décroissante
kubectl top pods --sort-by=cpu
# Un Pod avec détail par conteneur
kubectl top pod mon-pod --containers

Exemple de sortie et interprétation :

NAME CPU(cores) MEMORY(bytes)
api 234m 128Mi
worker 12m 64Mi
db 890m 512Mi

La colonne CPU est en millicores (1000m = 1 vCPU). Un Pod qui consomme 890m CPU alors que sa requests est à 500m mais sa limit à 1000m fonctionne mais approche la limite, risque de throttling. Pour la mémoire, si la consommation dépasse la limit, le Pod est tué en OOMKilled.

Corréler avec requests/limits :

Fenêtre de terminal
# Comparer consommation réelle vs limits définies
kubectl get pod mon-pod -o=jsonpath='{.spec.containers[*].resources}' | jq
kubectl top pod mon-pod --containers

Dans le domaine "Application Observability and Maintenance", vous serez évalué sur votre capacité à diagnostiquer avec les outils intégrés. La combinaison kubectl top + kubectl describe + kubectl logs + kubectl get events couvre l'essentiel. Retenez :

  • kubectl top nécessite metrics-server, vérifiez-le en premier
  • Un Pod OOMKilled se lit d'abord dans la colonne STATUS, puis dans State ou Last State selon qu'il a redémarré
  • kubectl top pods --sort-by=memory permet d'identifier le premier consommateur

Gardez en tête ce que cette commande ne fait pas. kubectl top donne des métriques instantanées, utiles pour trier vite, et rien de plus : il ne remplace pas une chaîne d'observabilité avec historique, du type Prometheus et Grafana. Pour un OOM déjà survenu, il ne sert à rien, puisqu'il ne montre que le présent ; c'est kubectl describe pod qui garde la trace, dans State ou Last State selon que le conteneur a redémarré ou non.

Accédez à un Pod ou Service sans exposition externe :

Fenêtre de terminal
# Vers un Pod
kubectl port-forward mon-pod 8080:80
# Vers un Service
kubectl port-forward svc/mon-service 8080:80
# En arrière-plan
kubectl port-forward mon-pod 8080:80 &

Utile pour tester si le Pod répond indépendamment du Service.

Ces symptômes reviennent plus que tous les autres, et chacun désigne une couche différente du problème. Un Pod qui ne démarre pas renvoie à l'image ou au placement, un Pod qui redémarre en boucle renvoie à l'application, un Pod qui tourne sans répondre renvoie au réseau ou à la readiness. Identifier la couche avant de chercher la cause fait gagner le plus de temps.

Symptôme : Le conteneur démarre, crash, redémarre en boucle.

  1. Vérifiez les logs du crash précédent

    Fenêtre de terminal
    kubectl logs mon-pod --previous
  2. Examinez le code de sortie et la raison

    Fenêtre de terminal
    kubectl describe pod mon-pod | grep -A10 "Last State"
  3. Interprétez le code de sortie

    CodeSignification
    0Sortie normale (mais Pod censé tourner → vérifiez la commande)
    1Erreur applicative générique
    137Processus tué par SIGKILL (souvent OOM, confirmez avec describe)
    143SIGTERM reçu (arrêt propre demandé)
  4. Appliquez la solution

    • Code 1 : Corrigez le bug applicatif (voir logs)
    • Code 137 + OOMKilled : Augmentez resources.limits.memory
    • Sortie immédiate (code 0) : Vérifiez la commande/entrypoint

Symptôme : Kubernetes ne peut pas télécharger l'image. Le Pod est correctement programmé sur un nœud, mais le kubelet échoue à récupérer l'image auprès du registry et réessaie avec un délai croissant. La cause exacte figure toujours dans le message de l'événement, il faut donc le lire en entier : un manifest unknown désigne un tag inexistant, un unauthorized un problème d'identifiants, un toomanyrequests un quota atteint.

Fenêtre de terminal
kubectl describe pod mon-pod | grep -A10 Events
kubectl get events --field-selector involvedObject.name=mon-pod
CauseSolution
Image inexistanteVérifiez le nom et le tag exact
Registry privéCréez un imagePullSecret et référencez-le
Quota Docker HubAuthentifiez-vous ou utilisez un registry privé
Erreur réseauVérifiez la connectivité du nœud vers le registry

Symptôme : Le Pod reste en Pending indéfiniment. Contrairement aux deux cas précédents, aucun conteneur n'a démarré : le Pod n'a pas encore de nœud, c'est l'ordonnanceur qui refuse de le placer. Le message de l'événement FailedScheduling indique combien de nœuds ont été évalués et pourquoi chacun a été écarté, sous la forme 0/3 nodes are available: .... Cette phrase contient à elle seule la réponse dans la grande majorité des cas.

Fenêtre de terminal
kubectl describe pod mon-pod | grep -A20 Events
kubectl get events -A --sort-by=.lastTimestamp | grep -i scheduling
CauseSolution
Insufficient cpu/memoryRéduisez les requests ou ajoutez des nœuds
No nodes match nodeSelectorVérifiez les labels des nœuds
Taints not toleratedAjoutez les tolerations nécessaires
PVC pendingVérifiez le PVC et le StorageClass

Symptôme : Conteneur tué pour surconsommation mémoire. C'est le noyau du nœud, et non Kubernetes, qui met fin au processus dès que le conteneur dépasse sa limits.memory. L'arrêt est immédiat et sans avertissement, l'application n'a aucune chance de se fermer proprement. Première conséquence pour le diagnostic : les journaux applicatifs ne diront rien, ils s'arrêtent net au milieu d'une opération.

Le plus rapide est de regarder la colonne STATUS, qui nomme la cause sans détour :

Fenêtre de terminal
kubectl get pod mon-pod
Sortie
NAME READY STATUS RESTARTS AGE
oom 0/1 OOMKilled 0 25s

Attention ensuite au champ que vous lisez dans describe. Beaucoup d'exemples cherchent dans Last State, qui ne se remplit qu'après un redémarrage : sur un Pod en restartPolicy: Never, il est vide et la commande ne renvoie rien du tout. La raison vit alors dans State :

Fenêtre de terminal
kubectl describe pod mon-pod | grep -A6 "State:"
Sortie
State: Terminated
Reason: OOMKilled
Exit Code: 137
Ready: False
Restart Count: 0

Le motif State: attrape les deux champs à la fois, puisque Last State se termine par le même mot. C'est la forme à retenir, plutôt que de choisir le bon champ à l'avance.

Fenêtre de terminal
# Voir la consommation actuelle
kubectl top pod mon-pod --containers

Solutions :

  1. Augmentez resources.limits.memory
  2. Analysez les fuites mémoire de l'application
  3. Ajoutez du monitoring pour détecter la tendance avant le crash

C'est un cas très fréquent : le Pod est Running, mais l'application ne répond pas.

Étape 1 : Vérifiez que le Pod répond directement

Section intitulée « Étape 1 : Vérifiez que le Pod répond directement »

Cette étape sert à couper le problème en deux. kubectl port-forward établit un tunnel direct vers le pod, en contournant totalement le Service, le kube-proxy et les éventuelles NetworkPolicies. Le verdict est donc net : si le pod répond ici, l'application va bien et le problème est dans la chaîne réseau ; s'il ne répond pas, inutile d'inspecter le Service.

Fenêtre de terminal
# Accès direct au Pod, contournant le Service
kubectl port-forward mon-pod 8080:80
# Dans un autre terminal
curl http://localhost:8080/health

Si le Pod répond : le problème vient du Service ou du réseau. Si le Pod ne répond pas : le problème est applicatif.

Fenêtre de terminal
# Voir le Service
kubectl get svc mon-service -o wide
# Les EndpointSlices, forme actuelle depuis que v1 Endpoints est déconseillé
kubectl get endpointslice -l kubernetes.io/service-name=mon-service

Deux résultats très différents demandent deux diagnostics différents, et c'est ici qu'on se trompe le plus souvent.

Aucune adresse listée ? Le selector du Service ne correspond à aucun Pod. C'est un problème de labels.

Des adresses listées, mais l'application reste injoignable ? Regardez la condition ready de chacune, car une adresse présente n'est pas une adresse servie. C'est alors un problème de readiness probe, pas de labels :

Fenêtre de terminal
kubectl get endpointslice -l kubernetes.io/service-name=mon-service \
-o jsonpath='{range .items[*].endpoints[*]}{.addresses[0]} ready={.conditions.ready}{"\n"}{end}'
Sortie
10.244.1.161 ready=true
10.244.1.162 ready=false

L'ancienne commande kubectl get endpoints masquait cette distinction : le Pod non prêt disparaissait simplement de sa liste, ce qui donnait l'illusion d'un problème de labels.

Pour le cas des labels, comparez les deux côtés :

Fenêtre de terminal
# Labels du Service (selector)
kubectl get svc mon-service -o jsonpath='{.spec.selector}'
# Labels des Pods
kubectl get pods --show-labels

Étape 3 : Testez la connectivité depuis un autre Pod

Section intitulée « Étape 3 : Testez la connectivité depuis un autre Pod »

Les deux premières étapes ont testé depuis votre poste, ce qui ne reproduit pas les conditions réelles : dans le cluster, la résolution DNS passe par CoreDNS et le trafic peut être filtré par des NetworkPolicies. Lancer un Pod jetable dans le même namespace place le test dans les mêmes conditions que l'application appelante. Commencez par nslookup : un nom de Service qui ne résout pas explique à lui seul l'échec de tout le reste.

Fenêtre de terminal
# Lancer un Pod de debug avec des outils réseau
kubectl run debug-net --rm -it --image=nicolaka/netshoot:v0.16@sha256:b09d9b21381f47a79b3cbcb30da25266dc17186ea00ae65e99fdc51396f48e70 -- /bin/bash
# Dans le Pod de debug
nslookup mon-service
curl -v http://mon-service:80/health
nc -zv mon-service 80

Quand kubectl exec échoue faute de shell (distroless, scratch), voici le workflow :

  1. Lancez un conteneur éphémère avec une image de debug

    Fenêtre de terminal
    kubectl debug mon-pod -it --image=nicolaka/netshoot:v0.16@sha256:b09d9b21381f47a79b3cbcb30da25266dc17186ea00ae65e99fdc51396f48e70 --target=app
  2. Explorez le conteneur cible

    Fenêtre de terminal
    # Processus
    ps aux
    # Variables d'environnement
    cat /proc/1/environ | tr '\0' '\n'
    # Fichiers ouverts
    ls -la /proc/1/fd/
  3. Testez le réseau

    Fenêtre de terminal
    # Résolution DNS
    nslookup kubernetes.default
    nslookup mon-service.mon-namespace.svc.cluster.local
    # Connectivité TCP
    nc -zv mon-service 80
    # Test HTTP
    curl -v http://mon-service:80/health
    # Ports en écoute dans le conteneur cible
    ss -tlnp
    # Routes réseau
    ip route
  4. Vérifiez les volumes montés

    Fenêtre de terminal
    mount | grep -v "cgroup\|proc\|sys"
    cat /etc/resolv.conf

Cette séquence reprend dans l'ordre les commandes des sections précédentes. Elle part du plus large pour resserrer progressivement, et chaque étape sert à décider si la suivante est utile. Dans la pratique, une panne sur trois se résout dès l'étape 2, à la lecture des Events : ne sautez pas directement à l'investigation interactive, elle coûte du temps et ne dit rien sur les problèmes d'orchestration.

  1. Vue globale

    Fenêtre de terminal
    kubectl get pods -A | grep -v Running
    kubectl get events -A --sort-by=.lastTimestamp | head -20
  2. Cibler le Pod problématique

    Fenêtre de terminal
    kubectl describe pod mon-pod
  3. Logs applicatifs

    Fenêtre de terminal
    kubectl logs mon-pod --tail=100
    # Si crash récent
    kubectl logs mon-pod --previous
  4. Investigation interactive

    Fenêtre de terminal
    # Si shell disponible
    kubectl exec -it mon-pod -- /bin/sh
    # Sinon
    kubectl debug mon-pod -it --image=nicolaka/netshoot:v0.16@sha256:b09d9b21381f47a79b3cbcb30da25266dc17186ea00ae65e99fdc51396f48e70 --target=app
  5. Vérification réseau/service

    Fenêtre de terminal
    kubectl port-forward mon-pod 8080:80
    kubectl get endpointslice -l kubernetes.io/service-name=mon-service
  6. Métriques

    Fenêtre de terminal
    kubectl top pod mon-pod --containers

Ces habitudes ne servent pas le jour où vous les prenez, mais celui de l'incident. Elles ont toutes le même effet : rendre le diagnostic possible sans accès au conteneur, ce qui est précisément la situation où l'on se trouve sur une image minimale ou un cluster de production verrouillé.

Ces cinq règles ne concernent pas le diagnostic lui-même, mais ce qui le rend possible. Une application qui écrit ses journaux dans un fichier interne au conteneur est invisible pour kubectl logs, et une application sans requests déclarées empêche l'ordonnanceur de raisonner. Les deux premières lignes sont celles qui changent le plus la vie en incident.

  1. Loguez vers stdout/stderr : Kubernetes capture automatiquement via le kubelet
  2. Implémentez des health endpoints, /health, /ready pour les probes
  3. Définissez des ressources : évite les OOMKilled silencieux et les Pending
  4. Utilisez des labels cohérents : facilite le filtrage (kubectl get pods -l app=api)
  5. Gérez SIGTERM proprement : arrêt gracieux pour les rolling updates

Ces quatre réflexes portent sur votre méthode plutôt que sur les commandes. Le plus rentable est le premier : les Events répondent souvent en une ligne à une question que les logs applicatifs ne peuvent pas trancher, parce qu'ils décrivent ce que Kubernetes a tenté, pas ce que l'application a fait. Retenez aussi que les Events ont une durée de vie limitée, une heure par défaut : au-delà, seule une centralisation des journaux conserve la trace.

  1. Commencez par get events : vue chronologique de ce qui s'est passé
  2. Utilisez -A / --all-namespaces : quand vous ne savez pas où est le problème
  3. Gardez une image de debug épinglée, nicolaka/netshoot:v0.16@sha256:b09d9b21381f47a79b3cbcb30da25266dc17186ea00ae65e99fdc51396f48e70 ou busybox:1.37@sha256:9db7b59979c38555a39def84a31fb98b5296952f9e3afd4f6f11f05b07adfab0 pour les cas difficiles
  4. Centralisez les logs : Loki, Elasticsearch, CloudWatch pour l'historique

L'examen CKAD est chronométré, ce qui change la méthode : pas le temps d'explorer, il faut une séquence déjà mémorisée. Les six réflexes ci-dessous sont réduits à leur forme la plus courte, sans options superflues. Entraînez-vous à les taper sans réfléchir : le temps gagné là se reporte sur les questions de configuration, qui rapportent davantage de points.

  1. Vue globale rapide

    Fenêtre de terminal
    kubectl get pods -A
    kubectl get events -A --sort-by=.lastTimestamp
  2. Diagnostic d'un Pod

    Fenêtre de terminal
    kubectl describe pod <pod>
    kubectl logs <pod> --previous
  3. Investigation interactive

    Fenêtre de terminal
    kubectl exec -it <pod> -- /bin/sh
  4. Test de connectivité

    Fenêtre de terminal
    kubectl port-forward <pod> 8080:80
  5. Debug avancé (images minimales)

    Fenêtre de terminal
    kubectl debug <pod> -it --image=busybox:1.37@sha256:9db7b59979c38555a39def84a31fb98b5296952f9e3afd4f6f11f05b07adfab0 --target=<container>
  6. Vérifier les endpoints d'un Service

    Fenêtre de terminal
    kubectl get endpointslice -l kubernetes.io/service-name=<service>
SituationCommande
Vue globale tous namespaceskubectl get pods -A
Événements chronologiqueskubectl get events --sort-by=.lastTimestamp
Détails d'un Podkubectl describe pod
Logs applicatifskubectl logs [--previous]
Shell interactifkubectl exec -it -- /bin/sh
Images minimaleskubectl debug --image=busybox:1.37@sha256:9db7b59979c38555a39def84a31fb98b5296952f9e3afd4f6f11f05b07adfab0 --target=app
Test direct Podkubectl port-forward pod 8080:80
Vérifier Servicekubectl get endpointslice -l kubernetes.io/service-name=<svc>
Métriques instantanéeskubectl top pods
Copier des fichierskubectl cp (nécessite tar dans le conteneur)

Le debugging Kubernetes suit toujours le même pattern : observer l'état global, lire les événements, analyser les logs, vérifier le réseau/service, investiguer interactivement si nécessaire.

Ce questionnaire porte sur les situations traitées dans le guide : lecture d'un état de Pod, choix de la commande adaptée à un symptôme, interprétation d'un code de sortie. Les questions sur --previous et sur la distinction entre describe et get events sont celles qui révèlent le mieux les points à relire.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

7 questions
5 min.
80% requis

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

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn