Pular para o conteúdo principal

Lab 6.3 - StorageClasses e Provisionamento Dinâmico

Objetivos do Lab​

Ao final deste lab, você será capaz de:

  • Compreender o conceito de StorageClass.
  • Criar uma StorageClass personalizada.
  • Utilizar o provisionamento dinâmico com um PVC.
  • Entender os diferentes tipos de provisionadores.
  • Verificar o provisionamento automático de PVs.

Duração Estimada​

45-60 minutos

Pré-requisitos​

  • kubectl instalado e configurado.
  • Cluster Kubernetes local funcional (minikube ou kind).
  • Conhecimentos sobre StorageClasses (Capítulo 6.3).

Parte 1: Compreendendo as StorageClasses​

Uma StorageClass define um "tipo" de armazenamento com características (provisionador, parâmetros, política de retenção). Ela permite o provisionamento dinâmico de PersistentVolumes.

Etapa 1.1: Listar as StorageClasses Existentes​

Verifique as StorageClasses disponíveis no seu cluster:

kubectl get storageclass
# ou
kubectl get sc

No minikube, você deve ver uma StorageClass padrão (ex: standard ou hostpath). No kind, pode haver standard ou nenhuma.

Verifique os detalhes de uma StorageClass:

kubectl describe storageclass <nome-da-storageclass>

Parte 2: Criação de uma StorageClass Personalizada​

Para um cluster local, vamos criar uma StorageClass que utiliza hostPath como provisionador (via um provisionador local ou manual).

Etapa 2.1: Criar uma StorageClass​

Crie um arquivo storageclass-local.yaml:

# storageclass-local.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner # Sem provisionamento automático para hostPath
volumeBindingMode: WaitForFirstConsumer # Espera que um Pod use o PVC antes de criar o PV
allowVolumeExpansion: false # Não permite expansão do volume

Explicação:

  • provisioner: kubernetes.io/no-provisioner: Indica que não há provisionamento automático. Para um cluster local com hostPath, precisamos criar os PVs manualmente, mas a StorageClass permite agrupá-los.
  • volumeBindingMode: WaitForFirstConsumer: O PVC espera que um Pod seja criado antes de vincular o PV. Isso permite ao scheduler escolher o nó correto.
  • allowVolumeExpansion: false: Os volumes não podem ser expandidos após a criação.

Aplique a StorageClass:

kubectl apply -f storageclass-local.yaml

Verifique se ela foi criada:

kubectl get storageclass local-storage

Parte 3: Provisionamento Dinâmico (Simulação)​

Para um provisionamento dinâmico real, você precisaria de um provisionador como:

  • kubernetes.io/aws-ebs (AWS)
  • kubernetes.io/azure-disk (Azure)
  • kubernetes.io/gce-pd (GCP)
  • kubernetes.io/cinder (OpenStack)

No minikube, você pode usar o provisionador k8s.io/minikube-hostpath se disponível.

Etapa 3.1: Criar uma StorageClass com Provisionamento Dinâmico (minikube)​

Se você estiver usando minikube, crie uma StorageClass que utiliza o provisionador minikube:

# storageclass-minikube.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: minikube-dynamic
provisioner: k8s.io/minikube-hostpath # Provisionador minikube
volumeBindingMode: Immediate # Vincular imediatamente
reclaimPolicy: Delete # Excluir o PV quando o PVC for excluído
allowVolumeExpansion: true # Permitir expansão

Aplique-a:

kubectl apply -f storageclass-minikube.yaml

Etapa 3.2: Criar um PVC com a StorageClass​

Crie um arquivo pvc-dynamic.yaml:

# pvc-dynamic.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-dynamic
spec:
storageClassName: minikube-dynamic # Usa a StorageClass com provisionamento dinâmico
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi

Aplique o PVC:

kubectl apply -f pvc-dynamic.yaml

Verifique se o PVC foi criado e se um PV foi provisionado automaticamente:

kubectl get pvc pvc-dynamic
kubectl get pv

Você deve ver um novo PV criado automaticamente com o status Bound e vinculado ao PVC.


Parte 4: Utilizando o PVC Dinâmico​

Crie um Pod que utiliza o PVC dinâmico:

# pod-dynamic-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-dynamic-pvc
spec:
containers:
- name: app-container
image: busybox
command: ["/bin/sh", "-c"]
args: ["echo 'Dados em um volume dinâmico - $(date)' > /data/dynamic-data.txt && cat /data/dynamic-data.txt && sleep 3600"]
volumeMounts:
- name: dynamic-storage
mountPath: /data
volumes:
- name: dynamic-storage
persistentVolumeClaim:
claimName: pvc-dynamic

Aplique o Pod:

kubectl apply -f pod-dynamic-pvc.yaml

Verifique os logs:

kubectl logs pod-dynamic-pvc

Parte 5: Expansão de Volume (Opcional)​

Se allowVolumeExpansion: true, você pode expandir um PVC após sua criação.

Altere o PVC para solicitar mais espaço:

kubectl patch pvc pvc-dynamic -p '{"spec":{"resources":{"requests":{"storage":"200Mi"}}}}'

Verifique se a solicitação foi atualizada:

kubectl get pvc pvc-dynamic

Nota: A expansão real do volume depende do provisionador e do tipo de armazenamento subjacente.


Parte 6: Limpeza​

Exclua os recursos criados:

kubectl delete pod pod-dynamic-pvc
kubectl delete -f pvc-dynamic.yaml
# O PV será excluído automaticamente se reclaimPolicy: Delete
kubectl delete -f storageclass-minikube.yaml
kubectl delete -f storageclass-local.yaml

Resumo do Lab​

Neste lab, você explorou as StorageClasses e o provisionamento dinâmico. Você aprendeu a criar StorageClasses personalizadas, a utilizar o provisionamento automático de PVs via PVCs, e a entender os diferentes modos de vinculação e políticas de retenção.


Próximos Passos​

O último lab deste módulo mostrará como usar PersistentVolumes com StatefulSets para aplicações com estado.

Lab 6.4: StatefulSet com Armazenamento Persistente


Lab criado em: Dezembro 2024