Capítulo 6.3 - StorageClasses e Provisionamento Dinâmico
Objetivos de Aprendizagem
Ao final deste capítulo, você será capaz de:
- Entender o que é uma StorageClass
- Configurar o provisionamento dinâmico
- Criar e usar StorageClasses
- Compreender os diferentes provisioners
- Escolher a StorageClass adequada para cada caso de uso
- Configurar a expansão de volumes
Introdução
Criar PersistentVolumes manualmente para cada solicitação de armazenamento é trabalhoso. As StorageClasses permitem o provisionamento dinâmico: o Kubernetes cria automaticamente um PV quando um PVC é criado.
O que é uma StorageClass?
Uma StorageClass descreve as classes de armazenamento disponíveis e permite o provisionamento dinâmico de PersistentVolumes. Ela define:
- O provisioner (como criar o volume)
- Os parâmetros (tipo de armazenamento, IOPS, etc.)
- A reclaim policy padrão
- Se a expansão de volume é permitida
Criação de uma StorageClass
Exemplo: StorageClass AWS EBS
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
iops: "3000"
throughput: "125"
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
Componentes:
- name: Nome da StorageClass
- provisioner: Plugin que cria o volume
- parameters: Parâmetros específicos do provisioner
- reclaimPolicy: Retain ou Delete (padrão)
- allowVolumeExpansion: Permite a expansão do volume
- volumeBindingMode: Immediate ou WaitForFirstConsumer
Provisioners
Provisioners em Nuvem
AWS EBS
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: aws-ebs-gp3
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
iops: "3000"
throughput: "125"
encrypted: "true"
kmsKeyId: "arn:aws:kms:..."
Azure Disk
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azure-disk-ssd
provisioner: kubernetes.io/azure-disk
parameters:
storageaccounttype: Premium_LRS
kind: managed
GCE Persistent Disk
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gce-pd-ssd
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-ssd
replication-type: regional-pd
Provisioners Locais
Local Storage
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
NFS
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage
provisioner: example.com/nfs
parameters:
server: nfs-server.example.com
path: /exports
Provisionamento Dinâmico
Criar um PVC com StorageClass
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-dynamic
spec:
storageClassName: fast-ssd
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Processo:
Resultado: O Kubernetes cria automaticamente um PV correspondente ao PVC.
Volume Binding Modes
Immediate
O PV é criado e vinculado imediatamente quando o PVC é criado.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: immediate-sc
provisioner: kubernetes.io/aws-ebs
volumeBindingMode: Immediate
Vantagens:
- PVC disponível imediatamente
- Sem espera
Desvantagens:
- Volume criado mesmo se não for utilizado
- Pode criar volumes no node incorreto
WaitForFirstConsumer
O PV é criado somente quando um Pod utiliza o PVC.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: wait-sc
provisioner: kubernetes.io/aws-ebs
volumeBindingMode: WaitForFirstConsumer
Vantagens:
- Volume criado no node correto
- Evita volumes não utilizados
Desvantagens:
- Atraso no primeiro mount
Expansão de Volumes
Ativar a Expansão
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: expandable-sc
provisioner: kubernetes.io/aws-ebs
allowVolumeExpansion: true
Expandir um Volume
- Modifique o PVC para solicitar mais armazenamento:
kubectl patch pvc pvc-dynamic -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'
- Verifique a expansão:
kubectl get pvc pvc-dynamic
Nota: A expansão é suportada somente se:
allowVolumeExpansion: truena StorageClass- O provisioner suporta expansão
- O sistema de arquivos suporta expansão (ext4, xfs)
Exemplo Completo
Etapa 1: Criar a StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: production-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
iops: "3000"
throughput: "125"
encrypted: "true"
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
Etapa 2: Criar o PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-data-pvc
spec:
storageClassName: production-ssd
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
Etapa 3: Usar em um Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: app
image: my-app:1.0
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: app-data-pvc
StorageClass Padrão
Definir uma StorageClass como Padrão
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: default-storage
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
Resultado: Os PVCs sem storageClassName usam esta StorageClass.
PVC Sem StorageClass
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
# Sem storageClassName = usa a StorageClass padrão
Comandos Úteis
Ver as StorageClasses
# Listar as StorageClasses
kubectl get storageclass
kubectl get sc
# Detalhes de uma StorageClass
kubectl describe storageclass fast-ssd
Ver os PVCs e PVs
# Listar os PVCs
kubectl get pvc
# Ver os PVs criados dinamicamente
kubectl get pv
# Detalhes de um PVC
kubectl describe pvc pvc-dynamic
Expansão de Volume
# Expandir um PVC
kubectl patch pvc pvc-dynamic -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'
# Verificar o estado
kubectl get pvc pvc-dynamic
Boas Práticas
1. Usar o Provisionamento Dinâmico
Prefira StorageClasses ao provisionamento manual para maior flexibilidade.
2. Escolher o Volume Binding Mode Adequado
- Immediate: Para volumes compartilhados (NFS)
- WaitForFirstConsumer: Para volumes locais (EBS, Azure Disk)
3. Ativar a Expansão
Ative allowVolumeExpansion: true para permitir expansão sem recriar.
4. Reclaim Policy Apropriada
- Retain: Para dados importantes
- Delete: Para dados temporários
5. Monitoramento
Monitore o uso e os custos do armazenamento.
Resumo
Neste capítulo, você aprendeu:
StorageClass: Descreve as classes de armazenamento e permite o provisionamento dinâmico
Provisionamento dinâmico: Criação automática de PVs quando um PVC é criado
Provisioners: Plugins que criam os volumes (EBS, Azure Disk, GCE PD, NFS, etc.)
Volume Binding Modes: Immediate (imediato) ou WaitForFirstConsumer (aguardar o Pod)
Expansão: Permite expandir um volume existente
StorageClass padrão: Usada quando nenhum storageClassName é especificado
Vantagens: Flexibilidade, automação, redução da gestão manual
Próximos Passos
Capítulo 6.4: StatefulSets com Armazenamento Persistente
Lab 6.3: StorageClasses e Provisionamento Dinâmico
Capítulo criado em: Dezembro 2024