Saltar al contenido principal

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ísticaDeploymentDaemonSet
Número de PodsEspecificado (replicas)Uno por nodo
UbicaciónAleatorioEn cada nodo
Casos de usoAplicacionesServicios de sistema
EscaladoManualAutomático (según nodos)
Actualizaciones de nodosNo gestionadoAuto-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