Pular para o conteúdo principal

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