
Persistência no Kubernetes: PV, PVC e StorageClass sem mistério
Objetivos desta aula
- Entender por que contêineres perdem dados e quando isso importa
- Diferenciar PV, PVC e StorageClass
- Montar um volume num Deployment
- Escolher entre volume efêmero e persistente
Contêineres são descartáveis: quando um Pod morre e renasce, tudo que estava gravado nele some. Para cache isso é ótimo; para um banco de dados, é um desastre. É aí que entra a persistência.
O Kubernetes separa o problema em três peças. O PersistentVolume (PV) é o disco de verdade (um volume na nuvem, por exemplo). O PersistentVolumeClaim (PVC) é o pedido da aplicação: “preciso de 10 GB”. A StorageClass é a “loja” que cria discos automaticamente conforme os pedidos chegam.
Pense numa analogia: a StorageClass é o cardápio (disco rápido SSD, disco barato), o PVC é o pedido do cliente e o PV é o prato que chega à mesa. Na prática moderna você quase só escreve o PVC — o resto acontece sozinho.
Para usar, você cria o PVC e o referencia no Deployment em duas partes: volumes (liga o PVC ao Pod) e volumeMounts (diz em qual pasta do contêiner o disco aparece).
Detalhe importante: o PVC fica bound (ligado) a um PV. Se ficar Pending, normalmente a StorageClass não existe ou a nuvem não conseguiu criar o disco — veja com kubectl describe pvc.
Bancos de dados em produção geralmente usam StatefulSet em vez de Deployment: cada réplica ganha seu próprio PVC estável (db-0, db-1...), com identidade de rede fixa.
Para dados temporários (cache, arquivos de trabalho), use emptyDir: um volume que vive enquanto o Pod vive e some junto. Mais rápido e sem custo de disco persistente.
Regra prática: aplicações stateless não precisam de PVC; bancos, filas e uploads de usuários precisam — e de backup.
Na prática
PVC + Deployment
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dados-app
spec:
accessModes: ["ReadWriteOnce"] # um nó por vez
storageClassName: standard
resources:
requests:
storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
spec:
replicas: 1
selector:
matchLabels: { app: app }
template:
metadata:
labels: { app: app }
spec:
containers:
- name: app
image: minha/app:1.0
volumeMounts:
- name: dados
mountPath: /var/lib/app # pasta persistente
volumes:
- name: dados
persistentVolumeClaim:
claimName: dados-appDiagnosticando PVC pendente
bash
kubectl get pvc # STATUS deve ser Bound
kubectl describe pvc dados-app # veja os Events no final
kubectl get storageclass # existe a classe pedida?Por que isso importa
Sem entender persistência, você perde dados de banco em produção no primeiro restart de Pod.
Erro comum
Rodar banco de dados em Deployment sem PVC: os dados somem quando o Pod é recriado.
Dica de produção
Disco persistente não é backup. Configure snapshots automáticos dos volumes críticos.
Alerta de segurança
Volumes com dados sensíveis devem usar StorageClass com criptografia ativada.
Pergunta de entrevista
Explique a diferença entre PV, PVC e StorageClass como se fosse para alguém de fora de tecnologia.
Glossário
- PV
- O disco real disponível no cluster.
- PVC
- Pedido de armazenamento feito pela aplicação.
- StorageClass
- Modelo que cria discos automaticamente.
- StatefulSet
- Controlador para apps com identidade e disco estáveis.
- emptyDir
- Volume temporário que morre com o Pod.
Conexão com o CloudShop
O PostgreSQL do CloudShop roda em StatefulSet com PVC de 20 GB e snapshots diários.
Quiz da aula
1. Quem pede armazenamento no Kubernetes?
2. PVC em Pending geralmente significa:
3. Para dados de cache temporários, use:
Minhas anotações
Salvo automaticamente neste navegador.
