Skip to main content

Volúmenes

image.png

En Kubernetes, un volumen es una forma de proporcionar almacenamiento persistente a los pods y sus contenedores. Los volúmenes permiten que los datos persistan más allá de la vida de un pod individual (ya que los pods son efímeros y sus datos locales se pierden cuando son eliminados).

📦 Tipos de volúmenes en Kubernetes

Kubernetes soporta distintos tipos de volúmenes dependiendo del caso de uso y del proveedor de infraestructura.

  1. emptyDir:

    • Crea un volumen vacío cuando el pod se inicializa.

    • Se borra cuando el pod muere.

    • Útil para almacenamiento temporal (caches, etc.).

  2. hostPath:

    • Monta una carpeta del nodo físico (host) dentro del contenedor.

    • No es recomendable para producción, pero útil para pruebas locales.

  3. persistentVolumeClaim (PVC):

    • Solicita almacenamiento persistente a través de un PersistentVolume.

    • Es la forma estándar de montar almacenamiento duradero en Kubernetes.

  4. configMap / secret:

    • Permiten montar configuraciones o secretos como archivos dentro de los pods.

  5. nfs:

    • Monta un volumen compartido a través de un servidor NFS externo.

  6. cloud-specific (AWS EBS, GCE Persistent Disk, Azure Disk):

    • Volúmenes gestionados por proveedores cloud que pueden ser montados como almacenamiento persistente.


🗂️ Relación entre PersistentVolume (PV) y PersistentVolumeClaim (PVC)

  • PersistentVolume (PV):
    Es el recurso que representa un bloque de almacenamiento real en el clúster, como un disco EBS, un disco local o un volumen NFS.

  • PersistentVolumeClaim (PVC):
    Es una petición de almacenamiento por parte de un pod o aplicación. El PVC "reclama" un PV disponible según el tamaño y las características que necesita.


🔧 Manifiesto de PVC + Pod

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: mypod-pvc
spec:
  containers:
  - name: myapp
    image: nginx
    volumeMounts:
    - mountPath: "/usr/share/nginx/html"
      name: myvolume
  volumes:
  - name: myvolume
    persistentVolumeClaim:
      claimName: mypvc