Pular para o conteúdo principal

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-0
  • web-1
  • web-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.local
  • web-1.web-service.default.svc.cluster.local
  • web-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ísticaDeploymentStatefulSet
IdentidadeAleatória (random-abc123)Estável (web-0, web-1)
ArmazenamentoCompartilhado ou efêmeroIndividual persistente
ScalingAleatórioOrdem garantida
ServiceClusterIP normalHeadless (DNS)
Caso de usoApps statelessApps stateful (DB, etc.)
ReinícioNovo nomeMesmo 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:

  1. Atualiza web-2 (último)
  2. Atualiza web-1
  3. 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