Volumes e Persistência no Kubernetes: Dominando o Armazenamento para Aplicações Resilientes

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) e hostPath (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

  1. O cluster tem PVs configurados ou capazes de provisionar novos PVs.
  2. O usuário cria um PVC com as características desejadas.
  3. O Kubernetes vincula o PVC ao PV adequado.
  4. 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.