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