DaemonSets - ii02735/learn-k8 GitHub Wiki

Les DaemonSets

Qu'est-ce qu'un DaemonSet ?

Un DaemonSet garantit qu'une copie d'un Pod tourne sur chaque noeud du cluster (ou sur un sous-ensemble, via nodeSelector / affinités / tolerations).

Un DaemonSet avec un Pod sur chaque noeud

  • Nouveau noeud ajouté au cluster → le DaemonSet ajoute le Pod automatiquement.
  • Noeud retiré du cluster → le DaemonSet supprime le Pod.
  • Comme un ReplicaSet, le DaemonSet maintient les Pods (redémarrage en cas de plantage) et supporte les mises à jour progressives (RollingUpdate).

Quand utiliser un DaemonSet ?

Pour tout ce qui doit tourner sur chaque noeud, en général des agents d'infrastructure :

  • la collecte de logs (Fluentd, Filebeat, Promtail…) ;
  • les métriques de noeud (node-exporter de Prometheus) ;
  • le réseau (le plugin CNI : Calico, Flannel, Cilium…) ;
  • le stockage (démons de stockage distribué, Rook…) ;
  • l'équilibrage et le proxy réseau (kube-proxy, envoy…) ;
  • la sécurité / l'observabilité (agents de scan, d'APM…).

À l'inverse, une application métier ordinaire (API, frontend) ne doit pas être un DaemonSet : c'est le rôle d'un Deployment.

Cibler une partie des noeuds

Par défaut, le Pod est créé sur tous les noeuds. Pour le restreindre :

  • nodeSelector : n'utilise que les noeuds portant certains labels (ex. disktype: ssd) ;
  • affinités de noeud (affinity.nodeAffinity) : règles plus riches (In, NotIn, Exists…) ;
  • tolerations : permet de scheduler sur des noeuds taintés, notamment les noeuds maîtres.

Un manifeste DaemonSet

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  labels:
    app: node-exporter
spec:
  selector:
    matchLabels:
      app: node-exporter
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: node-exporter
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      containers:
        - name: node-exporter
          image: prom/node-exporter
          ports:
            - containerPort: 9100

Le manifeste ressemble beaucoup à celui d'un Deployment — les différences notables : il n'y a pas de replicas (le DaemonSet en déduit le nombre du nombre de noeuds), et on peut ajouter des tolerations pour les noeuds particuliers.

Les mises à jour

Comme pour un Deployment, la stratégie par défaut est RollingUpdate :

  • les Pods sont remplacés noeud par noeud (paramétrable via maxUnavailable) ;
  • la stratégie OnDelete attend, elle, la suppression manuelle d'un Pod pour le recréer avec la nouvelle version.

Ne pas confondre

  • ReplicaSet / Deployment : N réplicas, répartis n'importe où dans le cluster.
  • DaemonSet : un Pod par noeud, pas de notion de compteur de réplicas (le Pod « suit » le noeud).

Les commandes principales

  • Lister les DaemonSets : kubectl get daemonsets (ou kubectl get ds)
  • Obtenir les détails : kubectl describe ds node-exporter
  • Voir sur quel noeud tourne chaque Pod : kubectl get pods -o wide
  • Redémarrer les Pods : kubectl rollout restart daemonset/node-exporter
  • Supprimer un DaemonSet et ses Pods : kubectl delete daemonset node-exporter