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-0web-1web-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.localweb-1.web-service.default.svc.cluster.localweb-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ística | Deployment | StatefulSet |
|---|---|---|
| Identidad | Aleatoria (random-abc123) | Estable (web-0, web-1) |
| Almacenamiento | Compartido o efímero | Individual persistente |
| Escalado | Aleatorio | Orden garantizado |
| Servicio | ClusterIP normal | Headless (DNS) |
| Caso de uso | Apps stateless | Apps stateful (DB, etc.) |
| Reinicio | Nuevo nombre | Mismo 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:
- Actualización de
web-2(último) - Actualización de
web-1 - 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