Aller au contenu

Les DaemonSets Kubernetes

Mise à jour :

logo Kubernetes

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.

  1. 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é.
  2. 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/v1
kind: DaemonSet
metadata:
name: my-daemonset
spec:
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 :

Terminal window
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égieDescription
RollingUpdate (par défaut)Met à jour les Pods progressivement, sans interruption du service.
OnDeleteLes 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/v1
kind: DaemonSet
metadata:
name: my-daemonset
spec:
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 :

Terminal window
kubectl apply -f daemonset.yaml

Vérification de l’état du RollingUpdate :

Terminal window
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 :

Terminal window
kubectl delete pod <nom-du-pod>

Kubernetes recréera le Pod avec la nouvelle configuration.

Vérification et annulation d’une mise à jour :

Terminal window
kubectl rollout history daemonset my-daemonset

Annuler une mise à jour en cas de problème :

Terminal window
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 :

Terminal window
kubectl get daemonsets

Vérifier combien de Pods sont en cours d’exécution :

Terminal window
kubectl get daemonset my-daemonset -o wide
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR
my-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 :

Terminal window
kubectl get nodes

Vérifier si un nœud est marqué comme “Unschedulable” :

Terminal window
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 :

Terminal window
kubectl get pods -l app=my-daemonset -o wide

Afficher les logs d’un Pod en erreur :

Terminal window
kubectl logs <nom-du-pod>

Si le Pod crash en boucle, voir les derniers événements :

Terminal window
kubectl describe pod <nom-du-pod>

Recherchez les erreurs CrashLoopBackOff, ImagePullBackOff, OOMKilled pour comprendre le problème.

Corriger les erreurs courantes

ErreurCause probableSolution
Pods ne s’exécutent pas sur tous les nœudsNoeud tainté (NoSchedule)Ajouter une toleration
ImagePullBackOffL’image du conteneur est introuvableVérifier l’image utilisée et son registre
CrashLoopBackOffL’application dans le Pod plante en boucleVérifier les logs du Pod
No resources availablePas assez de CPU/mémoire sur les nœudsVérifier la consommation des ressources
Pods stuck in PendingProblè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 !