Sobes.tech
Middle

Para qual aplicação deve-se usar StatefulSet em vez de Deployment e por quê?

sobes.tech IA

Resposta da IA

O StatefulSet deve ser usado para aplicações que requerem:

  1. Identificação de rede estável. Os Pods recebem um hostname único e permanente no formato <nome-do-statefulset>-<índice-do-pod>.
  2. Armazenamento estável e persistente. A cada réplica do Pod é atribuído um PersistentVolume próprio. Mesmo após reiniciar o Pod, os seus dados permanecem ligados a ele.
  3. Implantação e escalonamento ordenados. Os Pods são criados e eliminados numa ordem estritamente definida (ascendente para criar, descendente para eliminar).
  4. Atualização ordenada ou paralela. Suporta tanto atualização gradual (rolling update) como atualização em paralelo (in-place ou parallel), com controlo da ordem.

Exemplos de aplicações:

  • Bases de dados (MySQL, PostgreSQL, MongoDB)
  • Brokers de mensagens (Kafka, RabbitMQ)
  • Sistemas de cache (Redis, Memcached)
  • Sistemas de ficheiros distribuídos (por exemplo, Ceph, se executado no Kubernetes)
  • Qualquer aplicação que necessite de manter estado entre reinícios e ter uma identificação constante.

Ao contrário do Deployment, onde os Pods são intercambiáveis e stateless, o StatefulSet garante a unicidade e a preservação do estado para cada réplica, o que é crítico para aplicações que dependem de armazenamento persistente e de uma identificação de rede estável.

Exemplo de um StatefulSet muito simples para uma base de dados:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: "mysql" # Necessário para a identificação de rede estável dos 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" # Em produção, usar Secrets
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql # Caminho onde o armazenamento persistente é montado
  volumeClaimTemplates:
  - metadata:
      name: mysql-persistent-storage # Nome do template PVC
    spec:
      accessModes: [ "ReadWriteOnce" ] # Modo de acesso
      resources:
        requests:
          storage: 10Gi # Volume de armazenamento solicitado