Guia Completo sobre PersistentVolumes (PV) e PersistentVolumeClaims (PVC) no Kubernetes: Funcionamento, Exemplos e Cuidados

O que são PersistentVolumes (PV) e PersistentVolumeClaims (PVC)?

No Kubernetes, o armazenamento persistente é gerenciado principalmente por dois recursos essenciais:

  • PersistentVolume (PV): Trata-se de um recurso de armazenamento dentro do cluster, que pode ser provisionado manualmente pelo administrador ou dinamicamente pelo próprio Kubernetes. O PV abstrai os detalhes da infraestrutura física — como NFS, iSCSI ou discos em nuvem — oferecendo um volume reutilizável de armazenamento.
  • PersistentVolumeClaim (PVC): É uma solicitação feita por um usuário ou aplicação (normalmente por um Pod) para obter armazenamento com requisitos específicos, como capacidade e modos de acesso. O Kubernetes então vincula essa requisição a um PV que atenda esses critérios.

Como funcionam PVs e PVCs?

1. Provisionamento

  • Estático: O administrador cria volumes (PVs) previamente, definindo suas características manualmente.
  • Dinâmico: O Kubernetes cria PVs automaticamente à medida que os PVCs são criados, utilizando StorageClasses que definem o tipo e parâmetros do volume a ser provisionado.

Nota: StorageClass é um recurso do Kubernetes que permite definir diferentes classes de armazenamento, possibilitando a seleção automática do tipo de volume adequado para o PVC.

2. Associação entre PVC e PV

  • Ao criar um PVC, o Kubernetes busca um PV disponível que satisfaça os requisitos do PVC e os "liga" (bind).
  • Após essa ligação, o PVC está pronto para ser usado pelos Pods que o referenciam.
  • Quando o PVC é excluído, o PV pode ser tratado conforme a política de reclaim definida (Retain, Recycle ou Delete), que determina seu destino.

3. Uso pelo Pod

  • Os Pods usam os PVCs para montar volumes persistentes, permitindo que os dados sobrevivam além do ciclo de vida do próprio Pod — seja por reinicializações, falhas ou realocações no cluster.

Exemplos práticos

Definição de um PersistentVolume (PV):

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-example
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /mnt/data
  persistentVolumeReclaimPolicy: Retain

Definição de um PersistentVolumeClaim (PVC):

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-example
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

Uso do PVC em um Pod:

apiVersion: v1
kind: Pod
metadata:
  name: pod-com-pvc
spec:
  containers:
  - name: app
    image: nginx
    volumeMounts:
    - name: volume-app
      mountPath: /usr/share/nginx/html
  volumes:
  - name: volume-app
    persistentVolumeClaim:
      claimName: pvc-example

Vantagens ao usar PV e PVC

  • Persistência garantida: Os dados permanecem intactos mesmo se o Pod for reiniciado ou realocado.
  • Abstração da infraestrutura: Os usuários não precisam configurar ou entender o armazenamento físico subjacente.
  • Flexibilidade: É possível definir volumes com diferentes tamanhos e modos de acesso conforme a necessidade.
  • Provisionamento dinâmico: Facilita a criação automática de volumes, acelerando o provisionamento de armazenamento.
  • Controle de acesso: Os modos de acesso (AccessModes) permitem controlar como os volumes são montados nos nós do cluster.

Desvantagens e limitações

  • Complexidade inicial: Configurar StorageClasses e provisionadores pode ser desafiador no início.
  • Dependência da infraestrutura: Recursos como snapshots e escalabilidade dependem do suporte do provedor de armazenamento subjacente.
  • Atualização limitada: Redimensionamento e alteração de características do PVC dependem da versão do Kubernetes e do provisionador, e nem sempre são triviais.
  • Gerenciamento do ciclo de vida: A exclusão de PVCs pode ocasionar volumes órfãos se a política de recuperação não for adequada.
  • Performance e multi-tenancy: Em ambientes com múltiplos usuários e alta concorrência, performance pode ser impactada e limites de compartilhamento podem ocorrer.

Modos de acesso (AccessModes) principais

AccessMode Descrição Uso comum
ReadWriteOnce Montagem leitura/escrita por um único nó Discos locais ou EBS
ReadOnlyMany Montagem leitura apenas em múltiplos nós Compartilhamento em clusters
ReadWriteMany Montagem leitura/escrita em múltiplos nós NFS, GlusterFS

Tipos de volumes suportados por PV (exemplos)

  • hostPath: Volume local no nó, usado principalmente para testes e desenvolvimento.
  • NFS: Sistema de arquivos em rede.
  • AWS EBS, GCE PersistentDisk, AzureDisk: Volumes gerenciados pelos provedores de nuvem.
  • CSI (Container Storage Interface): Interface padrão moderna que suporta diversos provedores de armazenamento.

Rotina para atualizar PV e PVC, refletindo mudanças nos Pods

    • Desde o Kubernetes 1.11, algumas StorageClasses suportam expansão de PVCs.
    • Exemplo para aumentar um PVC:
    • Em alguns casos, é necessário redimensionar o sistema de arquivos dentro do Pod manualmente, dependendo do volume.
  • Modificar PV:
    • Alterar PV diretamente (como tamanho ou tipo) não é recomendado; a prática comum é criar um novo PV e migrar dados.
  • Efeito nos Pods:
    • Após redimensionamento do PVC, os Pods podem continuar a usar o volume normalmente.
    • Para outras mudanças, pode ser necessário reiniciar os Pods para que eles detectem as atualizações.
  • Substituir PVC:
    • Em casos complexos, o ideal é provisionar um novo PVC e migrar os dados por meio da aplicação.

Redimensionar PVC:

kubectl patch pvc pvc-example -p '{"spec": {"resources": {"requests": {"storage": "10Gi"}}}}'

Resumo das diferenças entre PV e PVC

Aspecto PersistentVolume (PV) PersistentVolumeClaim (PVC)
O que representa Recurso de armazenamento real no cluster Solicitação de armazenamento feita por um usuário
Quem cria Administrador (estático) ou Kubernetes (dinâmico) Usuário ou Pod solicitando armazenamento
Função principal Define capacidade e parâmetros do volume de armazenamento Solicita volume com características específicas
Consumo Serve para fornecer armazenamento para PVCs Utilizado por Pods para montar volumes persistentes
Atualização Geralmente estática e limitada Pode suportar redimensionamento, se disponível

Por que usar PersistentVolumes e PersistentVolumeClaims?

  • Para assegurar que os dados das aplicações sejam persistentes, protegendo-os contra reinicializações e falhas dos Pods.
  • Para abstrair a aplicação da infraestrutura física de armazenamento, facilitando o gerenciamento centralizado por equipes de DevOps.
  • Para proporcionar flexibilidade no provisionamento e nas características do armazenamento, aumentando portabilidade e escalabilidade.
  • Para aproveitar recursos como o provisionamento dinâmico, criando volumes sob demanda de forma ágil.

Conclusão

PersistentVolumes e PersistentVolumeClaims formam o alicerce do armazenamento persistente no Kubernetes. Eles proporcionam abstração, flexibilidade e controle sobre como as aplicações containerizadas armazenam e acessam seus dados. Compreender seu funcionamento é crucial para projetar aplicações robustas que mantêm a integridade dos dados, exploram os recursos da infraestrutura e garantem alta disponibilidade.

A atualização de volumes e o impacto nos Pods exigem atenção, já que nem todas as mudanças são simples ou automáticas, podendo demandar reinicializações ou migração. Com o conhecimento adequado, PVs e PVCs se tornam ferramentas poderosas para ambientes Kubernetes em produção.