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
ouDelete
), 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.