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éristique | Deployment | DaemonSet |
|---|---|---|
| Nombre de Pods | Spécifié (replicas) | Un par node |
| Placement | Aléatoire | Sur chaque node |
| Cas d'usage | Applications | Services système |
| Scaling | Manuel | Automatique (selon nodes) |
| Node updates | Non 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