Saltar al contenido principal

Capítulo 6.4 - StatefulSets y Almacenamiento Persistente

Objetivos de Aprendizaje​

Al final de este capítulo, usted será capaz de:

  • Comprender los StatefulSets y sus características
  • Desplegar aplicaciones stateful con almacenamiento persistente
  • Comprender las identidades estables de los Pods
  • Utilizar volumeClaimTemplates
  • Comprender las diferencias con Deployments
  • Gestionar el escalado ordenado

Introducción​

Los Deployments son ideales para aplicaciones stateless (sin estado). Para aplicaciones stateful (con estado) como bases de datos, usted necesita StatefulSets.


¿Qué es un StatefulSet?​

Un StatefulSet gestiona los despliegues y el escalado de un conjunto de Pods con:

  • Identidades estables: Nombres de Pods predecibles (web-0, web-1, web-2)
  • Almacenamiento persistente: Cada Pod tiene su propio volumen
  • Orden garantizado: Despliegue y escalado ordenado
  • Servicio headless: Servicio sin ClusterIP para descubrimiento DNS

Características Principales​

1. Identidades Estables​

Nombres de los Pods:

  • web-0
  • web-1
  • web-2

Ventajas:

  • Identidad estable incluso después de reinicio
  • DNS estable para descubrimiento de servicio
  • Almacenamiento vinculado a la identidad

2. Almacenamiento Persistente Individual​

Cada Pod tiene su propio volumen persistente creado mediante volumeClaimTemplates.

3. Orden Garantizado​

Despliegue: Orden ascendente (0, 1, 2)
Eliminación: Orden descendente (2, 1, 0)
Escalado: Ordenado

4. Servicio Headless​

Un servicio headless (sin ClusterIP) permite un descubrimiento DNS estable.

apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
clusterIP: None # Headless service
selector:
app: web
ports:
- port: 80

DNS:

  • web-0.web-service.default.svc.cluster.local
  • web-1.web-service.default.svc.cluster.local
  • web-2.web-service.default.svc.cluster.local

Ejemplo Completo​

Paso 1: Crear el Servicio Headless​

apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
clusterIP: None
selector:
app: web
ports:
- port: 80
name: http

Paso 2: Crear el StatefulSet​

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web-statefulset
spec:
serviceName: "web-service" # Debe coincidir con el servicio headless
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.20
ports:
- containerPort: 80
name: http
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "fast-ssd"
resources:
requests:
storage: 10Gi

Resultado:

  • 3 Pods: web-0, web-1, web-2
  • 3 PVCs: www-web-0, www-web-1, www-web-2
  • Cada Pod tiene su propio volumen

VolumeClaimTemplates​

Los volumeClaimTemplates crean automáticamente un PVC para cada Pod.

Características:

  • Creación automática de PVCs
  • Nombre: {template-name}-{pod-name}
  • Cada Pod tiene su propio PVC
  • Los PVCs solo se eliminan si el Pod es eliminado

Diferencias: Deployment vs StatefulSet​

CaracterísticaDeploymentStatefulSet
IdentidadAleatoria (random-abc123)Estable (web-0, web-1)
AlmacenamientoCompartido o efímeroIndividual persistente
EscaladoAleatorioOrden garantizado
ServicioClusterIP normalHeadless (DNS)
Caso de usoApps statelessApps stateful (DB, etc.)
ReinicioNuevo nombreMismo nombre

Casos de Uso​

1. Bases de Datos​

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
spec:
serviceName: postgres
replicas: 3
template:
spec:
containers:
- name: postgres
image: postgres:14
env:
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
volumeMounts:
- name: postgres-data
mountPath: /var/lib/postgresql/data
volumeClaimTemplates:
- metadata:
name: postgres-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "fast-ssd"
resources:
requests:
storage: 50Gi

2. Aplicaciones con Estado​

  • Sistemas de archivos distribuidos
  • Cachés con datos persistentes
  • Aplicaciones con identidades estables

3. Servicios que Requieren Orden​

  • Replicación maestro-esclavo
  • Aplicaciones con quórum
  • Servicios con elección de líder

Escalado​

Escalado Hacia Arriba​

kubectl scale statefulset web-statefulset --replicas=5

Resultado: Crea web-3 y luego web-4 en orden.

Escalado Hacia Abajo​

kubectl scale statefulset web-statefulset --replicas=2

Resultado: Elimina web-2 y luego web-1 en orden descendente.

Importante: Los PVCs no se eliminan automáticamente. Elimínelos manualmente si es necesario.


Actualizaciones​

Rolling Update​

spec:
updateStrategy:
type: RollingUpdate
template:
spec:
containers:
- name: nginx
image: nginx:1.21 # Nueva versión

Proceso:

  1. Actualización de web-2 (último)
  2. Actualización de web-1
  3. Actualización de web-0 (primero)

OnDelete​

spec:
updateStrategy:
type: OnDelete

Proceso: Actualización solo cuando un Pod es eliminado manualmente.


Comandos Útiles​

Crear y Gestionar​

# Crear un StatefulSet
kubectl apply -f statefulset.yaml

# Ver los StatefulSets
kubectl get statefulset
kubectl get sts

# Ver los Pods
kubectl get pods -l app=web

# Detalles
kubectl describe statefulset web-statefulset

Escalado​

# Aumentar los replicas
kubectl scale statefulset web-statefulset --replicas=5

# Reducir los replicas
kubectl scale statefulset web-statefulset --replicas=2

Ver los Volúmenes​

# Ver los PVCs creados
kubectl get pvc

# Ver los detalles
kubectl describe pvc www-web-0

Buenas Prácticas​

1. Usar para Aplicaciones Stateful​

StatefulSets solo para aplicaciones con estado. Utilice Deployments para stateless.

2. Servicio Headless Requerido​

Siempre cree un servicio headless para el descubrimiento DNS.

3. Almacenamiento Apropiado​

Elija el modo de acceso correcto (RWO para bases de datos).

4. Copias de Seguridad​

Implemente copias de seguridad regulares de los volúmenes.

5. Monitoreo​

Supervise el estado y el rendimiento de cada Pod.


Resumen​

En este capítulo, usted ha aprendido:

StatefulSet: Gestiona aplicaciones stateful con identidades estables
Características: Nombres predecibles, volúmenes individuales, orden garantizado, servicio headless
volumeClaimTemplates: Creación automática de PVCs por Pod
Casos de uso: Bases de datos, aplicaciones con estado, servicios ordenados
Diferencias: Identidad estable vs aleatoria, almacenamiento individual vs compartido
Escalado: Orden garantizado (ascendente para up, descendente para down)
Actualizaciones: RollingUpdate (inverso) u OnDelete


Próximos Pasos​

Módulo 7: Workloads Avanzados (StatefulSets a fondo, DaemonSets, Jobs)
Lab 6.4: StatefulSet con Almacenamiento Persistente


Capítulo creado el: Diciembre 2024