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