Saltar al contenido principal

Lab 6.3 - StorageClasses y Aprovisionamiento Dinámico

Objetivos del Lab​

Al final de este laboratorio, usted será capaz de:

  • Comprender el concepto de StorageClass.
  • Crear una StorageClass personalizada.
  • Utilizar el aprovisionamiento dinámico con un PVC.
  • Comprender los diferentes tipos de provisioners.
  • Verificar el aprovisionamiento automático de PVs.

Duración Estimada​

45-60 minutos

Prerrequisitos​

  • kubectl instalado y configurado.
  • Cluster Kubernetes local funcional (minikube o kind).
  • Conocimientos sobre las StorageClasses (Capítulo 6.3).

Parte 1: Comprender las StorageClasses​

Una StorageClass define un "tipo" de almacenamiento con características (provisioner, parámetros, reclamación). Permite el aprovisionamiento dinámico de PersistentVolumes.

Paso 1.1: Listar las StorageClasses Existentes​

Verifique las StorageClasses disponibles en su cluster:

kubectl get storageclass
# o
kubectl get sc

En minikube, debería ver una StorageClass por defecto (ej: standard o hostpath). En kind, puede haber standard o ninguna.

Verifique los detalles de una StorageClass:

kubectl describe storageclass <nombre-de-la-storageclass>

Parte 2: Creación de una StorageClass Personalizada​

Para un cluster local, crearemos una StorageClass que utiliza hostPath como provisioner (a través de un provisioner local o manual).

Paso 2.1: Crear una StorageClass​

Cree un archivo storageclass-local.yaml:

# storageclass-local.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner # No hay aprovisionamiento automático para hostPath
volumeBindingMode: WaitForFirstConsumer # Esperar a que un Pod use el PVC antes de crear el PV
allowVolumeExpansion: false # No permite la expansión del volumen

Explicación:

  • provisioner: kubernetes.io/no-provisioner: Indica que no hay aprovisionamiento automático. Para un cluster local con hostPath, debemos crear los PVs manualmente, pero la StorageClass permite agruparlos.
  • volumeBindingMode: WaitForFirstConsumer: El PVC espera a que se cree un Pod antes de enlazar el PV. Esto permite al scheduler elegir el nodo correcto.
  • allowVolumeExpansion: false: Los volúmenes no pueden ser ampliados después de su creación.

Aplique la StorageClass:

kubectl apply -f storageclass-local.yaml

Verifique que fue creada:

kubectl get storageclass local-storage

Parte 3: Aprovisionamiento Dinámico (Simulación)​

Para un verdadero aprovisionamiento dinámico, necesitaría un provisioner como:

  • kubernetes.io/aws-ebs (AWS)
  • kubernetes.io/azure-disk (Azure)
  • kubernetes.io/gce-pd (GCP)
  • kubernetes.io/cinder (OpenStack)

En minikube, puede usar el provisioner k8s.io/minikube-hostpath si está disponible.

Paso 3.1: Crear una StorageClass con Aprovisionamiento Dinámico (minikube)​

Si utiliza minikube, cree una StorageClass que use el provisioner de minikube:

# storageclass-minikube.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: minikube-dynamic
provisioner: k8s.io/minikube-hostpath # Provisioner de minikube
volumeBindingMode: Immediate # Enlazar inmediatamente
reclaimPolicy: Delete # Eliminar el PV cuando el PVC sea eliminado
allowVolumeExpansion: true # Permitir la expansión

Aplíquela:

kubectl apply -f storageclass-minikube.yaml

Paso 3.2: Crear un PVC con la StorageClass​

Cree un archivo pvc-dynamic.yaml:

# pvc-dynamic.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-dynamic
spec:
storageClassName: minikube-dynamic # Usa la StorageClass con aprovisionamiento dinámico
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi

Aplique el PVC:

kubectl apply -f pvc-dynamic.yaml

Verifique que el PVC fue creado y que un PV fue aprovisionado automáticamente:

kubectl get pvc pvc-dynamic
kubectl get pv

Debería ver un nuevo PV creado automáticamente con el estado Bound y enlazado al PVC.


Parte 4: Uso del PVC Dinámico​

Cree un Pod que utilice el 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 'Datos en un volumen 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 el Pod:

kubectl apply -f pod-dynamic-pvc.yaml

Verifique los logs:

kubectl logs pod-dynamic-pvc

Parte 5: Expansión de Volumen (Opcional)​

Si allowVolumeExpansion: true, puede ampliar un PVC después de su creación.

Modifique el PVC para solicitar más espacio:

kubectl patch pvc pvc-dynamic -p '{"spec":{"resources":{"requests":{"storage":"200Mi"}}}}'

Verifique que la solicitud fue actualizada:

kubectl get pvc pvc-dynamic

Nota: La expansión real del volumen depende del provisioner y del tipo de almacenamiento subyacente.


Parte 6: Limpieza​

Elimine los recursos creados:

kubectl delete pod pod-dynamic-pvc
kubectl delete -f pvc-dynamic.yaml
# El PV será eliminado automáticamente si reclaimPolicy: Delete
kubectl delete -f storageclass-minikube.yaml
kubectl delete -f storageclass-local.yaml

Resumen del Lab​

En este laboratorio, usted exploró las StorageClasses y el aprovisionamiento dinámico. Aprendió a crear StorageClasses personalizadas, a utilizar el aprovisionamiento automático de PVs mediante PVCs, y a comprender los diferentes modos de enlace y políticas de reclamación.


Próximos Pasos​

El último laboratorio de este módulo le mostrará cómo utilizar los PersistentVolumes con StatefulSets para aplicaciones con estado.

Lab 6.4: StatefulSet con Almacenamiento Persistente


Lab creado el: Diciembre 2024