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
- Modificar el PVC para solicitar más almacenamiento:
kubectl patch pvc pvc-dynamic -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'
- Verificar la expansión:
kubectl get pvc pvc-dynamic
Nota: La expansión solo es compatible si:
allowVolumeExpansion: trueen 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