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