Aller au contenu principal

Chapitre 7.2 - DaemonSets

Objectifs d'Apprentissage

À la fin de ce chapitre, vous serez capable de:

  • Comprendre ce qu'est un DaemonSet
  • Déployer des DaemonSets
  • Utiliser des node selectors et affinities
  • Gérer les DaemonSets avec node updates
  • Comprendre les cas d'usage typiques
  • Configurer des DaemonSets pour des nodes spécifiques

Introduction

Un DaemonSet assure qu'un Pod s'exécute sur tous (ou certains) nodes du cluster. Contrairement aux Deployments qui gèrent un nombre spécifique de Pods, les DaemonSets créent un Pod par node.


Qu'est-ce qu'un DaemonSet?

Un DaemonSet garantit qu'une copie d'un Pod s'exécute sur chaque node (ou sur des nodes sélectionnés) du cluster.

Caractéristiques

  • Un Pod par node: Automatiquement déployé sur chaque node
  • Auto-gestion: Crée/supprime des Pods quand des nodes sont ajoutés/supprimés
  • Node-specific: Peut cibler des nodes spécifiques avec selectors
  • System-level: Idéal pour les services système

Cas d'Usage Typiques

1. Agents de Logging

Collecter les logs de tous les nodes:

2. Agents de Monitoring

Collecter les métriques de tous les nodes:

  • Prometheus Node Exporter
  • Datadog Agent
  • New Relic Agent

3. Agents de Sécurité

  • Antivirus
  • Intrusion Detection
  • Compliance scanners

4. Réseau

  • kube-proxy (déjà un DaemonSet dans Kubernetes)
  • CNI plugins
  • Network policies enforcement

5. Stockage

  • Storage drivers
  • Volume plugins

Exemple: Fluentd pour Logging

DaemonSet Fluentd

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: kube-system
spec:
selector:
matchLabels:
name: fluentd
template:
metadata:
labels:
name: fluentd
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch.logging.svc.cluster.local"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers

Node Selectors

Déployer seulement sur certains nodes:

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: monitoring-agent
spec:
template:
spec:
nodeSelector:
monitoring: "enabled"
containers:
- name: agent
image: monitoring-agent:1.0

Résultat: Le DaemonSet crée des Pods seulement sur les nodes avec le label monitoring=enabled.


Node Affinities

Contrôle plus avancé avec affinities:

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: gpu-monitor
spec:
template:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: accelerator
operator: In
values:
- nvidia-tesla-k80
- nvidia-tesla-v100
containers:
- name: gpu-monitor
image: gpu-monitor:1.0

Tolerations

Les DaemonSets peuvent tolérer les taints pour s'exécuter sur des nodes tainted:

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: system-monitor
spec:
template:
spec:
tolerations:
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
containers:
- name: monitor
image: system-monitor:1.0

Résultat: Le DaemonSet s'exécute aussi sur les nodes master/control-plane.


Exemple: Prometheus Node Exporter

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
namespace: monitoring
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
hostNetwork: true
hostPID: true
containers:
- name: node-exporter
image: prom/node-exporter:v1.5.0
args:
- --path.procfs=/host/proc
- --path.sysfs=/host/sys
- --collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($|/)
volumeMounts:
- name: proc
mountPath: /host/proc
readOnly: true
- name: sys
mountPath: /host/sys
readOnly: true
volumes:
- name: proc
hostPath:
path: /proc
- name: sys
hostPath:
path: /sys

Mises à Jour

Rolling Update (Par Défaut)

spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1

Processus: Mise à jour progressive des Pods sur chaque node.

OnDelete

spec:
updateStrategy:
type: OnDelete

Processus: Mise à jour seulement quand un Pod est supprimé manuellement.


Commandes Utiles

Gestion

# Voir les DaemonSets
kubectl get daemonset
kubectl get ds

# Détails
kubectl describe daemonset fluentd

# Voir les Pods
kubectl get pods -l name=fluentd

# Logs
kubectl logs -l name=fluentd

Mises à Jour

# Mise à jour de l'image
kubectl set image daemonset/fluentd fluentd=fluent/fluentd:v2

# Voir le statut
kubectl rollout status daemonset/fluentd

# Rollback
kubectl rollout undo daemonset/fluentd

Différences: DaemonSet vs Deployment

CaractéristiqueDeploymentDaemonSet
Nombre de PodsSpécifié (replicas)Un par node
PlacementAléatoireSur chaque node
Cas d'usageApplicationsServices système
ScalingManuelAutomatique (selon nodes)
Node updatesNon géréAuto-géré

Bonnes Pratiques

1. Utiliser pour Services Système

DaemonSets pour agents système, pas pour applications métier.

2. Ressources Appropriées

Définir des limites de ressources pour éviter l'épuisement.

3. Tolerations

Ajouter des tolerations pour les nodes tainted si nécessaire.

4. Monitoring

Surveiller que tous les nodes ont un Pod du DaemonSet.

5. Namespace

Placer les DaemonSets système dans kube-system ou un namespace dédié.


Résumé

Dans ce chapitre, vous avez appris:

DaemonSet: Un Pod par node du cluster
Cas d'usage: Agents de logging, monitoring, sécurité, réseau
Node selectors: Déployer sur des nodes spécifiques
Tolerations: S'exécuter sur des nodes tainted
Mises à jour: RollingUpdate ou OnDelete
Différences: Un par node vs nombre spécifique
Bonnes pratiques: Services système, ressources, monitoring


Prochaines Étapes

Chapitre 7.3: Jobs
Chapitre 7.4: CronJobs


Chapitre créé le: Décembre 2024