Pular para o conteúdo principal

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