Kubernetes Persistent Volume: tipos y creación
Los Persistent Volumes (PV) en Kubernetes desempeñan un papel crucial en la gestión eficiente de los datos en los clústeres de Kubernetes. Abstraen los datos y permiten un almacenamiento coherente a lo largo de los ciclos de vida de los pods.
¿Qué es un Kubernetes Persistent Volume?
Un Persistent Volume (PV) en Kubernetes es un recurso fundamental dentro de la orquestación de Kubernetes, diseñado para una gestión eficiente y escalable de datos en clústeres de contenedores. El propósito de un PV es proporcionar un área de almacenamiento estandarizada y persistente. Un PV puede ser utilizado por diferentes pods, independientemente de los recursos de almacenamiento físico a los que acceda el clúster. Esto crea un nivel más alto de abstracción, separando los detalles de almacenamiento de la lógica de aplicación.
Los PV existen en forma estática y dinámica. En la forma estática, los recursos de almacenamiento están predefinidos manualmente, mientras que en la forma dinámica los PV se crean automáticamente cuando un pod tiene requisitos específicos de almacenamiento. Esta flexibilidad garantiza una gestión eficiente de datos persistentes en clústeres de Kubernetes, lo que hace que las aplicaciones sean robustas y escalables.
La orquestación de clústeres con Kubernetes también es fácil de realizar con IONOS. Con la Cloud Empresarial, obtendrás la última tecnología de infraestructura como servicio (IaaS) y soluciones adaptadas a tu proyecto.
¿Cuál es la diferencia entre volumen y volumen persistente?
Existen dos tipos básicos de volúmenes de almacenamiento en Kubernetes: volúmenes y volúmenes persistentes. Un volumen normal está ligado a la vida útil de un único pod. Se declara directamente en la configuración del pod y se utiliza principalmente para el almacenamiento temporal de datos durante la ejecución del pod asociado. Cuando el pod se termina, el volumen normal también se libera y todos los datos que contiene se eliminan.
Por el contrario, un Persistent Volume en Kubernetes tiene una vida útil más larga y es independiente de un pod específico. Puede ser reclamado y liberado por múltiples pods en diferentes ciclos de vida. Los volúmenes persistentes se declaran por separado de los pods y luego se vinculan a los Persistent Volume Claims (PVC). La vinculación entre un PVC y un PV se realiza de forma dinámica o manual. Los volúmenes persistentes son ideales para datos que necesitan persistir más allá de la vida útil de un único pod y proporcionan una forma de compartir y almacenar datos entre diferentes pods, incluso si se crean o eliminan pods.
¿Qué tipos de volúmenes persistentes existen?
En Kubernetes existen diferentes tipos de Persistent Volumes que representan diferentes soluciones y tecnologías de almacenamiento. Estos son algunos de los tipos más comunes de volúmenes persistentes:
hostPath
: el tipo HostPath enlaza un volumen persistente a una ruta en el nodo anfitrión en el clúster de Kubernetes. Esto permite el acceso a los recursos de almacenamiento local del anfitrión y es adecuado para entornos de desarrollo y prueba. Sin embargo, debe usarse con precaución en entornos de producción, ya que los datos no se replican entre los nodos.emptyDir
: este tipo crea un volumen temporal y vacío cada vez que se crea un pod. Es adecuado para datos temporales o el intercambio de datos entre contenedores dentro del mismo pod. Sin embargo, el volumen se elimina cuando el pod se termina.GCEPersistentDisk
,AWSElasticBlockStore
,AzureDisk
,AzureFile
: estos tipos enlazan un volumen persistente a soluciones de almacenamiento en la nube externas como Google Compute Engine Persistent Disks, Amazon EBS Volumes o Azure Disks y Azure File Shares. Ofrecen una manera de persistir datos entre pods e incluso entre clústeres y son adecuados para aplicaciones implementadas en entornos de nube.nfs
(Network File System): los PV del tipo NFS se conectan a un recurso compartido de red proporcionado por el Network File System (NFS). Esto permite el uso compartido de datos entre diferentes pods y es útil cuando varios pods necesitan acceder a archivos comunes.iscsi
(Internet Small Computer System Interface): los PV basados en ISCSI se conectan a dispositivos de almacenamiento en bloque disponibles a través del protocolo ISCSI. Es una forma de utilizar dispositivos de almacenamiento en bloque externos en clústeres de Kubernetes y ofrece una solución flexible y escalable para datos persistentes.local
: el tipo local permite el acceso directo a los recursos de almacenamiento físico en el nodo local dentro del clúster de Kubernetes. Esto es muy útil para aplicaciones que dependen del almacenamiento local rápido. Sin embargo, se debe tener precaución, ya que los recursos de almacenamiento local no se replican entre nodos y los datos pueden perderse si el nodo falla.csi
(Container Storage Interface): el tipo CSI permite integrar proveedores de almacenamiento externos a través del Container Storage Interface. Los sistemas de orquestación de contenedores como Kubernetes pueden comunicarse con diversas soluciones de almacenamiento externas. Esto crea flexibilidad y permite el uso de una amplia gama de sistemas de almacenamiento compatibles con CSI.cephfs
: CephFS es un sistema de archivos distribuido y los volúmenes persistentes del tipo CephFS están vinculados a este sistema de archivos distribuido. Este tipo de PV se utiliza para aplicaciones que requieren acceso compartido a archivos y operan en un entorno de almacenamiento distribuido, como es el caso de Ceph.fc
(Fibre Channel): los volúmenes persistentes basados en FC están vinculados a dispositivos de almacenamiento tipo Fibre Channel. Este tipo permite acceder a soluciones de almacenamiento similares, pero externas. Es común en entornos donde se utilizan redes Fibre Channel para proporcionar almacenamiento basado en bloques.rbd
(RADOS Block Device): el tipo RBD se conecta a dispositivos de almacenamiento basados en bloques en el clúster Ceph, que funcionan como RADOS Block Devices. Este tipo ofrece la posibilidad de acceder al sistema de almacenamiento basado en bloques de Ceph, lo que tiene muchas ventajas en entornos de almacenamiento distribuidos con alta escalabilidad.
Modos de acceso a los Persistent Volumes en Kubernetes
En Kubernetes, los modos de acceso a volúmenes persistentes determinan cómo los pods pueden acceder a los volúmenes vinculados a ellos. Existen tres tipos principales de modos de acceso:
ReadWriteOnce (RWO)
: este modo permite a un único pod montar el volumen persistente simultáneamente en modo de lectura y escritura. Es útil para aplicaciones que necesitan un control exclusivo de acceso de escritura. Un PV con este modo solo puede ser montado por un pod a la vez.ReadOnlyMany (ROX)
:ReadOnlyMany
permite a varios pods montar el volumen persistente simultáneamente en modo de solo lectura. Esto es útil para aplicaciones que pueden compartir datos de manera conjunta pero con acceso de escritura restringido. Varios pods pueden acceder a los datos en paralelo, pero solo en modo de lectura.ReadWriteMany (RWX)
: conReadWriteMany
varios pods pueden montar el volumen persistente simultáneamente tanto en modo de lectura como de escritura. Este modo se aplica en situaciones donde se necesita una base de datos compartida y varios pods pueden tener acceso de escritura a los datos.
Al definir el modo de acceso, debes tener en cuenta el tipo de acceso a datos que requiere tu aplicación y comprobar que el modo seleccionado admite los modelos de acceso necesarios.
Ten en cuenta que no todas las clases de almacenamiento y tipos de volumen admiten los tres modos de acceso. La compatibilidad depende de la infraestructura de almacenamiento subyacente y del tipo de volumen persistente específico. Por lo tanto, es aconsejable consultar la documentación de la clase de almacenamiento y el tipo de volumen persistente respectivos para asegurarse de que se permiten los patrones de acceso deseados.
Ciclo de vida de un Persistent Volume (PV)
Los ciclos de vida de los Persistent Volumes en Kubernetes pueden dividirse en diferentes fases que representan el proceso de provisión, uso y liberación del almacenamiento persistente en el clúster.
- Creación (Provisioning): el ciclo de vida de un PV comienza con su creación o aprovisionamiento. Un admnistrador del clúster crea un volumen persistente y lo configura de manera estática con recursos de almacenamiento fijos o de manera dinámica utilizando una clase de almacenamiento (Storage Class) que permite el aprovisionamiento dinámico.
- Vinculación (Binding): un PV se vincula a un PVC (Persistent Volume Claim) cuando un pod solicita un almacenamiento que coincide con las especificaciones del PV. Este paso asegura que el PV cumpla con los requisitos de un pod específico.
- Uso por parte del pod: después de completar el proceso de vinculación, el pod puede utilizar el PV. El pod puede leer o escribir en el volumen montado, según los modos de acceso establecidos durante la creación del PV.
- Finalización del uso: cuando un pod termina su servicio o se elimina, el PV asociado puede ser reutilizado por otro pod. El PV permanece hasta que se elimina manualmente o mediante una clase de almacenamiento dinámica.
- Liberación (Release): cuando un pod termina su servicio o se elimina, el PV asociado puede ser reutilizado por otro pod. El PV permanece hasta que se elimina manualmente o mediante una clase de almacenamiento dinámica.
- Eliminación: por último, también puedes eliminar un PV si ya no es necesario. Esto se puede hacer manualmente o automáticamente si la replicación de PV está configurada por la clase de almacenamiento.
Crear un Persistent Volume en Kubernetes
La creación de un Persistent Volume en Kubernetes es un proceso de varias etapas que requiere una configuración cuidadosa.
Paso 1: configuración del Persistent Volume
El primer paso consiste en abrir un editor de texto y crear un archivo YAML que contenga la configuración del volumen persistente. Puedes llamar a este archivo pv.yaml
, por ejemplo. A continuación te mostramos un ejemplo sencillo de configuración de un PV:
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 1Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
hostPath:
path: "/mnt/data"
yamlapiVersion
: indica la versión API de Kubernetes. En este caso es v1.kind
: es el tipo de objeto de Kubernetes, en este caso PersistentVolume.metadata
: contiene metadatos para el Persistent Volume, por ejemplo, el nombre del volumen.spec
: define la especificación del volumen.capacity
: indica la capacidad de almacenamiento, en este ejemplo 1 GB.volumeMode
: indica el modo del volumen, ya seaFilesystem
oBlock
. En este ejemplo usamosFilesystem
.accessModes
: define los modos de acceso. AquíReadWriteOnce
significa acceso exclusivo de lectura y escritura.persistentVolumeReclaimPolicy
: indica cómo se debe manejar el volumen cuando ya no se necesite.Retain
significa que el volumen debe eliminarse manualmente.storageClassName
: asigna una clase de almacenamiento al Persistent Volume.hostPath
: define la ruta en el sistema de archivos del host que se utilizará como almacenamiento para el Persistent Volume.
Paso 2: aplicación de la configuración
Una vez descrito el archivo de configuración PV, puedes activarlo con Kubelet:
kubectl apply -f pv.yaml
shellEste comando envía el archivo de configuración al clúster de Kubernetes que crea los recursos que contiene.
Paso 3: aplicación de la configuración
Para asegurarte de que el Persistent Volume de Kubernetes se ha creado correctamente, puedes utilizar el siguiente comando:
kubectl get pv
shellEsto listará todos los volúmenes persistentes existentes en el clúster.
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
my-pv 1Gi RWX Retain Available manual 1h
shellPaso 4: creación de un Persistent Volume Claim (PVC)
Rellena un archivo YAML que defina la configuración del Persistent Volume Claim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: manual
yamlAplica el archivo de configuración de PVC al clúster Kubernetes:
kubectl apply -f pvc.yaml
shellComprueba si el Persistent Volume Claim se ha creado correctamente y utiliza el siguiente comando:
kubectl get pvc
shellEl resultado debería ser algo así:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
my-pvc Bound my-pv 1Gi RWO manual 1m
shellAhora crearemos el manifiesto YAML pvc-dynamic.yaml
para demostrar la provisión dinámica de un Persistent Volume Claim (PVC) en Kubernetes. El manifiesto creará y reclamará automáticamente un nuevo Persistent Volume en Kubernetes con un tamaño de 1 gigabyte, respaldado por la clase de almacenamiento standard
.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-dynamic
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: standard
yamlUna vez definidas las configuraciones, activamos el manifiesto:
kubectl apply -f pvc-dynamic.yaml
shellPaso 5: conexión del PVC al pod
Para emparejar el PVC con el pod, es necesario establecer la configuración para el pod que utilizará el almacenamiento persistente.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
volumes:
- name: mypvc-volume
persistentVolumeClaim:
claimName: my-pvc
containers:
- name: mycontainer
image: myimage
volumeMounts:
- mountPath: "/app/data"
name: mypvc-volume
yamlAplica la configuración del pod al clúster Kubernetes para crear el pod:
kubectl apply -f pod.yaml
shellSi estás empezando con Kubernetes, encontrarás toda la información sobre la instalación y configuración de un clúster en el tutorial de Kubernetes de nuestra guía.