Pular para o conteúdo principal

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​

  1. Modifique o PVC para solicitar mais armazenamento:
kubectl patch pvc pvc-dynamic -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'
  1. Verifique a expansão:
kubectl get pvc pvc-dynamic

Nota: A expansão é suportada somente se:

  • allowVolumeExpansion: true na 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