Aller au contenu
Conteneurs & Orchestration medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Observer la santé d'un cluster Kubernetes en 5 commandes

14 min de lecture

logo kubernetes

Cinq commandes kubectl suffisent pour savoir si un cluster Kubernetes est sain. Ce guide vous montre comment vérifier l’état des nœuds, détecter les pressions sur les ressources, lire la consommation CPU/mémoire et interpréter les événements système. Vous pourrez ainsi repérer un problème avant qu’il n’affecte vos applications.

  • Vérifier que tous les nœuds sont Ready et interpréter les conditions
  • Lire les ressources allouées vs capacité d’un nœud
  • Installer metrics-server pour activer kubectl top
  • Surveiller la consommation CPU/mémoire en temps réel
  • Analyser les événements pour repérer les anomalies
  • Un cluster Kubernetes fonctionnel (v1.28+)
  • kubectl configuré et connecté au cluster
  • Des droits de lecture sur les nœuds, pods, événements et métriques du cluster
  • Connaissances de base sur les Pods et les nœuds Kubernetes

Le kubelet (l’agent qui tourne sur chaque nœud) met à jour l’état du nœud et renouvelle régulièrement un objet Lease dans le namespace kube-node-lease. Si le plan de contrôle ne reçoit plus ces signaux, il peut marquer le nœud comme injoignable (Ready: Unknown) au bout d’environ 40 secondes par défaut, puis attendre 5 minutes avant de lancer la première éviction des pods du nœud.

Concrètement, le kubelet met à jour deux choses :

  • Le statut du nœud (.status.conditions) : plusieurs conditions qui signalent les pressions sur les ressources, notamment Ready, MemoryPressure, DiskPressure, PIDPressure et, selon le contexte, NetworkUnavailable
  • Un objet Lease dans kube-node-lease : un “je suis vivant” léger qui sert de heartbeat rapide

Quand une condition passe à True (sauf Ready qui doit rester True), le nœud signale un problème. Quand Ready passe à Unknown, le plan de contrôle a perdu le contact.

ConditionÉtat sainCe que cela indique si anormal
ReadyTrueFalse = kubelet ou nœud défaillant ; Unknown = nœud injoignable
MemoryPressureFalseMémoire disponible sous les seuils d’éviction
DiskPressureFalsePression sur nodefs, imagefs ou les inodes selon la config du kubelet
PIDPressureFalseManque de PID disponibles
NetworkUnavailableFalseRéseau du nœud non prêt selon le provider/CNI

La première commande à lancer est kubectl get nodes. Elle donne une vue d’ensemble rapide de tous les nœuds du cluster :

Fenêtre de terminal
kubectl get nodes

Résultat attendu — Tous les nœuds doivent afficher Ready dans la colonne STATUS :

NAME STATUS ROLES AGE VERSION
ks-cp1 Ready control-plane 41h v1.34.3
ks-worker1 Ready <none> 41h v1.34.3
ks-worker2 Ready <none> 41h v1.34.3

Pour obtenir plus de détails (IP, runtime, OS), ajoutez -o wide :

Fenêtre de terminal
kubectl get nodes -o wide
Status dans la sortieSignificationAction
ReadyLe nœud fonctionne normalementAucune
NotReadyLe kubelet ne répond pasVérifier le kubelet et le réseau du nœud
SchedulingDisabledLe nœud est en mode cordonNormal si maintenance planifiée

Pour comprendre pourquoi un nœud est dans un état donné, utilisez kubectl describe node :

Fenêtre de terminal
kubectl describe node ks-worker1

La section Conditions est la plus importante. Voici à quoi elle ressemble sur un nœud sain :

Conditions:
Type Status Reason Message
---- ------ ------ -------
NetworkUnavailable False CalicoIsUp Calico is running on this node
MemoryPressure False KubeletHasSufficientMemory kubelet has sufficient memory available
DiskPressure False KubeletHasNoDiskPressure kubelet has no disk pressure
PIDPressure False KubeletHasSufficientPID kubelet has sufficient PID available
Ready True KubeletReady kubelet is posting ready status

Comment lire ce tableau :

  • Ready: True = le kubelet fonctionne et accepte des pods
  • MemoryPressure: False = la mémoire est suffisante
  • DiskPressure: False = assez d’espace disque
  • PIDPressure: False = nombre de processus dans les limites

Plus bas dans la sortie de describe node, la section Allocated resources montre la consommation cumulée des pods sur ce nœud :

Allocated resources:
Resource Requests Limits
-------- -------- ------
cpu 455m (32%) 7 (500%)
memory 432730Ki (38%) 4501513472 (390%)

Les Requests représentent ce que les pods ont réservé. Les Limits sont le maximum qu’ils peuvent utiliser. Quand les Requests dépassent 80 % de la capacité, le nœud risque de ne plus pouvoir planifier de nouveaux pods.

Étape 3 : vérifier la santé du plan de contrôle

Section intitulée « Étape 3 : vérifier la santé du plan de contrôle »

Le plan de contrôle (API server, scheduler, controller-manager, etcd) est le cerveau du cluster. L’API server expose deux endpoints de santé dédiés.

Depuis Kubernetes v1.16, deux endpoints remplacent l’ancien /healthz :

  • /livez : le processus API server est-il vivant ?
  • /readyz : l’API server est-il prêt à servir des requêtes ?
Fenêtre de terminal
kubectl get --raw='/readyz?verbose' | head -20

Chaque ligne [+] confirme un sous-système fonctionnel :

[+]ping ok
[+]log ok
[+]etcd ok
[+]poststarthook/start-apiserver-admission-initializer ok
[+]poststarthook/generic-apiserver-start-informers ok
...

Si une ligne affiche [-], le sous-système correspondant est en échec.

Pour vérifier également la liveness :

Fenêtre de terminal
kubectl get --raw='/livez?verbose' | head -20

Pour voir concrètement si les composants du plan de contrôle tournent :

Fenêtre de terminal
kubectl get pods -n kube-system -o wide

Vérifiez que les pods etcd, kube-apiserver, kube-controller-manager et kube-scheduler sont en état Running avec RESTARTS à 0.

Étape 4 : surveiller la consommation avec metrics-server

Section intitulée « Étape 4 : surveiller la consommation avec metrics-server »

La commande kubectl top affiche la consommation CPU et mémoire en temps réel. Elle nécessite metrics-server, un composant qui collecte les métriques depuis chaque kubelet et alimente la Metrics API utilisée notamment par les autoscalers (HPA/VPA).

Déplier les étapes d’installation
  1. Téléchargez le manifeste officiel :

    Fenêtre de terminal
    kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
  2. Sur un cluster sans certificat TLS (comme un lab), ajoutez le flag --kubelet-insecure-tls :

    Fenêtre de terminal
    kubectl -n kube-system patch deployment metrics-server --type=json \
    -p='[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--kubelet-insecure-tls"}]'
  3. Attendez que metrics-server soit prêt :

    Fenêtre de terminal
    kubectl -n kube-system rollout status deployment/metrics-server --timeout=90s
  4. Vérifiez que l’API Metrics est disponible :

    Fenêtre de terminal
    kubectl get apiservices | grep metrics

    Résultat attendu :

    v1beta1.metrics.k8s.io kube-system/metrics-server True 59s

Une fois metrics-server installé, la commande kubectl top nodes affiche la consommation réelle :

Fenêtre de terminal
kubectl top nodes
NAME CPU(cores) CPU(%) MEMORY(bytes) MEMORY(%)
ks-cp1 131m 9% 1129Mi 102%
ks-worker1 72m 5% 833Mi 75%
ks-worker2 74m 5% 935Mi 85%

Comment interpréter :

  • CPU(cores) : consommation instantanée en millicores (1000m = 1 CPU)
  • CPU% : pourcentage par rapport à la capacité allocatable
  • MEMORY(bytes) : mémoire réellement utilisée (working set)
  • MEMORY% : pourcentage de la mémoire allocatable
Fenêtre de terminal
kubectl top pods -A --sort-by=cpu | head -15

Cette commande trie tous les pods par consommation CPU décroissante. Très utile pour identifier rapidement un pod qui consomme trop.

Pour un namespace spécifique :

Fenêtre de terminal
kubectl top pods -n kube-system

Les événements Kubernetes enregistrent ce qui se passe dans le cluster : créations, erreurs de scheduling, redémarrages, évictions. C’est la boîte noire du cluster.

Depuis Kubernetes v1.26, la sous-commande kubectl events offre un affichage plus lisible avec des options de filtrage natives. Pour voir les warnings récents :

Fenêtre de terminal
kubectl events -A --types=Warning

La commande classique kubectl get events reste disponible pour des filtrages plus fins via --field-selector :

Fenêtre de terminal
kubectl get events -A --sort-by=.metadata.creationTimestamp | tail -20
Type eventExemplesSignification
NormalPulling, Created, StartedOpérations normales du kubelet
WarningFailedScheduling, BackOff, UnhealthyQuelque chose ne fonctionne pas
ÉvénementCause probableAction
FailedSchedulingPas assez de ressources sur les nœudsVérifier kubectl describe node, libérer des ressources
BackOff / CrashLoopBackOffLe conteneur plante en boucleVérifier les logs : kubectl logs <pod>
FailedMountVolume non disponibleVérifier le PVC et le StorageClass
UnhealthyLa probe a échouéVérifier la configuration des probes
EvictedNœud sous pression (mémoire/disque)Vérifier les conditions du nœud
#CommandeCe qu’elle vérifie
1kubectl get nodesTous les nœuds sont Ready
2kubectl describe node <nom>Conditions détaillées et ressources allouées
3kubectl get --raw='/readyz?verbose'Santé du plan de contrôle
4kubectl top nodes / kubectl top podsConsommation CPU/mémoire en temps réel
5kubectl events -A --types=WarningAnomalies récentes dans le cluster
SymptômeCause probableSolution
Nœud NotReadyKubelet arrêté ou réseau coupéSe connecter au nœud, vérifier systemctl status kubelet
MemoryPressure: TrueMémoire insuffisanteIdentifier les pods gourmands avec kubectl top pods, augmenter la mémoire ou réduire les loads
DiskPressure: TrueDisque plein (images, logs)Nettoyer les images inutilisées : crictl rmi --prune
kubectl top renvoie “Metrics API not available”metrics-server absentInstaller metrics-server (voir étape 4)
/readyz affiche [-]etcdetcd indisponibleVérifier l’état du pod etcd : kubectl logs -n kube-system etcd-<nom>
Beaucoup d’événements EvictedNœud sous pression prolongéeAjouter des nœuds ou réduire la charge de travail
  • kubectl get nodes est votre premier réflexe : tous les nœuds doivent être Ready
  • Les 5 conditions d’un nœud (Ready, MemoryPressure, DiskPressure, PIDPressure, NetworkUnavailable) résument sa santé
  • kubectl describe node révèle les ressources allouées vs la capacité — surveillez le ratio Requests/Allocatable
  • metrics-server est indispensable pour kubectl top — il n’est pas installé par défaut sur tous les clusters
  • Les événements Warning sont votre système d’alerte natif : consultez-les régulièrement
  • Ces commandes donnent un instantané — pour du monitoring continu, déployez Prometheus + Grafana

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn