Capítulo 6.2 - PersistentVolumes e PersistentVolumeClaims
Objetivos de Aprendizagem
Ao final deste capítulo, você será capaz de:
- Compreender PersistentVolumes (PV) e PersistentVolumeClaims (PVC)
- Criar e utilizar PVs e PVCs
- Entender os access modes (RWO, ROX, RWX)
- Gerenciar o ciclo de vida do armazenamento
- Compreender as reclaim policies
- Escolher o tipo certo de armazenamento conforme o caso de uso
Introdução
Volumes efêmeros (emptyDir, tmpfs) são removidos quando o Pod é finalizado. Para dados importantes que precisam persistir (bancos de dados, arquivos de usuários, etc.), o Kubernetes utiliza PersistentVolumes e PersistentVolumeClaims.
Conceitos-Chave
PersistentVolume (PV)
Um PersistentVolume é um recurso de armazenamento no cluster que foi provisionado por um administrador. É um recurso em nível de cluster, independente dos Pods.
PersistentVolumeClaim (PVC)
Um PersistentVolumeClaim é uma solicitação de armazenamento feita por um usuário. O PVC liga um PV a um Pod.
Criação de um PersistentVolume
Exemplo: PV com hostPath (Desenvolvimento Local)
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-volume
labels:
type: local
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
hostPath:
path: /data/pv-volume
Nota: hostPath é apenas para desenvolvimento local. Em produção, utilize soluções em nuvem (EBS, Azure Disk, GCE Persistent Disk) ou NFS.
Exemplo: PV com NFS
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
server: nfs-server.example.com
path: /exports/data
Criação de um PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: manual
Processo de ligação:
Access Modes
Os access modes determinam como o volume pode ser montado:
ReadWriteOnce (RWO)
- Apenas um node pode montar o volume em leitura e escrita
- Vários Pods no mesmo node podem compartilhar o volume
- Caso de uso: Bancos de dados, aplicações com estado
ReadOnlyMany (ROX)
- Vários nodes podem montar o volume somente leitura
- Caso de uso: Arquivos de configuração somente leitura, dados compartilhados
ReadWriteMany (RWX)
- Vários nodes podem montar o volume em leitura e escrita
- Caso de uso: Sistemas de arquivos compartilhados (NFS, GlusterFS)
Utilização em um Pod
apiVersion: v1
kind: Pod
metadata:
name: pv-pod
spec:
containers:
- name: app
image: nginx:1.20
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: pv-claim
Fluxo completo:
Reclaim Policies
A reclaim policy determina o que acontece com o PV quando o PVC é removido.
Retain
O PV é mantido mesmo após a exclusão do PVC. Os dados permanecem intactos.
Casos de uso:
- Dados importantes a serem preservados
- Necessidade de recuperação manual
- Conformidade e auditoria
Delete
O PV é removido automaticamente junto com o PVC. Os dados são perdidos.
Casos de uso:
- Dados temporários
- Ambientes de desenvolvimento
- Provisionamento dinâmico
Recycle (Obsoleto)
Esta política está obsoleta. Utilize Retain ou Delete.
Exemplo Completo: Banco de Dados
Etapa 1: Criar o PersistentVolume
apiVersion: v1
kind: PersistentVolume
metadata:
name: postgres-pv
labels:
app: postgres
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: fast-ssd
hostPath:
path: /data/postgres
Etapa 2: Criar o PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
storageClassName: fast-ssd
Etapa 3: Utilizar em um Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:14
env:
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
volumeMounts:
- name: postgres-storage
mountPath: /var/lib/postgresql/data
volumes:
- name: postgres-storage
persistentVolumeClaim:
claimName: postgres-pvc
Comandos Úteis
Ver PVs e PVCs
# Listar os PVs
kubectl get pv
# Detalhes de um PV
kubectl describe pv pv-volume
# Listar os PVCs
kubectl get pvc
# Detalhes de um PVC
kubectl describe pvc pv-claim
Verificar a Ligação
# Ver estado da ligação
kubectl get pv
kubectl get pvc
# Ver detalhes
kubectl get pv pv-volume -o yaml
kubectl get pvc pv-claim -o yaml
Remover um PVC
# Remover o PVC
kubectl delete pvc pv-claim
# Verificar o estado do PV após remoção
kubectl get pv pv-volume
Tipos de Armazenamento
Armazenamento Local (hostPath)
Vantagens:
- Simples para desenvolvimento
- Sem dependência externa
Desvantagens:
- Não é portátil
- Risco de perda de dados
- Não funciona com múltiplos nodes
Uso: Apenas para desenvolvimento local
NFS (Network File System)
Vantagens:
- Suporta ReadWriteMany
- Compartilhável entre nodes
- Fácil de configurar
Desvantagens:
- Performance limitada
- Ponto único de falha
- Requer um servidor NFS
Uso: Arquivos compartilhados, aplicações colaborativas
Cloud Storage (EBS, Azure Disk, GCE PD)
Vantagens:
- Alta performance
- Integração nativa com cloud
- Provisionamento dinâmico
- Snapshots automáticos
Desvantagens:
- Custo conforme uso
- Dependência do provedor de nuvem
Uso: Produção, aplicações críticas
Boas Práticas
1. Usar StorageClasses
Prefira o provisionamento dinâmico com StorageClasses ao invés da criação manual de PVs.
2. Escolher a Reclaim Policy Adequada
- Retain: Para dados importantes
- Delete: Para dados temporários
3. Tamanho Apropriado
Não superalocar. Comece pequeno e aumente se necessário (com allowVolumeExpansion: true).
4. Backups
Implemente backups regulares para dados importantes.
5. Monitoramento
Monitore o uso do armazenamento para evitar esgotamento.
Resumo
Neste capítulo, você aprendeu:
PersistentVolume (PV): Recurso de armazenamento em nível de cluster
PersistentVolumeClaim (PVC): Solicitação de armazenamento por um usuário
Access Modes: RWO (um node), ROX (vários nodes somente leitura), RWX (vários nodes leitura e escrita)
Reclaim Policy: Retain (manter) ou Delete (remover)
Tipos de armazenamento: hostPath (dev), NFS (compartilhado), Cloud (produção)
Utilização: Via persistentVolumeClaim nos Pods
Boas práticas: StorageClasses, tamanho adequado, backups
Próximos Passos
Capítulo 6.3: StorageClasses e Provisionamento Dinâmico
Lab 6.2: PersistentVolumes e PVCs
Capítulo criado em: Dezembro 2024