Aller au contenu
Conteneurs & Orchestration medium

Fonctionnement des Worker Nodes Kubernetes

14 min de lecture

Les Worker Nodes sont les machines qui exécutent vos applications conteneurisées dans un cluster Kubernetes. Ce guide vous explique comment fonctionnent leurs trois composants essentiels — kubelet, kube-proxy et le container runtime — et comment les administrer au quotidien.

Ce que vous apprendrez :

  • Le rôle de chaque composant et leurs interactions
  • Comment le kubelet communique avec l’API Server (modèle pull)
  • L’interface CRI qui standardise l’exécution des conteneurs
  • Les commandes pour surveiller, drainer et dépanner vos nœuds

Un Worker Node est une machine (physique ou virtuelle) où s’exécutent les Pods. Chaque nœud contient trois composants qui collaborent pour faire tourner vos applications :

Architecture d'un Worker Node avec ses composants

ComposantRôleCommunique avec
kubeletAgent principal, gère les PodsAPI Server (pull), CRI
kube-proxyGère les règles réseau pour les ServicesAPI Server (watch Endpoints)
Container RuntimeExécute les conteneurskubelet via CRI

Le kubelet est le composant le plus important d’un Worker Node. C’est lui qui transforme les spécifications de Pods reçues de l’API Server en conteneurs réellement exécutés sur la machine.

  1. Watch l’API Server pour les Pods assignés à son Node
  2. Crée/supprime les conteneurs via le runtime (CRI)
  3. Surveille la santé des conteneurs (probes)
  4. Reporte l’état du Node et des Pods à l’API Server

Le kubelet utilise le modèle pull : il établit une connexion persistante avec l’API Server et watch les changements concernant son Node.

Fenêtre de terminal
# Le kubelet watch les Pods pour son Node
GET /api/v1/pods?fieldSelector=spec.nodeName=worker-1&watch=true

Le kubelet envoie régulièrement un heartbeat à l’API Server pour signaler que le Node est vivant. Ce heartbeat contient :

  • L’état du Node (Ready, NotReady, Unknown)
  • Les ressources disponibles (CPU, mémoire, disque)
  • Les conditions (DiskPressure, MemoryPressure, PIDPressure)
Fenêtre de terminal
# Fréquence par défaut : toutes les 10 secondes
--node-status-update-frequency=10s

Le kubelet exécute trois types de probes pour surveiller les conteneurs :

ProbeObjectifAction si échec
livenessProbeLe conteneur est-il vivant ?Redémarre le conteneur
readinessProbeLe conteneur peut-il recevoir du trafic ?Retire des Endpoints
startupProbeLe conteneur a-t-il démarré ?Bloque liveness/readiness
livenessProbe:
httpGet:
path: /healthz
port: 8080
periodSeconds: 10
failureThreshold: 3 # Après 3 échecs → redémarrage

Le kubelet peut aussi créer des Static Pods à partir de manifests locaux, sans passer par l’API Server :

Fenêtre de terminal
# Chemin par défaut des manifests statiques
/etc/kubernetes/manifests/
# Exemple : pod.yaml dans ce dossier sera créé automatiquement

Le CRI (Container Runtime Interface) est l’interface standardisée entre le kubelet et le runtime de conteneurs. Introduite dans Kubernetes 1.5, elle permet de changer de runtime sans modifier le kubelet.

Flux kubelet → CRI → containerd → conteneur

  1. L’API Server notifie le kubelet qu’un Pod doit tourner sur ce Node

  2. Le kubelet appelle le runtime via CRI (gRPC) pour :

    • Télécharger l’image (si absente)
    • Créer le conteneur
    • Démarrer le conteneur
  3. Le runtime (containerd) délègue au shim qui appelle runc

  4. runc crée le conteneur avec les namespaces et cgroups Linux

RuntimeDescriptionDéfaut depuis
containerdLéger, production-ready, projet CNCFK8s 1.24+
CRI-OConçu spécifiquement pour KubernetesAlternative
Docker + cri-dockerdDocker via un shim CRI (déprécié)Avant K8s 1.24

Le kubelet respecte la politique imagePullPolicy pour décider quand télécharger les images :

PolicyComportement
IfNotPresentPull si l’image n’existe pas localement (défaut)
AlwaysPull à chaque création de conteneur (défaut pour :latest)
NeverNe pull jamais, utilise uniquement le cache local
containers:
- name: app
image: nginx:1.25
imagePullPolicy: IfNotPresent # Défaut si tag présent

L’outil crictl permet d’interagir directement avec le runtime CRI :

Fenêtre de terminal
# Lister les conteneurs
crictl ps
# Lister les images
crictl images
# Logs d'un conteneur
crictl logs <container-id>
# Exécuter une commande dans un conteneur
crictl exec -it <container-id> sh

kube-proxy gère les règles réseau qui permettent aux Services de fonctionner. Il s’exécute sur chaque Node du cluster (en tant que DaemonSet).

  1. Watch les Services et Endpoints via l’API Server
  2. Configure les règles réseau pour router le trafic vers les bons Pods
  3. Load balance le trafic entre les Pods d’un même Service

Mode par défaut depuis longtemps. Configure les règles dans la table NAT du noyau Linux.

Avantages :

  • Simple et mature
  • Compatible avec tous les systèmes Linux
  • Fonctionne bien avec les CNI (Calico, Flannel)

Inconvénients :

  • Performance linéaire O(n) avec le nombre de Services
  • Peut devenir lent avec des milliers de Services
Fenêtre de terminal
# Voir les règles iptables créées par kube-proxy
iptables -t nat -L KUBE-SERVICES -n

kube-proxy s’exécute comme un DaemonSet : un Pod sur chaque Node du cluster. Cela garantit que tous les Nodes peuvent router le trafic vers les Services.

Fenêtre de terminal
# Voir le DaemonSet kube-proxy
kubectl get ds -n kube-system kube-proxy
# Voir les Pods kube-proxy sur tous les nœuds
kubectl get pods -n kube-system -l k8s-app=kube-proxy -o wide
  1. Sur le Control Plane, générez un token d’enregistrement :

    Fenêtre de terminal
    kubeadm token create --print-join-command
  2. Sur le nouveau Node, exécutez la commande affichée :

    Fenêtre de terminal
    kubeadm join <control-plane>:6443 --token <token> \
    --discovery-token-ca-cert-hash sha256:<hash>
  3. Vérifiez que le Node est Ready :

    Fenêtre de terminal
    kubectl get nodes
Fenêtre de terminal
# État général des nœuds
kubectl get nodes
# Détails d'un nœud (conditions, ressources, Pods)
kubectl describe node <nom-du-node>
# Pods sur un nœud spécifique
kubectl get pods --all-namespaces --field-selector spec.nodeName=<nom-du-node>
# Événements liés au nœud
kubectl get events --field-selector involvedObject.kind=Node,involvedObject.name=<nom-du-node>
Fenêtre de terminal
# État du service kubelet
systemctl status kubelet
# Logs en temps réel
journalctl -u kubelet -f
# Configuration du kubelet
cat /var/lib/kubelet/config.yaml
Fenêtre de terminal
# Avec crictl (containerd, CRI-O)
crictl ps # Conteneurs en cours
crictl images # Images disponibles
# État du service containerd
systemctl status containerd
  1. Cordon : empêcher la planification de nouveaux Pods

    Fenêtre de terminal
    kubectl cordon <nom-du-node>
  2. Drain : évacuer les Pods existants vers d’autres Nodes

    Fenêtre de terminal
    kubectl drain <nom-du-node> --ignore-daemonsets --delete-emptydir-data
  3. Effectuer la maintenance (mise à jour, reboot, etc.)

  4. Uncordon : réactiver la planification

    Fenêtre de terminal
    kubectl uncordon <nom-du-node>
Fenêtre de terminal
# 1. Évacuer les Pods
kubectl drain <nom-du-node> --ignore-daemonsets --delete-emptydir-data
# 2. Supprimer le Node de l'API
kubectl delete node <nom-du-node>
# 3. Sur le Node, réinitialiser kubeadm (optionnel)
kubeadm reset
SymptômeCause probableSolution
Node NotReadykubelet arrêté ou crashsystemctl restart kubelet
Node NotReady + DiskPressureDisque pleinNettoyer /var/lib/containerd/
Pods en PendingPas de Node avec ressources suffisantesAjouter un Node ou libérer des ressources
Pods en ImagePullBackOffImage introuvable ou registry inaccessibleVérifier le nom de l’image et les credentials
Pods en CrashLoopBackOffConteneur qui crashe au démarragekubectl logs <pod> pour voir l’erreur
Fenêtre de terminal
# Diagnostic rapide d'un Node NotReady
kubectl describe node <nom-du-node> | grep -A5 Conditions
# Vérifier les logs kubelet
journalctl -u kubelet --since "10 minutes ago" | grep -i error

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
5 min.
70% 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

  • Le kubelet est l’agent principal qui gère les Pods sur chaque Node
  • Le kubelet communique avec l’API Server via le modèle pull (watch)
  • Le CRI standardise la communication kubelet ↔ runtime de conteneurs
  • containerd est le runtime par défaut depuis Kubernetes 1.24
  • Le kube-proxy gère le routage réseau des Services (iptables ou IPVS)
  • kube-proxy s’exécute en DaemonSet sur tous les Nodes
  • Un Node NotReady signifie que le kubelet n’envoie plus de heartbeat
  • Utilisez cordondrain → maintenance → uncordon pour la maintenance

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.