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

DaemonSets Kubernetes : garantir un Pod sur chaque nœud éligible

16 min de lecture

logo Kubernetes

Un DaemonSet garantit qu’un Pod s’exécute sur chaque nœud éligible de votre cluster Kubernetes. Contrairement à un Deployment qui répartit un nombre variable de répliques, le DaemonSet assure exactement un Pod par nœud correspondant aux critères de sélection.

Ce guide couvre la création, le ciblage de nœuds spécifiques avec nodeSelector et tolerations, les stratégies de mise à jour, et le dépannage — tout ce qu’il faut pour la certification CKAD.

  • Créer un DaemonSet et observer son déploiement automatique sur tous les nœuds
  • Cibler des nœuds spécifiques avec nodeSelector et affinity
  • Gérer les nœuds taintés avec tolerations (control-plane, GPU, etc.)
  • Mettre à jour un DaemonSet avec les stratégies RollingUpdate et OnDelete
  • Diagnostiquer pourquoi un Pod ne s’exécute pas sur un nœud

Un DaemonSet est un contrôleur Kubernetes qui garantit qu’un Pod spécifique tourne sur tous les nœuds éligibles d’un cluster, ou sur un sous-ensemble défini par des règles de sélection.

Un DaemonSet ne garantit pas un Pod sur absolument tous les nœuds sans nuance. Il garantit un Pod sur tous les nœuds qui correspondent à :

  • nodeSelector : labels requis sur le nœud
  • affinity : règles d’affinité plus avancées
  • tolerations : tolérance aux taints du nœud
  • Contraintes de ressources : CPU/mémoire disponibles

Si un nœud ne satisfait pas ces critères, aucun Pod du DaemonSet n’y sera schedulé.

ÉvénementAction du DaemonSet
Nouveau nœud rejoint le clusterUn Pod est automatiquement créé sur ce nœud
Nœud supprimé du clusterLe Pod correspondant est automatiquement supprimé
Nœud devient inéligible (nouveau taint)Le Pod est évicté si pas de toleration

Les DaemonSets sont essentiels pour les agents système qui doivent tourner partout :

CatégorieExemples
MonitoringPrometheus Node Exporter, Datadog Agent, Telegraf
Collecte de logsFluentd, Fluent Bit, Filebeat, Vector
Réseau (CNI)Calico, Cilium, Flannel, Weave Net
Stockage (CSI)NFS CSI Node Plugin, Longhorn, OpenEBS
SécuritéFalco, Sysdig, Trivy Operator

Voici un DaemonSet minimal qui exécute un conteneur busybox affichant un message toutes les 10 secondes :

daemonset-basic.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: my-daemonset
labels:
app: daemon-example
spec:
selector:
matchLabels:
app: daemon-example
template:
metadata:
labels:
app: daemon-example
spec:
containers:
- name: busybox
image: busybox:1.37
command: ["sh", "-c", "while true; do echo 'DaemonSet actif sur $(hostname)'; sleep 10; done"]
resources:
requests:
cpu: 10m
memory: 16Mi
limits:
cpu: 50m
memory: 32Mi

Appliquer le DaemonSet :

Fenêtre de terminal
kubectl apply -f daemonset-basic.yaml

Vérifier le déploiement :

Fenêtre de terminal
kubectl get ds my-daemonset
# NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
# my-daemonset 3 3 3 3 3 <none> 45s

Les colonnes importantes :

ColonneSignification
DESIREDNombre de nœuds éligibles
CURRENTNombre de Pods créés
READYNombre de Pods en état Ready
UP-TO-DATEPods avec la spec à jour
NODE SELECTORSélecteur de nœuds (si défini)

Voir sur quels nœuds les Pods tournent :

Fenêtre de terminal
kubectl get pods -l app=daemon-example -o wide
# NAME READY STATUS NODE
# my-daemonset-7x2km 1/1 Running node-worker-1
# my-daemonset-9f4np 1/1 Running node-worker-2
# my-daemonset-kj8rt 1/1 Running node-control-plane

Un DaemonSet peut être limité à un sous-ensemble de nœuds avec nodeSelector ou affinity. C’est utile pour :

  • Déployer uniquement sur les nœuds Linux (kubernetes.io/os: linux)
  • Cibler un pool spécifique (GPU, infra, edge)
  • Exclure les nœuds de développement

La méthode la plus simple. Le DaemonSet ne crée des Pods que sur les nœuds ayant tous les labels spécifiés.

daemonset-nodeselector.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: infra-agent
spec:
selector:
matchLabels:
app: infra-agent
template:
metadata:
labels:
app: infra-agent
spec:
nodeSelector:
kubernetes.io/os: linux
nodepool: infra
containers:
- name: agent
image: busybox:1.37
command: ["sh", "-c", "echo 'Agent infra'; sleep infinity"]

Vérifier les labels d’un nœud :

Fenêtre de terminal
kubectl get node node-worker-1 --show-labels

Ajouter un label à un nœud :

Fenêtre de terminal
kubectl label node node-worker-1 nodepool=infra

Pour des règles plus complexes (opérateurs In, NotIn, Exists) :

spec:
template:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- amd64
- arm64

Par défaut, les Pods ne sont pas schedulés sur les nœuds portant un taint NoSchedule. Pour qu’un DaemonSet s’exécute sur ces nœuds (par exemple les control-plane), vous devez ajouter des tolerations.

Les nœuds control-plane portent généralement le taint node-role.kubernetes.io/control-plane:NoSchedule. Pour y déployer un agent de monitoring :

daemonset-controlplane.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: monitoring-agent
spec:
selector:
matchLabels:
app: monitoring-agent
template:
metadata:
labels:
app: monitoring-agent
spec:
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
containers:
- name: node-exporter
image: prom/node-exporter:v1.9.0
ports:
- containerPort: 9100
name: metrics

Pour les agents système qui doivent absolument tourner partout (y compris sur des nœuds avec n’importe quel taint) :

tolerations:
- operator: "Exists"
Fenêtre de terminal
kubectl describe node node-control-plane | grep -A 5 Taints
# Taints: node-role.kubernetes.io/control-plane:NoSchedule

Ces commandes sont essentielles pour le dépannage et l’examen CKAD.

Fenêtre de terminal
# Vue d'ensemble des DaemonSets
kubectl get ds
# Détails complets (événements, sélecteur, stratégie)
kubectl describe ds my-daemonset
# Pods du DaemonSet avec leurs nœuds
kubectl get pods -l app=daemon-example -o wide
# État du rollout en cours
kubectl rollout status ds/my-daemonset
# Historique des révisions
kubectl rollout history ds/my-daemonset
Fenêtre de terminal
kubectl describe ds my-daemonset

Sections importantes à observer :

SectionCe qu’elle montre
SelectorLabels utilisés pour matcher les Pods
Node-SelectorContrainte nodeSelector active
Update StrategyRollingUpdate ou OnDelete
Pods StatusRépartition Running/Waiting/Failed
EventsHistorique de création/mise à jour des Pods

Kubernetes propose deux stratégies de mise à jour pour les DaemonSets.

C’est la stratégie par défaut depuis l’API apps/v1. Kubernetes remplace les Pods progressivement, un par un, en respectant les contraintes configurées.

daemonset-rollingupdate.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: my-daemonset
spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # Max de Pods indisponibles pendant la MAJ
maxSurge: 0 # Pas de Pod supplémentaire créé avant suppression
selector:
matchLabels:
app: daemon-example
template:
metadata:
labels:
app: daemon-example
spec:
containers:
- name: busybox
image: busybox:1.37 # Changez cette image pour déclencher un rollout

Paramètres de contrôle :

ParamètreDescriptionValeur par défaut
maxUnavailableNombre max de Pods indisponibles pendant la mise à jour1
maxSurgeNombre de Pods supplémentaires créés avant suppression (K8s 1.22+)0
minReadySecondsDélai avant de considérer un Pod comme Ready0

Appliquer une mise à jour :

Fenêtre de terminal
kubectl apply -f daemonset-rollingupdate.yaml

Suivre la progression :

Fenêtre de terminal
kubectl rollout status ds/my-daemonset
# Waiting for daemon set "my-daemonset" rollout to finish: 1 out of 3 new pods have been updated...
# daemon set "my-daemonset" successfully rolled out

Annuler en cas de problème :

Fenêtre de terminal
kubectl rollout undo ds/my-daemonset

Avec OnDelete, Kubernetes ne met pas à jour automatiquement les Pods existants. Vous devez les supprimer manuellement pour qu’ils soient recréés avec la nouvelle spec.

spec:
updateStrategy:
type: OnDelete

Workflow :

  1. Modifier la spec du DaemonSet

    Fenêtre de terminal
    kubectl apply -f daemonset-updated.yaml
  2. Les Pods existants ne changent pas (vérifiez avec kubectl get pods)

  3. Supprimer manuellement un Pod pour déclencher sa recréation

    Fenêtre de terminal
    kubectl delete pod my-daemonset-7x2km
  4. Le nouveau Pod est créé avec la nouvelle spec

Cas d’usage de OnDelete :

  • Mise à jour contrôlée nœud par nœud
  • Validation manuelle avant chaque remplacement
  • Environnements critiques avec approbation requise
SymptômeCause probableDiagnosticSolution
DESIREDCURRENTNœud tainté ou contraintes de ressourceskubectl describe ds → EventsAjouter toleration ou ajuster nodeSelector
Pod PendingPas de nœud éligiblekubectl describe podVérifier labels/taints des nœuds
ImagePullBackOffImage introuvable ou registre inaccessiblekubectl logs <pod>Vérifier le nom de l’image et les credentials
CrashLoopBackOffApplication qui plante en bouclekubectl logs <pod> --previousCorriger l’application ou sa configuration
Pod non créé sur un nœudNodeSelector ou affinity non satisfaitskubectl get node --show-labelsAjouter les labels requis au nœud
Fenêtre de terminal
# Voir pourquoi un DaemonSet n'a pas le bon nombre de Pods
kubectl describe ds my-daemonset
# Identifier les nœuds sans Pod du DaemonSet
kubectl get nodes -o wide
kubectl get pods -l app=daemon-example -o wide
# Comparer nœuds et Pods
kubectl get nodes --no-headers | wc -l # Nombre de nœuds
kubectl get pods -l app=daemon-example --no-headers | wc -l # Nombre de Pods
# Vérifier un nœud spécifique
kubectl describe node node-worker-2 | grep -E "Taints|Conditions" -A 3

Exemple de résolution : Pod manquant sur un nœud tainté

Section intitulée « Exemple de résolution : Pod manquant sur un nœud tainté »

Symptôme : 3 nœuds, mais seulement 2 Pods DaemonSet.

Fenêtre de terminal
kubectl get ds my-daemonset
# DESIRED CURRENT READY
# 2 2 2

Diagnostic :

Fenêtre de terminal
kubectl describe ds my-daemonset
# Events:
# Warning FailedCreate DaemonSet controller 0/3 nodes are available:
# 1 node(s) had untolerated taint {gpu: "true"}

Solution :

tolerations:
- key: "gpu"
operator: "Equal"
value: "true"
effect: "NoSchedule"

Choisir la bonne ressource est essentiel pour la CKAD. Voici un comparatif :

CritèreDaemonSetDeploymentStatefulSet
Nombre de Pods1 par nœud éligibleN répliques (variable)N répliques ordonnées
Identité des PodsAnonymeAnonymeStable (pod-0, pod-1…)
StockageGénéralement local/hostPathPVC partagé ou sans étatPVC dédié par Pod
Cas d’usageAgents système, CNI, logsApplications stateless, APIsBases de données, queues
ScalingAutomatique (suit les nœuds)kubectl scale ou HPAkubectl scale
Mise à jourRollingUpdate ou OnDeleteRollingUpdateRollingUpdate ou OnDelete
  • Vous avez besoin d’un agent sur chaque nœud (ou sous-ensemble)
  • L’application doit accéder aux ressources locales du nœud (logs, métriques, réseau)
  • Le nombre de répliques doit suivre automatiquement le nombre de nœuds
  • Votre application ne dépend pas du nœud → Deployment
  • Vous avez besoin d’identités stables et de stockage persistant → StatefulSet
  • Vous voulez scaler indépendamment du nombre de nœuds → Deployment + HPA
  1. Un DaemonSet garantit un Pod sur chaque nœud éligible, pas sur tous les nœuds sans distinction
  2. L’éligibilité dépend des nodeSelector, affinity, tolerations et des ressources disponibles
  3. La stratégie de mise à jour par défaut est RollingUpdate (pas OnDelete)
  4. Utilisez maxUnavailable pour contrôler le rythme des mises à jour
  5. Les tolerations sont nécessaires pour les nœuds control-plane ou taintés
  6. kubectl describe ds est votre meilleur ami pour diagnostiquer les problèmes
  7. Choisissez DaemonSet pour les agents système, Deployment pour les applications scalables

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

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