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