Una guía sencilla para implementar almacenamiento persistente en Kubernetes

Aprende cómo implementar almacenamiento persistente para aplicaciones con estado en Kubernetes. Esta guía desmitifica los PersistentVolumes (PVs) y PersistentVolumeClaims (PVCs), explicando los modos de acceso y las StorageClasses. Incluye ejemplos prácticos en YAML para definir PVCs y montar almacenamiento en tus Pods, lo que permite una persistencia de datos fiable en tus aplicaciones en contenedores.

34 vistas

Una guía sencilla para implementar almacenamiento persistente en Kubernetes

En el mundo de la orquestación de contenedores, Kubernetes sobresale en la gestión de aplicaciones sin estado: aquellas que no necesitan retener datos entre reinicios o eventos de escalado. Sin embargo, muchas aplicaciones modernas, como bases de datos, colas de mensajes y almacenes de clave-valor, son inherentemente con estado. Estas aplicaciones requieren una forma fiable de almacenar y acceder a los datos de forma persistente, incluso si los Pods que las ejecutan se reprograman o reemplazan. Aquí es donde entra en juego el Almacenamiento Persistente de Kubernetes.

Esta guía desmitificará los conceptos de Volúmenes Persistentes (PVs) y Reclamaciones de Volumen Persistente (PVCs), que son los componentes centrales para gestionar el almacenamiento persistente en Kubernetes. Recorreremos cómo definir, solicitar y enlazar almacenamiento a sus Pods con ejemplos prácticos de YAML, permitiéndole implementar con confianza aplicaciones con estado en su clúster de Kubernetes.

Comprensión de los Volúmenes Persistentes (PVs) y las Reclamaciones de Volumen Persistente (PVCs)

Antes de sumergirnos en la implementación, es crucial comprender los roles de los PVs y las PVCs:

  • Volumen Persistente (PV): Un PV es una porción de almacenamiento en el clúster que ha sido aprovisionada por un administrador o aprovisionada dinámicamente mediante Clases de Almacenamiento (StorageClasses). Los PVs son recursos del clúster, muy parecidos a los Nodos. Tienen un ciclo de vida independiente de cualquier Pod individual que utilice el PV. Los PVs abstraen los detalles de implementación del almacenamiento subyacente (por ejemplo, NFS, iSCSI, almacenamiento en bloque del proveedor de la nube).
  • Reclamación de Volumen Persistente (PVC): Una PVC es una solicitud de almacenamiento por parte de un usuario. Consume recursos de almacenamiento que están disponibles en el clúster como PVs. Las PVCs son similares a los Pods en el sentido de que consumen recursos informáticos, y están limitadas a un espacio de nombres (namespace). Una PVC especifica la capacidad de almacenamiento deseada, los modos de acceso y, opcionalmente, una Clase de Almacenamiento.

Esta separación de responsabilidades permite a los administradores del clúster aprovisionar y gestionar los recursos de almacenamiento de forma independiente, mientras que los desarrolladores de aplicaciones pueden solicitar almacenamiento sin necesidad de conocer los detalles de la implementación subyacente.

Conceptos clave: Modos de Acceso y Clases de Almacenamiento

Dos conceptos importantes que hay que comprender al trabajar con PVs y PVCs son los Modos de Acceso y las Clases de Almacenamiento:

Modos de Acceso

Los modos de acceso definen cómo se puede montar un volumen en un Pod. Los modos de acceso disponibles son:

  • ReadWriteOnce (RWO): El volumen se puede montar como lectura-escritura por un solo nodo.
  • ReadOnlyMany (ROX): El volumen se puede montar como solo lectura por muchos nodos.
  • ReadWriteMany (RWX): El volumen se puede montar como lectura-escritura por muchos nodos.

Es importante señalar que el soporte real para estos modos depende del proveedor de almacenamiento subyacente.

Clases de Almacenamiento (StorageClasses)

Una Clase de Almacenamiento proporciona una forma para que los administradores describan las "clases" de almacenamiento que ofrecen. Las diferentes clases pueden mapearse a niveles de calidad de servicio, políticas de copia de seguridad o políticas arbitrarias determinadas por los administradores del clúster. Una Clase de Almacenamiento tiene un provisionador que aprovisiona el almacenamiento y un conjunto de parámetros para ese provisionador. Cuando se crea una PVC sin un PV específico, y solicita una Clase de Almacenamiento, Kubernetes aprovisionará dinámicamente un PV utilizando la Clase de Almacenamiento especificada.

Implementación del Almacenamiento Persistente: Paso a Paso

Recorramos un escenario común: solicitar y utilizar almacenamiento persistente para un Pod.

Paso 1: Definir una Reclamación de Volumen Persistente (PVC)

Primero, debe crear una PVC que especifique sus requisitos de almacenamiento. Esta PVC actuará como la solicitud de almacenamiento de su aplicación.

Ejemplo pvc.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

En este ejemplo:

  • name: my-pvc: Este es el nombre de nuestra PVC.
  • accessModes: - ReadWriteOnce: Estamos solicitando almacenamiento que pueda montarse como lectura-escritura por un solo nodo.
  • resources.requests.storage: 1Gi: Estamos solicitando 1 Gigabyte de almacenamiento.

Aplicación de la PVC:

Guarde el contenido anterior en un archivo llamado pvc.yaml y aplíquelo a su clúster:

kubectl apply -f pvc.yaml

Después de aplicar, puede verificar el estado de la PVC:

kubectl get pvc my-pvc

Debería ver una salida que indica que la PVC está Bound (Enlazada) si hay disponible un PV adecuado o si se ha aprovisionado dinámicamente.

Paso 2: Crear un Pod que utilice la PVC

Ahora, creemos un Pod que utilizará el almacenamiento solicitado por nuestra PVC. Montaremos el volumen proporcionado por la PVC en un directorio específico dentro de nuestro contenedor.

Ejemplo pod-with-pv.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: my-stateful-pod
spec:
  containers:
    - name: my-container
      image: nginx
      ports:
        - containerPort: 80
      volumeMounts:
        - name: my-persistent-storage
          mountPath: /usr/share/nginx/html
  volumes:
    - name: my-persistent-storage
      persistentVolumeClaim:
        claimName: my-pvc

En este ejemplo:

  • volumes: Definimos un volumen llamado my-persistent-storage.
  • persistentVolumeClaim.claimName: my-pvc: Esto enlaza nuestro volumen a la PVC que creamos anteriormente.
  • volumeMounts: Dentro de la definición del contenedor, especificamos dónde debe montarse este volumen (mountPath: /usr/share/nginx/html).

Aplicación del Pod:

Guarde el contenido anterior en un archivo llamado pod-with-pv.yaml y aplíquelo:

kubectl apply -f pod-with-pv.yaml

Ahora, su contenedor nginx tendrá acceso al almacenamiento persistente definido por my-pvc en la ruta /usr/share/nginx/html. Cualquier dato escrito en esta ruta dentro del contenedor persistirá incluso si el Pod se elimina y se recrea, siempre y cuando la PVC y su PV subyacente permanezcan.

Aprovisionamiento Dinámico con Clases de Almacenamiento

Crear PVs manualmente puede ser engorroso. Kubernetes ofrece el aprovisionamiento dinámico, donde los PVs se crean automáticamente cuando una PVC solicita almacenamiento que no puede ser satisfecho por PVs existentes. Esto se logra a través de las Clases de Almacenamiento.

La mayoría de los proveedores de la nube (AWS, GCP, Azure) ofrecen Clases de Almacenamiento preconfiguradas. Puede inspeccionarlas con:

kubectl get storageclass

Para utilizar el aprovisionamiento dinámico, simplemente añada un campo storageClassName a su definición de PVC:

Ejemplo pvc-dynamic.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-dynamic-pvc
spec:
  storageClassName: standard # Reemplace 'standard' con un nombre de StorageClass real
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

Cuando aplique esta PVC, Kubernetes buscará una Clase de Almacenamiento llamada standard (o el nombre que especifique) e instruirá a su provisionador para que cree un nuevo PV de 5Gi y lo enlace a esta PVC.

Consejos y Mejores Prácticas

  • Elija el Modo de Acceso Correcto: Considere cuidadosamente el modo de acceso requerido por su aplicación. ReadWriteOnce es común para bases de datos de réplica única, mientras que ReadWriteMany es necesario para sistemas de archivos compartidos utilizados por varios Pods.
  • Comprenda el Rendimiento del Almacenamiento: Diferentes proveedores de almacenamiento y Clases de Almacenamiento ofrecen distintas características de rendimiento (IOPS, rendimiento). Elija una Clase de Almacenamiento que satisfaga las necesidades de rendimiento de su aplicación.
  • Estrategia de Copia de Seguridad: El almacenamiento persistente no significa automáticamente copia de seguridad. Implemente una estrategia de copia de seguridad robusta para sus volúmenes persistentes, especialmente para datos críticos.
  • Política de Reclamación del PV: Los PVs tienen una reclaimPolicy que puede ser Delete (predeterminada), Retain (Conservar) o Recycle (obsoleto). Retain es útil para garantizar que los datos no se pierdan si se elimina un PV pero el almacenamiento subyacente aún existe.
  • Consideraciones de Espacios de Nombres: Las PVCs están ligadas a un espacio de nombres. Asegúrese de que su Pod y su PVC estén en el mismo espacio de nombres para que se produzca el enlace.

Conclusión

Implementar el almacenamiento persistente es un requisito fundamental para ejecutar aplicaciones con estado en Kubernetes. Al comprender y utilizar los Volúmenes Persistentes y las Reclamaciones de Volumen Persistente, junto con la flexibilidad de las Clases de Almacenamiento, puede gestionar de forma fiable los datos de su aplicación. Esta guía ha proporcionado los conocimientos fundamentales y ejemplos prácticos para que comience, permitiéndole implementar cargas de trabajo con estado más sofisticadas y resilientes en Kubernetes.