Lab 6.2 - PersistentVolumes y PersistentVolumeClaims
Objetivos del Lab
Al final de este laboratorio, usted será capaz de:
- Crear un PersistentVolume (PV) manualmente.
- Crear un PersistentVolumeClaim (PVC).
- Vincular un PVC a un Pod.
- Comprender el ciclo de vida de un PV y un PVC.
- Verificar la persistencia de los datos.
Duración Estimada
45-60 minutos
Prerrequisitos
- kubectl instalado y configurado.
- Un clúster de Kubernetes local funcional (minikube o kind).
- Conocimientos sobre PersistentVolumes y PVCs (Capítulo 6.2).
Parte 1: Creación de un PersistentVolume
Vamos a crear un PersistentVolume manualmente. Para un clúster local (minikube/kind), utilizaremos un volumen de tipo hostPath que monta un directorio del nodo.
Paso 1.1: Crear el PersistentVolume
Cree un archivo pv-example.yaml:
# pv-example.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-example
labels:
type: local
spec:
storageClassName: manual # Nombre de la StorageClass (o "" para ninguna clase)
capacity:
storage: 1Gi # Tamaño del volumen
accessModes:
- ReadWriteOnce # RWO: solo un nodo puede montar en lectura-escritura
persistentVolumeReclaimPolicy: Retain # Qué hacer cuando se elimina el PVC: Retain, Delete, Recycle
hostPath:
path: /tmp/k8s-pv-example # Ruta en el nodo (para minikube/kind)
type: DirectoryOrCreate # Crear el directorio si no existe
Explicación:
storageClassName: manual: Indica que este PV es aprovisionado manualmente (no por una StorageClass).accessModes: ReadWriteOnce: El volumen puede ser montado en lectura-escritura por un solo nodo a la vez.persistentVolumeReclaimPolicy: Retain: Cuando se elimina el PVC, el PV se conserva (los datos no se eliminan).hostPath: Para un clúster local, usamos un directorio del nodo. En producción, se utilizarían volúmenes en la nube (EBS, Azure Disk, GCE Persistent Disk) o NFS.
Aplique el PersistentVolume:
kubectl apply -f pv-example.yaml
Verifique que el PV se haya creado:
kubectl get pv pv-example
Debería ver el PV con el estado Available (disponible, aún no vinculado a un PVC).
Verifique los detalles:
kubectl describe pv pv-example
Parte 2: Creación de un PersistentVolumeClaim
Un PVC solicita un volumen con características específicas (tamaño, modo de acceso, StorageClass).
Paso 2.1: Crear el PersistentVolumeClaim
Cree un archivo pvc-example.yaml:
# pvc-example.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-example
spec:
storageClassName: manual # Debe coincidir con el storageClassName del PV
accessModes:
- ReadWriteOnce # Debe coincidir o ser un subconjunto de los accessModes del PV
resources:
requests:
storage: 500Mi # Solicita 500 MiB (el PV tiene 1 GiB, así que funciona)
Explicación:
storageClassName: manual: El PVC busca un PV con esta StorageClass.accessModes: ReadWriteOnce: El PVC solicita un volumen con este modo de acceso.resources.requests.storage: 500Mi: El PVC solicita al menos 500 MiB.
Aplique el PersistentVolumeClaim:
kubectl apply -f pvc-example.yaml
Verifique que el PVC se haya creado y vinculado al PV:
kubectl get pvc pvc-example
Debería ver el PVC con el estado Bound (vinculado al PV).
Verifique que el PV ahora esté vinculado:
kubectl get pv pv-example
El estado debe ser Bound y la columna CLAIM debe indicar default/pvc-example.
Parte 3: Uso del PVC en un Pod
Ahora, vamos a crear un Pod que utilice el PVC para almacenar datos persistentes.
Paso 3.1: Crear un Pod con el PVC
Cree un archivo pod-with-pvc.yaml:
# pod-with-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-with-pvc
spec:
containers:
- name: app-container
image: busybox
command: ["/bin/sh", "-c"]
args: ["echo 'Données persistantes - $(date)' >> /data/persistent-data.txt && cat /data/persistent-data.txt && sleep 3600"]
volumeMounts:
- name: persistent-storage
mountPath: /data # Ruta donde el volumen será montado en el contenedor
volumes:
- name: persistent-storage
persistentVolumeClaim:
claimName: pvc-example # Nombre del PVC a utilizar
Aplique el Pod:
kubectl apply -f pod-with-pvc.yaml
Espere a que el Pod esté en estado Running:
kubectl get pods pod-with-pvc
Verifique los logs para ver los datos escritos:
kubectl logs pod-with-pvc
Debería ver el mensaje con la fecha.
Paso 3.2: Verificar la Persistencia
Elimine el Pod:
kubectl delete pod pod-with-pvc
Cree un nuevo Pod que lea los datos:
# pod-read-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-read-pvc
spec:
containers:
- name: app-container
image: busybox
command: ["/bin/sh", "-c"]
args: ["cat /data/persistent-data.txt && sleep 3600"]
volumeMounts:
- name: persistent-storage
mountPath: /data
volumes:
- name: persistent-storage
persistentVolumeClaim:
claimName: pvc-example
Aplique el nuevo Pod:
kubectl apply -f pod-read-pvc.yaml
Verifique los logs:
kubectl logs pod-read-pvc
Debería ver los datos escritos por el primer Pod, ¡lo que prueba la persistencia!
Parte 4: Limpieza
Elimine los recursos creados:
kubectl delete pod pod-read-pvc
kubectl delete -f pvc-example.yaml
kubectl delete -f pv-example.yaml
Nota: Con persistentVolumeReclaimPolicy: Retain, incluso después de eliminar el PVC, el PV permanece con el estado Released. Los datos se conservan. Para eliminar completamente el PV, debe eliminarlo manualmente:
kubectl delete pv pv-example
Resumen del Lab
En este laboratorio, usted exploró los PersistentVolumes y PersistentVolumeClaims. Aprendió a crear un PV manualmente, a crear un PVC que se vincula automáticamente al PV, y a utilizar el PVC en un Pod para almacenar datos persistentes. También verificó que los datos sobreviven a la eliminación y recreación de los Pods.
Próximos Pasos
El próximo laboratorio le introducirá a las StorageClasses y al aprovisionamiento dinámico, que simplifican enormemente la gestión del almacenamiento.
Lab 6.3: StorageClasses y Aprovisionamiento Dinámico
Lab creado el: Diciembre 2024