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
Vue d’ensemble d’un Worker Node
Section intitulée « Vue d’ensemble d’un Worker Node »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 :
| Composant | Rôle | Communique avec |
|---|---|---|
| kubelet | Agent principal, gère les Pods | API Server (pull), CRI |
| kube-proxy | Gère les règles réseau pour les Services | API Server (watch Endpoints) |
| Container Runtime | Exécute les conteneurs | kubelet via CRI |
Le kubelet : l’agent principal
Section intitulée « Le kubelet : l’agent principal »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.
Ce que fait le kubelet
Section intitulée « Ce que fait le kubelet »- Watch l’API Server pour les Pods assignés à son Node
- Crée/supprime les conteneurs via le runtime (CRI)
- Surveille la santé des conteneurs (probes)
- Reporte l’état du Node et des Pods à l’API Server
Communication avec l’API Server
Section intitulée « Communication avec 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.
# Le kubelet watch les Pods pour son NodeGET /api/v1/pods?fieldSelector=spec.nodeName=worker-1&watch=trueLe heartbeat : signaler l’état du Node
Section intitulée « Le heartbeat : signaler l’état du Node »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)
# Fréquence par défaut : toutes les 10 secondes--node-status-update-frequency=10sLes probes : surveiller la santé des conteneurs
Section intitulée « Les probes : surveiller la santé des conteneurs »Le kubelet exécute trois types de probes pour surveiller les conteneurs :
| Probe | Objectif | Action si échec |
|---|---|---|
| livenessProbe | Le conteneur est-il vivant ? | Redémarre le conteneur |
| readinessProbe | Le conteneur peut-il recevoir du trafic ? | Retire des Endpoints |
| startupProbe | Le conteneur a-t-il démarré ? | Bloque liveness/readiness |
livenessProbe: httpGet: path: /healthz port: 8080 periodSeconds: 10 failureThreshold: 3 # Après 3 échecs → redémarrageStatic Pods : Pods locaux sans API Server
Section intitulée « Static Pods : Pods locaux sans API Server »Le kubelet peut aussi créer des Static Pods à partir de manifests locaux, sans passer par l’API Server :
# Chemin par défaut des manifests statiques/etc/kubernetes/manifests/
# Exemple : pod.yaml dans ce dossier sera créé automatiquementLe CRI : Container Runtime Interface
Section intitulée « Le CRI : Container Runtime Interface »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 d’exécution d’un conteneur
Section intitulée « Flux d’exécution d’un conteneur »-
L’API Server notifie le kubelet qu’un Pod doit tourner sur ce Node
-
Le kubelet appelle le runtime via CRI (gRPC) pour :
- Télécharger l’image (si absente)
- Créer le conteneur
- Démarrer le conteneur
-
Le runtime (containerd) délègue au shim qui appelle runc
Runtimes compatibles CRI
Section intitulée « Runtimes compatibles CRI »| Runtime | Description | Défaut depuis |
|---|---|---|
| containerd | Léger, production-ready, projet CNCF | K8s 1.24+ |
| CRI-O | Conçu spécifiquement pour Kubernetes | Alternative |
| Docker + cri-dockerd | Docker via un shim CRI (déprécié) | Avant K8s 1.24 |
imagePullPolicy : quand télécharger les images
Section intitulée « imagePullPolicy : quand télécharger les images »Le kubelet respecte la politique imagePullPolicy pour décider quand
télécharger les images :
| Policy | Comportement |
|---|---|
| IfNotPresent | Pull si l’image n’existe pas localement (défaut) |
| Always | Pull à chaque création de conteneur (défaut pour :latest) |
| Never | Ne pull jamais, utilise uniquement le cache local |
containers:- name: app image: nginx:1.25 imagePullPolicy: IfNotPresent # Défaut si tag présentDéboguer avec crictl
Section intitulée « Déboguer avec crictl »L’outil crictl permet d’interagir directement avec le runtime CRI :
# Lister les conteneurscrictl ps
# Lister les imagescrictl images
# Logs d'un conteneurcrictl logs <container-id>
# Exécuter une commande dans un conteneurcrictl exec -it <container-id> shkube-proxy : le gestionnaire réseau
Section intitulée « kube-proxy : le gestionnaire réseau »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).
Ce que fait kube-proxy
Section intitulée « Ce que fait kube-proxy »- Watch les Services et Endpoints via l’API Server
- Configure les règles réseau pour router le trafic vers les bons Pods
- Load balance le trafic entre les Pods d’un même Service
Modes de fonctionnement
Section intitulée « Modes de fonctionnement »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
# Voir les règles iptables créées par kube-proxyiptables -t nat -L KUBE-SERVICES -nMode optimisé utilisant le module IP Virtual Server du noyau Linux.
Avantages :
- Performance constante O(1) avec hash tables
- Supporte plus d’algorithmes de load balancing
- Idéal pour les grands clusters (> 1000 Services)
Inconvénients :
- Nécessite les modules IPVS installés
- Légèrement plus complexe à déboguer
# Voir les règles IPVSipvsadm -Lnkube-proxy en DaemonSet
Section intitulée « kube-proxy en DaemonSet »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.
# Voir le DaemonSet kube-proxykubectl get ds -n kube-system kube-proxy
# Voir les Pods kube-proxy sur tous les nœudskubectl get pods -n kube-system -l k8s-app=kube-proxy -o wideAdministration des Worker Nodes
Section intitulée « Administration des Worker Nodes »Ajouter un Node au cluster
Section intitulée « Ajouter un Node au cluster »-
Sur le Control Plane, générez un token d’enregistrement :
Fenêtre de terminal kubeadm token create --print-join-command -
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> -
Vérifiez que le Node est Ready :
Fenêtre de terminal kubectl get nodes
Surveiller un Node
Section intitulée « Surveiller un Node »# État général des nœudskubectl get nodes
# Détails d'un nœud (conditions, ressources, Pods)kubectl describe node <nom-du-node>
# Pods sur un nœud spécifiquekubectl get pods --all-namespaces --field-selector spec.nodeName=<nom-du-node>
# Événements liés au nœudkubectl get events --field-selector involvedObject.kind=Node,involvedObject.name=<nom-du-node>Surveiller le kubelet
Section intitulée « Surveiller le kubelet »# État du service kubeletsystemctl status kubelet
# Logs en temps réeljournalctl -u kubelet -f
# Configuration du kubeletcat /var/lib/kubelet/config.yamlSurveiller le runtime
Section intitulée « Surveiller le runtime »# Avec crictl (containerd, CRI-O)crictl ps # Conteneurs en courscrictl images # Images disponibles
# État du service containerdsystemctl status containerdMaintenance d’un Node
Section intitulée « Maintenance d’un Node »-
Cordon : empêcher la planification de nouveaux Pods
Fenêtre de terminal kubectl cordon <nom-du-node> -
Drain : évacuer les Pods existants vers d’autres Nodes
Fenêtre de terminal kubectl drain <nom-du-node> --ignore-daemonsets --delete-emptydir-data -
Effectuer la maintenance (mise à jour, reboot, etc.)
-
Uncordon : réactiver la planification
Fenêtre de terminal kubectl uncordon <nom-du-node>
Supprimer un Node du cluster
Section intitulée « Supprimer un Node du cluster »# 1. Évacuer les Podskubectl drain <nom-du-node> --ignore-daemonsets --delete-emptydir-data
# 2. Supprimer le Node de l'APIkubectl delete node <nom-du-node>
# 3. Sur le Node, réinitialiser kubeadm (optionnel)kubeadm resetDépannage des Worker Nodes
Section intitulée « Dépannage des Worker Nodes »| Symptôme | Cause probable | Solution |
|---|---|---|
| Node NotReady | kubelet arrêté ou crash | systemctl restart kubelet |
| Node NotReady + DiskPressure | Disque plein | Nettoyer /var/lib/containerd/ |
| Pods en Pending | Pas de Node avec ressources suffisantes | Ajouter un Node ou libérer des ressources |
| Pods en ImagePullBackOff | Image introuvable ou registry inaccessible | Vérifier le nom de l’image et les credentials |
| Pods en CrashLoopBackOff | Conteneur qui crashe au démarrage | kubectl logs <pod> pour voir l’erreur |
# Diagnostic rapide d'un Node NotReadykubectl describe node <nom-du-node> | grep -A5 Conditions
# Vérifier les logs kubeletjournalctl -u kubelet --since "10 minutes ago" | grep -i errorContrô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 »- 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
cordon→drain→ maintenance →uncordonpour la maintenance