Middle
¿Para qué aplicación debería usarse StatefulSet en lugar de Deployment y por qué?
sobes.tech AI
Respuesta de la IA
StatefulSet debe usarse para aplicaciones que requieren:
- Identificación de red estable. Los Pods obtienen un hostname único y permanente en el formato
<nombre-del-statefulset>-<índice-del-pod>. - Almacenamiento estable y persistente. A cada réplica del Pod se le asigna un PersistentVolume propio. Incluso tras reiniciar el Pod, sus datos permanecen vinculados a él.
- Despliegue y escalado ordenados. Los Pods se crean y eliminan en un orden estrictamente definido (ascendente para crear, descendente para eliminar).
- Actualización ordenada o paralela. Se soporta tanto actualización gradual (rolling update) como actualización en paralelo (in-place o parallel), con control sobre el orden.
Ejemplos de tales aplicaciones:
- Bases de datos (MySQL, PostgreSQL, MongoDB)
- Brokers de mensajes (Kafka, RabbitMQ)
- Sistemas de caché (Redis, Memcached)
- Sistemas de archivos distribuidos (por ejemplo, Ceph, si se ejecuta en Kubernetes)
- Cualquier aplicación que requiera mantener estado entre reinicios y tener identificación constante.
A diferencia de Deployment, donde los Pods son intercambiables y sin estado, StatefulSet garantiza la unicidad y conservación del estado para cada réplica, lo cual es crítico para aplicaciones que dependen de almacenamiento persistente y una identificación de red estable.
Ejemplo de un StatefulSet muy simple para una base de datos:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
serviceName: "mysql" # Necesario para la identificación de red estable de los Pods
replicas: 3
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "password" # En producción, usar Secrets
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql # Ruta donde se monta el almacenamiento persistente
volumeClaimTemplates:
- metadata:
name: mysql-persistent-storage # Nombre del template PVC
spec:
accessModes: [ "ReadWriteOnce" ] # Modo de acceso
resources:
requests:
storage: 10Gi # Volumen de almacenamiento solicitado