Saltar al contenido principal

Capítulo 6.3 - StorageClasses y Aprovisionamiento Dinámico

Objetivos de Aprendizaje​

Al final de este capítulo, usted será capaz de:

  • Comprender qué es una StorageClass
  • Configurar el aprovisionamiento dinámico
  • Crear y utilizar StorageClasses
  • Comprender los diferentes provisioners
  • Elegir la StorageClass adecuada según el caso de uso
  • Configurar la expansión de volúmenes

Introducción​

Crear PersistentVolumes manualmente para cada solicitud de almacenamiento es tedioso. Las StorageClasses permiten el aprovisionamiento dinámico: Kubernetes crea automáticamente un PV cuando se crea un PVC.


¿Qué es una StorageClass?​

Una StorageClass describe las clases de almacenamiento disponibles y permite el aprovisionamiento dinámico de PersistentVolumes. Define:

  • El provisioner (cómo crear el volumen)
  • Los parámetros (tipo de almacenamiento, IOPS, etc.)
  • La reclaim policy por defecto
  • Si se permite la expansión de volumen

Creación de una StorageClass​

Ejemplo: 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: Nombre de la StorageClass
  • provisioner: Plugin que crea el volumen
  • parameters: Parámetros específicos del provisioner
  • reclaimPolicy: Retain o Delete (por defecto)
  • allowVolumeExpansion: Permite la expansión del volumen
  • volumeBindingMode: Immediate o WaitForFirstConsumer

Provisioners​

Provisioners en la Nube​

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 Locales​

Almacenamiento Local​

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

Aprovisionamiento Dinámico​

Crear un PVC con StorageClass​

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-dynamic
spec:
storageClassName: fast-ssd
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi

Proceso:

Resultado: Kubernetes crea automáticamente un PV correspondiente al PVC.


Volume Binding Modes​

Immediate​

El PV se crea y enlaza inmediatamente cuando se crea el PVC.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: immediate-sc
provisioner: kubernetes.io/aws-ebs
volumeBindingMode: Immediate

Ventajas:

  • El PVC está disponible inmediatamente
  • Sin esperas

Desventajas:

  • El volumen se crea aunque no se utilice
  • Puede crear volúmenes en el nodo incorrecto

WaitForFirstConsumer​

El PV se crea solo cuando un Pod utiliza el PVC.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: wait-sc
provisioner: kubernetes.io/aws-ebs
volumeBindingMode: WaitForFirstConsumer

Ventajas:

  • El volumen se crea en el nodo correcto
  • Evita volúmenes no utilizados

Desventajas:

  • Retraso en el primer montaje

Expansión de Volúmenes​

Activar la Expansión​

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: expandable-sc
provisioner: kubernetes.io/aws-ebs
allowVolumeExpansion: true

Ampliar un Volumen​

  1. Modificar el PVC para solicitar más almacenamiento:
kubectl patch pvc pvc-dynamic -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'
  1. Verificar la expansión:
kubectl get pvc pvc-dynamic

Nota: La expansión solo es compatible si:

  • allowVolumeExpansion: true en la StorageClass
  • El provisioner soporta la expansión
  • El sistema de archivos soporta la expansión (ext4, xfs)

Ejemplo Completo​

Paso 1: Crear la 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

Paso 2: Crear el PVC​

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-data-pvc
spec:
storageClassName: production-ssd
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi

Paso 3: Usar en un 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 por Defecto​

Definir una StorageClass por Defecto​

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: Los PVCs sin storageClassName utilizan esta StorageClass.

PVC Sin StorageClass​

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
# Pas de storageClassName = utilise la StorageClass par défaut

Comandos Útiles​

Ver las StorageClasses​

# Lister les StorageClasses
kubectl get storageclass
kubectl get sc

# Détails d'une StorageClass
kubectl describe storageclass fast-ssd

Ver los PVCs y PVs​

# Lister les PVCs
kubectl get pvc

# Voir les PVs créés dynamiquement
kubectl get pv

# Détails d'un PVC
kubectl describe pvc pvc-dynamic

Expansión de Volumen​

# Agrandir un PVC
kubectl patch pvc pvc-dynamic -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'

# Vérifier l'état
kubectl get pvc pvc-dynamic

Buenas Prácticas​

1. Utilizar el Aprovisionamiento Dinámico​

Prefiera las StorageClasses sobre el aprovisionamiento manual para mayor flexibilidad.

2. Elegir el Modo de Enlace de Volumen Correcto​

  • Immediate: Para volúmenes compartidos (NFS)
  • WaitForFirstConsumer: Para volúmenes locales (EBS, Azure Disk)

3. Activar la Expansión​

Active allowVolumeExpansion: true para permitir la ampliación sin recrear.

4. Política de Reclamación Apropiada​

  • Retain: Para datos importantes
  • Delete: Para datos temporales

5. Monitoreo​

Supervise el uso y los costos del almacenamiento.


Resumen​

En este capítulo, usted ha aprendido:

StorageClass: Describe las clases de almacenamiento y permite el aprovisionamiento dinámico
Aprovisionamiento dinámico: Creación automática de PVs cuando se crea un PVC
Provisioners: Plugins que crean los volúmenes (EBS, Azure Disk, GCE PD, NFS, etc.)
Volume Binding Modes: Immediate (inmediato) o WaitForFirstConsumer (esperar al Pod)
Expansión: Permite ampliar un volumen existente
StorageClass por defecto: Se utiliza cuando no se especifica ningún storageClassName
Ventajas: Flexibilidad, automatización, reducción de la gestión manual


Próximos Pasos​

Capítulo 6.4: StatefulSets con Almacenamiento Persistente
Lab 6.3: StorageClasses y Aprovisionamiento Dinámico


Capítulo creado el: Diciembre 2024