0 XP

DEVOPSQUEST

Minha Trilha
Módulo 8 · Kubernetes e Helm

Persistência no Kubernetes: PV, PVC e StorageClass sem mistério

Intermediário 35 min+25 XPKuberneteskubectl

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-app

Diagnosticando 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. 1. Quem pede armazenamento no Kubernetes?

  2. 2. PVC em Pending geralmente significa:

  3. 3. Para dados de cache temporários, use:

Minhas anotações

Salvo automaticamente neste navegador.

AnteriorPróxima