Capítulo 6.4 - StatefulSets e Armazenamento Persistente
Objetivos de Aprendizagem
Ao final deste capítulo, você será capaz de:
- Compreender os StatefulSets e suas características
- Fazer deploy de aplicações stateful com armazenamento persistente
- Entender as identidades estáveis dos Pods
- Utilizar volumeClaimTemplates
- Compreender as diferenças em relação aos Deployments
- Gerenciar scaling ordenado
Introdução
Os Deployments são ideais para aplicações stateless (sem estado). Para aplicações stateful (com estado), como bancos de dados, você precisa de StatefulSets.
O que é um StatefulSet?
Um StatefulSet gerencia o deploy e o scaling de um conjunto de Pods com:
- Identidades estáveis: Nomes de Pods previsíveis (web-0, web-1, web-2)
- Armazenamento persistente: Cada Pod tem seu próprio volume
- Ordem garantida: Deploy e scaling ordenados
- Service headless: Serviço sem ClusterIP para descoberta DNS
Características Principais
1. Identidades Estáveis
Nomes dos Pods:
web-0web-1web-2
Vantagens:
- Identidade estável mesmo após reinício
- DNS estável para descoberta de serviço
- Armazenamento vinculado à identidade
2. Armazenamento Persistente Individual
Cada Pod tem seu próprio volume persistente criado via volumeClaimTemplates.
3. Ordem Garantida
Deploy: Ordem crescente (0, 1, 2)
Remoção: Ordem decrescente (2, 1, 0)
Scaling: Ordenado
4. Service Headless
Um service headless (sem ClusterIP) permite descoberta DNS estável.
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
Exemplo Completo
Etapa 1: Criar o Service Headless
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
clusterIP: None
selector:
app: web
ports:
- port: 80
name: http
Etapa 2: Criar o StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web-statefulset
spec:
serviceName: "web-service" # Deve corresponder ao service 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 tem seu próprio volume
VolumeClaimTemplates
Os volumeClaimTemplates criam automaticamente um PVC para cada Pod.
Características:
- Criação automática de PVCs
- Nome:
{template-name}-{pod-name} - Cada Pod tem seu próprio PVC
- PVCs só são removidos se o Pod for excluído
Diferenças: Deployment vs StatefulSet
| Característica | Deployment | StatefulSet |
|---|---|---|
| Identidade | Aleatória (random-abc123) | Estável (web-0, web-1) |
| Armazenamento | Compartilhado ou efêmero | Individual persistente |
| Scaling | Aleatório | Ordem garantida |
| Service | ClusterIP normal | Headless (DNS) |
| Caso de uso | Apps stateless | Apps stateful (DB, etc.) |
| Reinício | Novo nome | Mesmo nome |
Casos de Uso
1. Bancos de Dados
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. Aplicações com Estado
- Sistemas de arquivos distribuídos
- Caches com dados persistentes
- Aplicações com identidades estáveis
3. Serviços que Requerem Ordem
- Replicação master-slave
- Aplicações com quorum
- Serviços com eleição de líder
Scaling
Scaling Up
kubectl scale statefulset web-statefulset --replicas=5
Resultado: Cria web-3 e depois web-4 em ordem.
Scaling Down
kubectl scale statefulset web-statefulset --replicas=2
Resultado: Remove web-2 e depois web-1 em ordem decrescente.
Importante: Os PVCs não são removidos automaticamente. Remova manualmente se necessário.
Atualizações
Rolling Update
spec:
updateStrategy:
type: RollingUpdate
template:
spec:
containers:
- name: nginx
image: nginx:1.21 # Nova versão
Processo:
- Atualiza
web-2(último) - Atualiza
web-1 - Atualiza
web-0(primeiro)
OnDelete
spec:
updateStrategy:
type: OnDelete
Processo: Atualiza somente quando um Pod é removido manualmente.
Comandos Úteis
Criar e Gerenciar
# Criar um StatefulSet
kubectl apply -f statefulset.yaml
# Ver os StatefulSets
kubectl get statefulset
kubectl get sts
# Ver os Pods
kubectl get pods -l app=web
# Detalhes
kubectl describe statefulset web-statefulset
Scaling
# Aumentar os replicas
kubectl scale statefulset web-statefulset --replicas=5
# Reduzir os replicas
kubectl scale statefulset web-statefulset --replicas=2
Ver os Volumes
# Ver os PVCs criados
kubectl get pvc
# Ver detalhes
kubectl describe pvc www-web-0
Boas Práticas
1. Usar para Aplicações Stateful
StatefulSets apenas para aplicações com estado. Use Deployments para stateless.
2. Service Headless Obrigatório
Sempre crie um service headless para descoberta DNS.
3. Armazenamento Apropriado
Escolha o access mode correto (RWO para bancos de dados).
4. Backups
Implemente backups regulares dos volumes.
5. Monitoramento
Monitore o estado e desempenho de cada Pod.
Resumo
Neste capítulo, você aprendeu:
StatefulSet: Gerencia aplicações stateful com identidades estáveis
Características: Nomes previsíveis, volumes individuais, ordem garantida, service headless
volumeClaimTemplates: Criação automática de PVCs por Pod
Casos de uso: Bancos de dados, aplicações com estado, serviços ordenados
Diferenças: Identidade estável vs aleatória, armazenamento individual vs compartilhado
Scaling: Ordem garantida (crescente para up, decrescente para down)
Atualizações: RollingUpdate (inverso) ou OnDelete
Próximos Passos
Módulo 7: Workloads Avançados (StatefulSets avançado, DaemonSets, Jobs)
Lab 6.4: StatefulSet com Armazenamento Persistente
Capítulo criado em: Dezembro 2024