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

Gérer les nœuds d'un cluster Kubernetes au quotidien

12 min de lecture

logo kubernetes

Pour administrer un cluster Kubernetes, vous devez savoir lister, inspecter, labéliser et tainter vos nœuds. Ce guide couvre les opérations courantes : vérifier leur état, organiser votre flotte avec des labels, utiliser les labels de rôle pour la lisibilité, contrôler le placement des Pods avec des taints, et remplacer un nœud défaillant proprement.

  • Lister et inspecter les nœuds d’un cluster avec kubectl
  • Attribuer des labels pour organiser vos nœuds (environnement, zone, type de charge)
  • Utiliser les labels de rôle node-role.kubernetes.io/ pour la lisibilité
  • Appliquer des taints pour contrôler quels pods peuvent tourner sur un nœud
  • Remplacer un nœud défaillant avec le workflow complet

Un nœud est une machine (physique ou virtuelle) qui exécute des pods. Chaque nœud fait tourner un kubelet (l’agent Kubernetes) et un container runtime (containerd, CRI-O). Le kubelet s’enregistre automatiquement auprès du plan de contrôle au démarrage, puis envoie régulièrement un heartbeat pour signaler qu’il est disponible.

Le plan de contrôle maintient un objet Node pour chaque machine. Cet objet contient :

InformationCe qu’elle décrit
ConditionsÉtat du nœud : Ready, MemoryPressure, DiskPressure, PIDPressure
Capacity / AllocatableRessources totales vs ressources disponibles pour les pods
LabelsMétadonnées clé-valeur pour organiser et cibler les nœuds
TaintsRestrictions qui repoussent certains pods
AnnotationsMétadonnées internes (utilisées par les contrôleurs, le CNI, etc.)
Fenêtre de terminal
kubectl get nodes
NAME STATUS ROLES AGE VERSION
ks-cp1 Ready control-plane 42h v1.34.3
ks-worker1 Ready <none> 42h v1.34.3
ks-worker2 Ready <none> 42h v1.34.3

La colonne ROLES affiche le contenu du label node-role.kubernetes.io/. Il est courant que seuls les nœuds de control plane aient un rôle explicite, tandis que des workers apparaissent avec ROLES=<none> selon l’outil de déploiement utilisé.

L’option -o wide ajoute l’IP interne, l’OS, le container runtime et l’architecture :

Fenêtre de terminal
kubectl get nodes -o wide
Fenêtre de terminal
kubectl describe node ks-worker1

Cette commande affiche :

  • Les conditions du nœud (Ready, pressures)
  • Les labels et annotations
  • Les taints actifs
  • La capacité et les ressources allouées
  • La liste des pods qui tournent sur ce nœud
  • Les événements récents
Fenêtre de terminal
kubectl get nodes --show-labels

La sortie peut être très longue. Pour filtrer sur un label particulier :

Fenêtre de terminal
kubectl get nodes -l node-role.kubernetes.io/control-plane

Les labels sont des paires clé-valeur attachées aux objets Kubernetes. Sur les nœuds, ils servent à organiser votre flotte et à contrôler le placement des pods via les nodeSelectors et l’affinité de nœud.

Fenêtre de terminal
kubectl label node ks-worker1 env=production

Vérification :

Fenêtre de terminal
kubectl get node ks-worker1 --show-labels | grep env=

Ajoutez --overwrite pour changer la valeur d’un label déjà présent :

Fenêtre de terminal
kubectl label node ks-worker1 env=staging --overwrite

Ajoutez un - après le nom du label :

Fenêtre de terminal
kubectl label node ks-worker1 env-
LabelExempleUsage
envproduction, stagingSéparer les charges par environnement
disktypessd, hddPlacer les pods gourmands en I/O sur SSD
zoneeu-west-1a, rack-3Répartir les réplicas sur plusieurs zones
teambackend, dataIsoler les workloads par équipe

Une fois le label posé, ajoutez un nodeSelector dans votre pod ou deployment pour cibler ce nœud :

spec:
nodeSelector:
env: production

Pour des règles de placement plus fines (préférence plutôt qu’obligation), consultez le guide Affinité, taints et tolerations.

La colonne ROLES de kubectl get nodes reflète les labels node-role.kubernetes.io/.... Ces labels améliorent la lisibilité et peuvent être utilisés par vos conventions et vos outils, mais ne constituent pas à eux seuls un mécanisme de placement ou de sécurité.

Fenêtre de terminal
kubectl label node ks-worker1 node-role.kubernetes.io/worker=

La valeur est vide par convention — seul le nom du label compte.

Vérification :

Fenêtre de terminal
kubectl get nodes
NAME STATUS ROLES AGE VERSION
ks-cp1 Ready control-plane 42h v1.34.3
ks-worker1 Ready worker 42h v1.34.3
ks-worker2 Ready <none> 42h v1.34.3

Un nœud peut avoir plusieurs rôles. Ajoutez simplement un deuxième label :

Fenêtre de terminal
kubectl label node ks-worker1 node-role.kubernetes.io/monitoring=

Le nœud affichera worker,monitoring dans la colonne ROLES.

Fenêtre de terminal
kubectl label node ks-worker1 node-role.kubernetes.io/worker-

Un taint est une restriction placée sur un nœud qui repousse les pods. Seuls les pods qui déclarent une toleration correspondante peuvent être planifiés sur un nœud tainté.

EffetComportement
NoScheduleEmpêche les nouveaux pods (sans toleration) d’être planifiés sur le nœud. Les pods déjà présents ne sont pas affectés.
PreferNoScheduleLe scheduler évite ce nœud mais peut y placer un pod s’il n’y a pas d’alternative.
NoExecuteEmpêche le scheduling et évince les pods existants qui n’ont pas la toleration.
Fenêtre de terminal
kubectl taint nodes ks-worker1 maintenance=planned:NoSchedule

Cela signifie : “ne planifie aucun nouveau pod sur ks-worker1, sauf s’il tolère le taint maintenance=planned”.

Vérification :

Fenêtre de terminal
kubectl describe node ks-worker1 | grep -A 5 Taints

Ajoutez un - à la fin :

Fenêtre de terminal
kubectl taint nodes ks-worker1 maintenance=planned:NoSchedule-

Par défaut, les nœuds control-plane ont le taint node-role.kubernetes.io/control-plane:NoSchedule. Ce taint empêche les pods applicatifs d’être planifiés sur le plan de contrôle.

Fenêtre de terminal
kubectl describe node ks-cp1 | grep Taints
Taints: node-role.kubernetes.io/control-plane:NoSchedule

Kubernetes ajoute automatiquement certains taints liés à l’état du nœud : node.kubernetes.io/not-ready, node.kubernetes.io/unreachable, node.kubernetes.io/memory-pressure, node.kubernetes.io/disk-pressure, node.kubernetes.io/pid-pressure et node.kubernetes.io/unschedulable. Leur effet exact sur le scheduling et l’éviction dépend du type de taint et des tolerations présentes sur les Pods.

Quand un nœud doit être remplacé (panne matérielle, fin de vie, migration), suivez ce workflow en 4 étapes. Il reprend le workflow de maintenance détaillé dans le guide Préparer une maintenance.

  1. Drainer le nœud : évacuez tous les pods vers d’autres nœuds.

    Fenêtre de terminal
    kubectl drain ks-worker1 --ignore-daemonsets --delete-emptydir-data

    Le drain commence par un cordon automatique, puis évince les pods en respectant les PodDisruptionBudgets.

  2. Vérifier que les pods sont repositionnés :

    Fenêtre de terminal
    kubectl get pods -A -o wide | grep ks-worker1

    Seuls les pods de DaemonSets doivent rester sur le nœud.

  3. Supprimer l’objet Node :

    Fenêtre de terminal
    kubectl delete node ks-worker1

    Le nœud disparaît de kubectl get nodes. Si la machine d’origine revient en ligne avec le même kubelet et la même identité, elle peut se réenregistrer. Si vous remplacez réellement l’instance, évitez de réutiliser le même nom sans maîtriser les implications : Kubernetes suppose qu’un nœud de même nom représente le même objet logique.

  4. Ajouter le nouveau nœud : installez le kubelet et le container runtime sur la nouvelle machine. Le kubelet s’enregistre automatiquement auprès du plan de contrôle. Vérifiez :

    Fenêtre de terminal
    kubectl get nodes

    Le nouveau nœud apparaît avec le statut Ready après quelques secondes. Réappliquez vos labels et rôles si nécessaire.

Les annotations de nœud servent surtout aux composants du cluster et aux outils d’administration. En pratique, pour l’exploitation quotidienne, concentrez-vous d’abord sur les conditions, labels et taints.

Vous pouvez ajouter vos propres annotations pour stocker des métadonnées opérationnelles :

Fenêtre de terminal
kubectl annotate node ks-worker1 maintenance-contact="ops@example.com"

Certaines annotations historiques que vous pouvez voir sur un nœud (comme kubeadm.alpha.kubernetes.io/cri-socket ou node.alpha.kubernetes.io/ttl) sont d’ailleurs dépréciées et ne doivent pas être utilisées comme référence.

SymptômeCause probableSolution
Nœud NotReady après ajoutkubelet ne démarre pas ou ne contacte pas l’API serverVérifier les logs kubelet : journalctl -u kubelet -f
Nœud sans rôle (<none>)Label node-role.kubernetes.io/ absentkubectl label node <nom> node-role.kubernetes.io/worker=
Pod non planifié malgré les resources dispoTaint actif sans toleration correspondantekubectl describe node <nom> | grep Taints pour identifier le taint
Drain bloquéPDB empêche l’éviction ou pod sans contrôleurVérifier les PDB (kubectl get pdb -A) ; ajouter --force si nécessaire
Labels disparus après redémarrageLabels posés en CLI mais pas dans la config kubeletConfigurer --node-labels dans le kubelet ou l’outil de provisioning
kubectl cordon ne suffit pasLes pods existants restent sur le nœudcordon bloque uniquement le scheduling. Pour évacuer, utilisez drain.
  • kubectl get nodes -o wide donne une vue rapide de tous les nœuds avec IP, OS et runtime.
  • Les labels organisent votre flotte : environnement, zone, type de disque. Les pods les ciblent via nodeSelector ou l’affinité.
  • Les labels de rôle (node-role.kubernetes.io/<role>=) améliorent la lisibilité du cluster, mais ne constituent pas un mécanisme de placement ou de sécurité à eux seuls.
  • Les taints repoussent les pods. Trois effets : NoSchedule (bloque le nouveau scheduling), PreferNoSchedule (évite si possible), NoExecute (évince les pods existants).
  • Pour remplacer un nœud : draindelete node → provisionner la nouvelle machine → vérifier l’enregistrement.
  • Kubernetes ajoute des taints automatiques liés à l’état du nœud. Leur effet sur le scheduling et l’éviction dépend du type de taint et des tolerations présentes.
  • Automatisez les labels personnalisés via la configuration du kubelet ou votre outil de provisioning. Pour les labels critiques, appliquez une convention claire.

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