Volumes e Persistência no Kubernetes: Dominando o Armazenamento para Aplicações Resilientes
Volumes e persistência no Kubernetes: compreendendo o armazenamento para suas aplicações
O Kubernetes oferece recursos avançados para orquestrar containers, mas quando a aplicação precisa guardar dados de forma durável, é essencial entender como funciona o modelo de armazenamento. A seguir, apresentamos os principais conceitos – Volumes, PersistentVolumes (PVs), PersistentVolumeClaims (PVCs), StorageClasses, provisionamento dinâmico – e a diferença entre aplicações stateless e stateful, indicando quando e como usar armazenamento persistente.
Volume × PersistentVolume (PV) × PersistentVolumeClaim (PVC)
Volume
- Abstração de armazenamento temporário atrelada ao ciclo de vida de um pod.
- Utilizado para compartilhar arquivos entre containers do mesmo pod ou para manter dados enquanto o container está em execução.
- Exemplos comuns:
emptyDir(existe enquanto o pod está ativo) ehostPath(diretório do nó). - Quando o pod é removido, o volume desaparece, salvo se for um PV.
volumes:
- name: dados-temporarios
emptyDir: {}
PersistentVolume (PV)
- Recurso de nível de cluster que representa um pedaço de armazenamento físico ou compartilhado.
- Criado pelo administrador ou provisionado dinamicamente; persiste independentemente dos pods.
- Pode ser baseado em NFS, iSCSI, discos de nuvem (EBS, GCE PD) ou drivers CSI (Container Storage Interface – um padrão para integrar sistemas de armazenamento ao Kubernetes).
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-exemplo
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /mnt/data
PersistentVolumeClaim (PVC)
- Solicitação de armazenamento feita por um usuário ou aplicação, especificando tamanho, modo de acesso e outras características.
- O Kubernetes associa automaticamente o PVC a um PV que satisfaça os requisitos.
- As aplicações referenciam o PVC para montar o volume persistente.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-exemplo
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
Fluxo prático
- O cluster tem PVs configurados ou capazes de provisionar novos PVs.
- O usuário cria um PVC com as características desejadas.
- O Kubernetes vincula o PVC ao PV adequado.
- O pod monta o PVC e passa a usar o volume persistente.
StorageClass e provisionamento dinâmico
StorageClass
- Define a “classe” ou tipo de armazenamento disponível (SSD rápido, HDD padrão, armazenamento replicado etc.).
- Abstrai detalhes do provedor e permite parametrizar o provisionamento.
- Cada StorageClass possui um provisioner (driver) que cria PVs automaticamente.
Provisionamento dinâmico
- Elimina a necessidade de criar PVs manualmente.
- Quando um PVC especifica uma StorageClass, o cluster cria um PV sob demanda usando o driver associado.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: padrao-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Delete
spec:
storageClassName: padrao-ssd
resources:
requests:
storage: 10Gi
O provisionador da AWS cria automaticamente um volume EBS para atender ao PVC.
Stateless × Stateful: quando usar persistência
Aplicações Stateless
- Não mantêm estado entre execuções.
- Podem ser reiniciadas, realocadas ou escaladas livremente.
- Exemplos: servidores web, APIs, caches voláteis.
- Geralmente não precisam de volumes persistentes; utilizam apenas volumes efêmeros ou nenhum volume.
Aplicações Stateful
- Necessitam guardar dados entre reinicializações, upgrades ou falhas.
- Exemplos: bancos de dados (MySQL, PostgreSQL), sistemas de mensageria (Kafka), sistemas de arquivos distribuídos.
- Requerem PVs para garantir durabilidade e consistência.
- São normalmente implantadas com StatefulSets, que fornecem identidade estável e gerenciamento avançado de volumes. Em artigos futuros, aprofundaremos neste tema.
Exemplo prático: pod consumindo um PVC
apiVersion: v1
kind: Pod
metadata:
name: pod-com-pvc
spec:
containers:
- name: app-container
image: minha-app:latest
volumeMounts:
- mountPath: /dados
name: armazenamento-persistente
volumes:
- name: armazenamento-persistente
persistentVolumeClaim:
claimName: pvc-exemplo
O pod monta o volume associado ao pvc-exemplo no caminho /dados.
Resumo rápido
| Termo | O que é |
|---|---|
| Volume | Armazenamento atrelado ao ciclo de vida do pod |
| PersistentVolume | Recurso de cluster que representa armazenamento físico persistente |
| PersistentVolumeClaim | Pedido de armazenamento feito por pods ou usuários |
| StorageClass | Classe/tipo de armazenamento que habilita provisionamento dinâmico |
| Stateless | Aplicações sem necessidade de persistência de dados |
| Stateful | Aplicações que dependem de armazenamento durável |
Considerações finais
Dominar o modelo de volumes no Kubernetes é fundamental para projetar sistemas resilientes e escaláveis. O uso combinado de PVs, PVCs e StorageClasses com provisionamento dinâmico simplifica a operação e reduz o risco de perda de dados. Identificar corretamente quando sua aplicação é stateless ou stateful garante que você aplique o armazenamento adequado, mantendo a integridade dos dados mesmo diante de falhas, reinicializações ou escalonamento.
Nos próximos artigos abordaremos StatefulSets, StorageClasses avançadas e estratégias de backup e recuperação no Kubernetes.