Les DaemonSets Kubernetes
Mise à jour :
Dans Kubernetes, les Deployments et ReplicaSets permettent de répartir des Pods sur plusieurs nœuds, mais ils ne garantissent pas qu’un Pod soit présent sur chaque nœud.
Alors, comment déployer un agent de monitoring, un collecteur de logs ou un outil de sécurité sur tous les nœuds d’un cluster, sans exception ?
La solution : Les DaemonSets Kubernetes
Un DaemonSet est une ressource Kubernetes qui garantit qu’un Pod spécifique tourne sur tous les nœuds d’un cluster, ou sur un sous-ensemble de nœuds défini. Contrairement à un Deployment, qui répartit ses Pods selon la charge, un DaemonSet s’assure qu’un Pod est présent sur chaque nœud.
Quand utiliser un DaemonSet ?
Les DaemonSets sont particulièrement utiles pour déployer des agents de monitoring, des collecteurs de logs ou des outils de sécurité sur tous les nœuds d’un cluster. Voici quelques exemples d’applications courantes :
- Surveiller tous les nœuds avec un agent de monitoring (Prometheus Node Exporter, Datadog…)
- Collecter les logs de chaque nœud avec Fluentd, Filebeat…
- Gérer le réseau avec un CNI comme Calico ou Cilium
- Renforcer la sécurité avec un IDS (Falco, Sysdig…)
En résumé : Si vous avez besoin qu’un Pod tourne partout, le DaemonSet est la solution idéale !
Comment fonctionne un DaemonSet ?
Un DaemonSet fonctionne différemment des autres contrôleurs de Pods comme les Deployments ou les ReplicaSets.
-
Création et gestion des Pods
- Lorsqu’un DaemonSet est créé, Kubernetes déploie automatiquement un Pod sur chaque nœud du cluster.
- Si un nouveau nœud rejoint le cluster, Kubernetes y ajoute immédiatement un Pod du DaemonSet.
- Si un nœud est supprimé, le Pod correspondant est également supprimé.
-
Mise à jour et suppression
- Par défaut, les mises à jour ne se font pas automatiquement (OnDelete). Il faut supprimer manuellement les anciens Pods pour forcer le redéploiement.
- Avec RollingUpdate, Kubernetes remplace progressivement les Pods par la nouvelle version.
Créer un DaemonSet simple
Voyons comment créer un DaemonSet pour exécuter un conteneur sur tous les nœuds du cluster.
Exemple : Déployer un DaemonSet avec BusyBox :
Le fichier YAML ci-dessous définit un DaemonSet qui exécute un conteneur
busybox
affichant régulièrement un message dans les logs.
apiVersion: apps/v1kind: DaemonSetmetadata: name: my-daemonsetspec: selector: matchLabels: app: daemon-example template: metadata: labels: app: daemon-example spec: containers: - name: busybox image: busybox command: ["sh", "-c", "while true; do echo 'DaemonSet actif'; sleep 10; done"]
Application du DaemonSet :
kubectl apply -f daemonset.yaml
Mise à jour un DaemonSet
Contrairement aux Deployments, les DaemonSets ne mettent pas automatiquement à jour leurs Pods lorsqu’une modification est appliquée. Kubernetes propose deux stratégies de mise à jour pour éviter des interruptions et garantir un bon déploiement.
Stratégie | Description |
---|---|
RollingUpdate (par défaut) | Met à jour les Pods progressivement, sans interruption du service. |
OnDelete | Les nouveaux Pods ne seront mis à jour que lorsqu’un ancien Pod est supprimé manuellement. |
Par défaut, un DaemonSet utilise RollingUpdate, qui remplace progressivement les Pods sur chaque nœud.
Mise à jour un DaemonSet avec RollingUpdate
Avec RollingUpdate, Kubernetes met à jour les Pods un par un, évitant ainsi une interruption complète du service.
Exemple : Modifier l’image d’un DaemonSet :
apiVersion: apps/v1kind: DaemonSetmetadata: name: my-daemonsetspec: updateStrategy: type: RollingUpdate # Applique une mise à jour progressive template: spec: containers: - name: my-container image: busybox:latest # Nouvelle version de l’image
Application de la mise à jour :
kubectl apply -f daemonset.yaml
Vérification de l’état du RollingUpdate :
kubectl rollout status daemonset my-daemonset
Kubernetes va remplacer progressivement les anciens Pods par des nouveaux.
Utiliser OnDelete pour un contrôle manuel des mises à jour
Avec la stratégie OnDelete, Kubernetes ne met pas à jour automatiquement les Pods. Vous devez les supprimer manuellement pour qu’ils soient recréés avec la nouvelle version.
Exemple : Passer en mode OnDelete :
spec: updateStrategy: type: OnDelete # La mise à jour ne sera appliquée que si le Pod est supprimé manuellement
Suppression d’un Pod pour appliquer la mise à jour :
kubectl delete pod <nom-du-pod>
Kubernetes recréera le Pod avec la nouvelle configuration.
Vérification et annulation d’une mise à jour :
kubectl rollout history daemonset my-daemonset
Annuler une mise à jour en cas de problème :
kubectl rollout undo daemonset my-daemonset
Kubernetes restaurera la version précédente.
Débogage et gestion des erreurs des DaemonSets
Même si les DaemonSets sont conçus pour être robustes, il peut arriver qu’ils ne fonctionnent pas comme prévu. Voici comment identifier et résoudre les problèmes courants.
Vérifier si tous les Pods sont bien déployés
Un DaemonSet doit exécuter un Pod sur chaque nœud du cluster. Pour vérifier cela :
Lister tous les DaemonSets :
kubectl get daemonsets
Vérifier combien de Pods sont en cours d’exécution :
kubectl get daemonset my-daemonset -o wide
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTORmy-daemonset 3 2 2 3 2 <none>
Si DESIRED
et CURRENT
ne correspondent pas, cela signifie que le
DaemonSet ne tourne pas sur tous les nœuds.
Identifier pourquoi un Pod ne tourne pas sur un nœud
Lister les nœuds et voir lesquels n’ont pas le DaemonSet :
kubectl get nodes
Vérifier si un nœud est marqué comme “Unschedulable” :
kubectl describe node <nom-du-nœud>
Si un nœud est tainté (NoSchedule
), les Pods du DaemonSet ne s’y
exécuteront pas sauf si une toleration
est ajoutée.
Analyser les logs des Pods du DaemonSet
Si un DaemonSet est bien déployé mais que les Pods ne fonctionnent pas correctement, consultez leurs logs :
Lister les Pods du DaemonSet :
kubectl get pods -l app=my-daemonset -o wide
Afficher les logs d’un Pod en erreur :
kubectl logs <nom-du-pod>
Si le Pod crash en boucle, voir les derniers événements :
kubectl describe pod <nom-du-pod>
Recherchez les erreurs CrashLoopBackOff
, ImagePullBackOff
, OOMKilled
pour comprendre le problème.
Corriger les erreurs courantes
Erreur | Cause probable | Solution |
---|---|---|
Pods ne s’exécutent pas sur tous les nœuds | Noeud tainté (NoSchedule ) | Ajouter une toleration |
ImagePullBackOff | L’image du conteneur est introuvable | Vérifier l’image utilisée et son registre |
CrashLoopBackOff | L’application dans le Pod plante en boucle | Vérifier les logs du Pod |
No resources available | Pas assez de CPU/mémoire sur les nœuds | Vérifier la consommation des ressources |
Pods stuck in Pending | Problème d’affinity ou nodeSelector mal configuré | Vérifier les règles de sélection de nœuds |
Conclusion
Les DaemonSets sont une ressource essentielle dans Kubernetes, permettant de garantir l’exécution d’un service sur chaque nœud du cluster. Que ce soit pour le monitoring, la collecte de logs, la sécurité ou la gestion réseau, ils assurent un déploiement automatique et homogène des Pods sur tous les nœuds.
Théorie et concepts, c’est bien… mais rien ne vaut la pratique ! 🎯 Des TP sont en cours d’écriture pour vous permettre de tester concrètement les DaemonSets et les appliquer à des cas réels.
Restez connectés à mon compte Linkedin ↗ pour les prochains annonces !