Saltar al contenido principal

Capítulo 6.2 - PersistentVolumes y PersistentVolumeClaims

Objetivos de Aprendizaje​

Al final de este capítulo, usted será capaz de:

  • Comprender PersistentVolumes (PV) y PersistentVolumeClaims (PVC)
  • Crear y utilizar PVs y PVCs
  • Comprender los access modes (RWO, ROX, RWX)
  • Gestionar el ciclo de vida del almacenamiento
  • Comprender las reclaim policies
  • Elegir el tipo de almacenamiento adecuado según el caso de uso

Introducción​

Los volúmenes efímeros (emptyDir, tmpfs) se eliminan cuando el Pod termina. Para los datos importantes que deben persistir (bases de datos, archivos de usuario, etc.), Kubernetes utiliza PersistentVolumes y PersistentVolumeClaims.


Conceptos Clave​

PersistentVolume (PV)​

Un PersistentVolume es un recurso de almacenamiento en el clúster que ha sido aprovisionado por un administrador. Es un recurso a nivel de clúster, independiente de los Pods.

PersistentVolumeClaim (PVC)​

Un PersistentVolumeClaim es una solicitud de almacenamiento por parte de un usuario. El PVC vincula un PV a un Pod.


Creación de un PersistentVolume​

Ejemplo: PV con hostPath (Desarrollo Local)​

apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-volume
labels:
type: local
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
hostPath:
path: /data/pv-volume

Nota: hostPath es solo para desarrollo local. En producción, utilice soluciones en la nube (EBS, Azure Disk, GCE Persistent Disk) o NFS.

Ejemplo: PV con NFS​

apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
server: nfs-server.example.com
path: /exports/data

Creación de un PersistentVolumeClaim​

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: manual

Proceso de vinculación:


Access Modes​

Los access modes determinan cómo se puede montar el volumen:

ReadWriteOnce (RWO)​

  • Solo un nodo puede montar el volumen en lectura-escritura
  • Varios Pods en el mismo nodo pueden compartir el volumen
  • Casos de uso: Bases de datos, aplicaciones con estado

ReadOnlyMany (ROX)​

  • Varios nodos pueden montar el volumen en solo lectura
  • Casos de uso: Archivos de configuración de solo lectura, datos compartidos

ReadWriteMany (RWX)​

  • Varios nodos pueden montar el volumen en lectura-escritura
  • Casos de uso: Sistemas de archivos compartidos (NFS, GlusterFS)

Uso en un Pod​

apiVersion: v1
kind: Pod
metadata:
name: pv-pod
spec:
containers:
- name: app
image: nginx:1.20
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: pv-claim

Flujo completo:


Reclaim Policies​

La reclaim policy determina qué sucede con el PV cuando se elimina el PVC.

Retain​

El PV se conserva incluso después de eliminar el PVC. Los datos permanecen intactos.

Casos de uso:

  • Datos importantes a respaldar
  • Necesidad de recuperación manual
  • Cumplimiento y auditoría

Delete​

El PV se elimina automáticamente junto con el PVC. Los datos se pierden.

Casos de uso:

  • Datos temporales
  • Entornos de desarrollo
  • Aprovisionamiento dinámico

Recycle (Obsoleto)​

Esta política está obsoleta. Utilice Retain o Delete en su lugar.


Ejemplo Completo: Base de Datos​

Paso 1: Crear el PersistentVolume​

apiVersion: v1
kind: PersistentVolume
metadata:
name: postgres-pv
labels:
app: postgres
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: fast-ssd
hostPath:
path: /data/postgres

Paso 2: Crear el PersistentVolumeClaim​

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
storageClassName: fast-ssd

Paso 3: Usar en un Deployment​

apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:14
env:
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
volumeMounts:
- name: postgres-storage
mountPath: /var/lib/postgresql/data
volumes:
- name: postgres-storage
persistentVolumeClaim:
claimName: postgres-pvc

Comandos Útiles​

Ver los PVs y PVCs​

# Listar los PVs
kubectl get pv

# Detalles de un PV
kubectl describe pv pv-volume

# Listar los PVCs
kubectl get pvc

# Detalles de un PVC
kubectl describe pvc pv-claim

Verificar la Vinculación​

# Ver el estado de vinculación
kubectl get pv
kubectl get pvc

# Ver los detalles
kubectl get pv pv-volume -o yaml
kubectl get pvc pv-claim -o yaml

Eliminar un PVC​

# Eliminar el PVC
kubectl delete pvc pv-claim

# Verificar el estado del PV después de la eliminación
kubectl get pv pv-volume

Tipos de Almacenamiento​

Almacenamiento Local (hostPath)​

Ventajas:

  • Simple para desarrollo
  • Sin dependencia externa

Desventajas:

  • No es portable
  • Riesgo de pérdida de datos
  • No funciona con varios nodos

Uso: Solo desarrollo local

NFS (Network File System)​

Ventajas:

  • Soporta ReadWriteMany
  • Compartible entre nodos
  • Fácil de configurar

Desventajas:

  • Rendimiento limitado
  • Punto único de falla
  • Requiere un servidor NFS

Uso: Archivos compartidos, aplicaciones colaborativas

Cloud Storage (EBS, Azure Disk, GCE PD)​

Ventajas:

  • Alto rendimiento
  • Integración nativa con la nube
  • Aprovisionamiento dinámico
  • Snapshots automáticos

Desventajas:

  • Costo según uso
  • Dependencia del proveedor de la nube

Uso: Producción, aplicaciones críticas


Buenas Prácticas​

1. Usar StorageClasses​

Prefiera el aprovisionamiento dinámico con StorageClasses en lugar de la creación manual de PVs.

2. Elegir la Reclaim Policy Adecuada​

  • Retain: Para datos importantes
  • Delete: Para datos temporales

3. Tamaño Apropiado​

No sobreasigne. Comience pequeño y amplíe si es necesario (con allowVolumeExpansion: true).

4. Backups​

Implemente respaldos regulares para los datos importantes.

5. Monitoreo​

Supervise el uso del almacenamiento para evitar el agotamiento.


Resumen​

En este capítulo, usted ha aprendido:

PersistentVolume (PV): Recurso de almacenamiento a nivel de clúster
PersistentVolumeClaim (PVC): Solicitud de almacenamiento por parte de un usuario
Access Modes: RWO (un nodo), ROX (varios nodos solo lectura), RWX (varios nodos lectura-escritura)
Reclaim Policy: Retain (conservar) o Delete (eliminar)
Tipos de almacenamiento: hostPath (dev), NFS (compartido), Cloud (producción)
Uso: Vía persistentVolumeClaim en los Pods
Buenas prácticas: StorageClasses, tamaño apropiado, respaldos


Próximos Pasos​

Capítulo 6.3: StorageClasses y Aprovisionamiento Dinámico
Lab 6.2: PersistentVolumes y PVCs


Capítulo creado el: Diciembre 2024