Sobes.tech
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:

  1. Identificación de red estable. Los Pods obtienen un hostname único y permanente en el formato <nombre-del-statefulset>-<índice-del-pod>.
  2. 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.
  3. Despliegue y escalado ordenados. Los Pods se crean y eliminan en un orden estrictamente definido (ascendente para crear, descendente para eliminar).
  4. 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