DaemonSets y StatefulSets en Kubernetes
Ya hemos visto los deployments, pero existen otros tipos de objetos similares que nos permiten gestionar múltiples pods de forma automática. En este capítulo vamos a verlos, estos son DaemonSets y StatefulSets.
Al igual que los deployments, permiten gestionar pods de forma automática pero tienen unas caracterísicas diferentes que los hacen más adecuados para ciertos casos de uso.
Comparemos primero los Deployments con los DeamonSets y StatefulSets:
Característica | Deployments | DaemonSets | StatefulSets |
---|---|---|---|
Propósito principal | Gestionar aplicaciones sin estado | Ejecutar pods en todos los nodos | Gestionar aplicaciones con estado |
Escalabilidad | Escalado automático y manual | No escalable, un pod por nodo | Escalado manual |
Identidad de los pods | No garantiza identidad única | No garantiza identidad única | Garantiza identidad única |
Persistencia de datos | No garantiza persistencia | No garantiza persistencia | Garantiza persistencia |
Casos de uso comunes | Aplicaciones web, APIs | Agentes de monitoreo, logging | Bases de datos, sistemas distribuidos |
Distribución de pods | Basado en el número deseado | Uno por nodo o subconjunto de nodos | Basado en el número deseado |
Orden de despliegue | No garantiza orden específico | No garantiza orden específico | Garantiza orden de despliegue |
DaemonSets
DaemonSets son objetos de Kubernetes que garantizan que un pod se ejecute en todos los nodos de un clúster o en un subconjunto específico de nodos. Esto es útil para aplicaciones que tengan que ejecutarse en cada nodo, como agentes de monitoreo, logging o servicios de red.. etc.
Si un nodo se añade al clúster, el DaemonSet automáticamente crea un pod en ese nodo. Si un nodo se elimina, el pod asociado también se elimina. Simple y efectivo.
Veamos un ejemplo de un DaemonSet que ejecuta un pod en todos los nodos del clúster:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
Este DaemonSet ejecutará un pod de Fluentd en cada nodo del clúster. Fluentd es un agregador de logs que puede recopilar y enviar logs a diferentes destinos, podríamos suponer que en este caso se está utilizando para recopilar logs de todos los nodos del clúster.
Para aplicar la configuración anterior, usaríamos el siguiente comando:
kubectl apply -f daemonset.yaml
Podríamos consultar el estado del DaemonSet con el comando:
kubectl get daemonset fluentd
Ya véis que todos se gestionan de forma similar a los deployments, solo hay que especificar el tipo de objeto despues de las instrucciones get, edit, describe o delete.
Podríamos borrar el DaemonSet con el siguiente comando:
kubectl delete daemonset fluentd
StatefulSets
StatefulSets son objetos de Kubernetes que se utilizan para gestionar aplicaciones con estado. A diferencia de los deployments, los StatefulSets garantizan que los pods tengan identidades únicas y persistentes, lo que es esencial para aplicaciones como bases de datos o sistemas distribuidos.
Esto nos permite gestionar aplicaciones que requieren almacenamiento persistente y una identidad única para cada pod, es decir, cada pod tiene un nombre único y una dirección IP única que no cambia a lo largo del tiempo y que va asociado a un volumen persistente que se mantiene incluso si el pod se reinicia o se elimina.
¿Ya te imaginas por donde van los tiros? Efectivamente, esto es ideal para bases de datos o sistemas con almacenamiento persistente.
Veamos un ejemplo de un StatefulSet que ejecuta una base de datos MongoDB:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongo
spec:
serviceName: mongo
replicas: 3
selector:
matchLabels:
app: mongo
template:
metadata:
labels:
app: mongo
spec:
containers:
- name: mongo
image: mongo
ports:
- containerPort: 27017
name: mongo
Este ejemplo estaría incompleto, ya que los volúmenes los veremos en siguientes capítulos (Almanecamiento y volúmenes en Kubernetes), pero para que veas la estructura básica de un StatefulSet.
Para aplicar la configuración anterior, usaríamos el siguiente comando:
kubectl apply -f statefulset.yaml
Y de igual forma que los anteriores, podríamos utilizar los comandos get, edit, describe o delete para gestionar el StatefulSet.
kubectl <comando> statefulset mongo
Conclusión
Junto con los deployments, ya hemos visto los principalmente tipos de objetos que nos permiten gestionar pods de forma automática en Kubernetes. En el siguiente capítulo veremos los jobs y cronjobs, que son objetos que nos permiten ejecutar tareas programadas o de forma puntual.
Nos os preocupes, porque iremos viendo todos estos objetos en profundidad en los casos prácticos.
- Lista de vídeos en Youtube: Curso Kubernetes