Lab 6.2 - PersistentVolumes e PersistentVolumeClaims
Objetivos do Lab
Ao final deste lab, você será capaz de:
- Criar um PersistentVolume (PV) manualmente.
- Criar um PersistentVolumeClaim (PVC).
- Vincular um PVC a um Pod.
- Compreender o ciclo de vida de um PV e de um PVC.
- Verificar a persistência dos dados.
Duração Estimada
45-60 minutos
Pré-requisitos
- kubectl instalado e configurado.
- Cluster Kubernetes local funcional (minikube ou kind).
- Conhecimentos sobre PersistentVolumes e PVCs (Capítulo 6.2).
Parte 1: Criação de um PersistentVolume
Vamos criar um PersistentVolume manualmente. Para um cluster local (minikube/kind), usaremos um volume do tipo hostPath que monta um diretório do nó.
Etapa 1.1: Criar o PersistentVolume
Crie um arquivo pv-example.yaml:
# pv-example.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-example
labels:
type: local
spec:
storageClassName: manual # Nome da StorageClass (ou "" para nenhuma classe)
capacity:
storage: 1Gi # Tamanho do volume
accessModes:
- ReadWriteOnce # RWO: apenas um nó pode montar em leitura e escrita
persistentVolumeReclaimPolicy: Retain # O que fazer quando o PVC é removido: Retain, Delete, Recycle
hostPath:
path: /tmp/k8s-pv-example # Caminho no nó (para minikube/kind)
type: DirectoryOrCreate # Cria o diretório se não existir
Explicação:
storageClassName: manual: Indica que este PV é provisionado manualmente (não por uma StorageClass).accessModes: ReadWriteOnce: O volume pode ser montado em leitura e escrita por apenas um nó por vez.persistentVolumeReclaimPolicy: Retain: Quando o PVC é removido, o PV é mantido (os dados não são apagados).hostPath: Para um cluster local, usamos um diretório do nó. Em produção, você usaria volumes em nuvem (EBS, Azure Disk, GCE Persistent Disk) ou NFS.
Aplique o PersistentVolume:
kubectl apply -f pv-example.yaml
Verifique se o PV foi criado:
kubectl get pv pv-example
Você deve ver o PV com o status Available (disponível, ainda não vinculado a um PVC).
Verifique os detalhes:
kubectl describe pv pv-example
Parte 2: Criação de um PersistentVolumeClaim
Um PVC solicita um volume com características específicas (tamanho, modo de acesso, StorageClass).
Etapa 2.1: Criar o PersistentVolumeClaim
Crie um arquivo pvc-example.yaml:
# pvc-example.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-example
spec:
storageClassName: manual # Deve corresponder ao storageClassName do PV
accessModes:
- ReadWriteOnce # Deve corresponder ou ser um subconjunto dos accessModes do PV
resources:
requests:
storage: 500Mi # Solicita 500 MiB (o PV tem 1 GiB, então funciona)
Explicação:
storageClassName: manual: O PVC procura um PV com esta StorageClass.accessModes: ReadWriteOnce: O PVC solicita um volume com este modo de acesso.resources.requests.storage: 500Mi: O PVC solicita pelo menos 500 MiB.
Aplique o PersistentVolumeClaim:
kubectl apply -f pvc-example.yaml
Verifique se o PVC foi criado e vinculado ao PV:
kubectl get pvc pvc-example
Você deve ver o PVC com o status Bound (vinculado ao PV).
Verifique se o PV agora está vinculado:
kubectl get pv pv-example
O status deve ser Bound e a coluna CLAIM deve indicar default/pvc-example.
Parte 3: Utilizando o PVC em um Pod
Agora, vamos criar um Pod que utiliza o PVC para armazenar dados persistentes.
Etapa 3.1: Criar um Pod com o PVC
Crie um arquivo pod-with-pvc.yaml:
# pod-with-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-with-pvc
spec:
containers:
- name: app-container
image: busybox
command: ["/bin/sh", "-c"]
args: ["echo 'Données persistantes - $(date)' >> /data/persistent-data.txt && cat /data/persistent-data.txt && sleep 3600"]
volumeMounts:
- name: persistent-storage
mountPath: /data # Caminho onde o volume será montado no container
volumes:
- name: persistent-storage
persistentVolumeClaim:
claimName: pvc-example # Nome do PVC a ser usado
Aplique o Pod:
kubectl apply -f pod-with-pvc.yaml
Aguarde até que o Pod esteja Running:
kubectl get pods pod-with-pvc
Verifique os logs para ver os dados gravados:
kubectl logs pod-with-pvc
Você deve ver a mensagem com a data.
Etapa 3.2: Verificar a Persistência
Remova o Pod:
kubectl delete pod pod-with-pvc
Crie um novo Pod que lê os dados:
# pod-read-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-read-pvc
spec:
containers:
- name: app-container
image: busybox
command: ["/bin/sh", "-c"]
args: ["cat /data/persistent-data.txt && sleep 3600"]
volumeMounts:
- name: persistent-storage
mountPath: /data
volumes:
- name: persistent-storage
persistentVolumeClaim:
claimName: pvc-example
Aplique o novo Pod:
kubectl apply -f pod-read-pvc.yaml
Verifique os logs:
kubectl logs pod-read-pvc
Você deve ver os dados gravados pelo primeiro Pod, o que comprova a persistência!
Parte 4: Limpeza
Remova os recursos criados:
kubectl delete pod pod-read-pvc
kubectl delete -f pvc-example.yaml
kubectl delete -f pv-example.yaml
Note: Com persistentVolumeReclaimPolicy: Retain, mesmo após a remoção do PVC, o PV permanece com o status Released. Os dados são mantidos. Para remover completamente o PV, você deve excluí-lo manualmente:
kubectl delete pv pv-example
Resumo do Lab
Neste lab, você explorou os PersistentVolumes e PersistentVolumeClaims. Você aprendeu a criar um PV manualmente, criar um PVC que se vincula automaticamente ao PV e usar o PVC em um Pod para armazenar dados persistentes. Você também verificou que os dados sobrevivem à exclusão e recriação dos Pods.
Próximos Passos
O próximo lab irá introduzir você às StorageClasses e ao provisionamento dinâmico, que simplificam bastante a gestão de armazenamento.
Lab 6.3: StorageClasses e Provisionamento Dinâmico
Lab criado em: Dezembro 2024