Saltar al contenido principal

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