Capítulo 7.2 - DaemonSets
Objetivos de Aprendizaje
Al final de este capítulo, usted será capaz de:
- Comprender qué es un DaemonSet
- Desplegar DaemonSets
- Utilizar node selectors y affinities
- Gestionar DaemonSets con actualizaciones de nodos
- Comprender los casos de uso típicos
- Configurar DaemonSets para nodos específicos
Introducción
Un DaemonSet asegura que un Pod se ejecute en todos (o algunos) nodos del clúster. A diferencia de los Deployments que gestionan un número específico de Pods, los DaemonSets crean un Pod por nodo.
¿Qué es un DaemonSet?
Un DaemonSet garantiza que una copia de un Pod se ejecute en cada nodo (o en nodos seleccionados) del clúster.
Características
- Un Pod por nodo: Desplegado automáticamente en cada nodo
- Auto-gestión: Crea/elimina Pods cuando se agregan/eliminan nodos
- Node-specific: Puede apuntar a nodos específicos con selectors
- System-level: Ideal para servicios de sistema
Casos de Uso Típicos
1. Agentes de Logging
Recolectar los logs de todos los nodos:
2. Agentes de Monitoreo
Recolectar las métricas de todos los nodos:
- Prometheus Node Exporter
- Datadog Agent
- New Relic Agent
3. Agentes de Seguridad
- Antivirus
- Detección de intrusiones
- Escáneres de cumplimiento
4. Red
- kube-proxy (ya es un DaemonSet en Kubernetes)
- Plugins CNI
- Aplicación de políticas de red
5. Almacenamiento
- Controladores de almacenamiento
- Plugins de volúmenes
Ejemplo: Fluentd para 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
Desplegar solo en ciertos nodos:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: monitoring-agent
spec:
template:
spec:
nodeSelector:
monitoring: "enabled"
containers:
- name: agent
image: monitoring-agent:1.0
Resultado: El DaemonSet crea Pods solo en los nodos con la etiqueta monitoring=enabled.
Node Affinities
Control más avanzado con 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
Los DaemonSets pueden tolerar los taints para ejecutarse en nodos 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
Resultado: El DaemonSet también se ejecuta en los nodos master/control-plane.
Ejemplo: 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
Actualizaciones
Rolling Update (Por Defecto)
spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
Proceso: Actualización progresiva de los Pods en cada nodo.
OnDelete
spec:
updateStrategy:
type: OnDelete
Proceso: Actualización solo cuando un Pod es eliminado manualmente.
Comandos Útiles
Gestión
# Ver los DaemonSets
kubectl get daemonset
kubectl get ds
# Detalles
kubectl describe daemonset fluentd
# Ver los Pods
kubectl get pods -l name=fluentd
# Logs
kubectl logs -l name=fluentd
Actualizaciones
# Actualización de la imagen
kubectl set image daemonset/fluentd fluentd=fluent/fluentd:v2
# Ver el estado
kubectl rollout status daemonset/fluentd
# Rollback
kubectl rollout undo daemonset/fluentd
Diferencias: DaemonSet vs Deployment
| Característica | Deployment | DaemonSet |
|---|---|---|
| Número de Pods | Especificado (replicas) | Uno por nodo |
| Ubicación | Aleatorio | En cada nodo |
| Casos de uso | Aplicaciones | Servicios de sistema |
| Escalado | Manual | Automático (según nodos) |
| Actualizaciones de nodos | No gestionado | Auto-gestionado |
Buenas Prácticas
1. Usar para Servicios de Sistema
DaemonSets para agentes de sistema, no para aplicaciones de negocio.
2. Recursos Apropiados
Definir límites de recursos para evitar agotamiento.
3. Tolerations
Agregar tolerations para nodos tainted si es necesario.
4. Monitoreo
Supervisar que todos los nodos tengan un Pod del DaemonSet.
5. Namespace
Colocar los DaemonSets de sistema en kube-system o en un namespace dedicado.
Resumen
En este capítulo, usted ha aprendido:
DaemonSet: Un Pod por nodo del clúster
Casos de uso: Agentes de logging, monitoreo, seguridad, red
Node selectors: Desplegar en nodos específicos
Tolerations: Ejecutarse en nodos tainted
Actualizaciones: RollingUpdate u OnDelete
Diferencias: Uno por nodo vs número específico
Buenas prácticas: Servicios de sistema, recursos, monitoreo
Próximos Pasos
Capítulo 7.3: Jobs
Capítulo 7.4: CronJobs
Capítulo creado el: Diciembre 2024