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:
- Identificação de rede estável. Os Pods recebem um hostname único e permanente no formato
<nome-do-statefulset>-<índice-do-pod>. - 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.
- Implantação e escalonamento ordenados. Os Pods são criados e eliminados numa ordem estritamente definida (ascendente para criar, descendente para eliminar).
- 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