Persistencia de datos en kubernetes I – HostPath

En kubernetes, los datos que se almacenan en los pods son efímeros, por lo que si queremos mantener información de forma persistente, debemos almacenar esa información de algún modo.

Esta persistencia de la información, en kubernetes, se consigue mediante volúmenes. Estos volúmenes se montan en los pods cuando son creados. Algunos tipos de volúmenes son:

  • emptyDir
  • hostpath
  • nfs
  • iscsi
  • glusterfs
  • cephfs

Vamos a ver como crear volumenes tipo hostpath. Este tipo de almacenamiento se caracteriza por almacenar la información intra-nodo, es decir, almacena la información en una ruta dentro del nodo en que está corriendo el pod, por lo que no se puede emplear en un cluster. Este tipo de almacenamiento se puede utilizar para hacer pruebas en clusters de 1 nodo, como minikube.

Para crear el almacenamiento vamos a necesitar crear primero un persistent volume y después un volume claim que se montará en el pod. Creamos el persisten volume creando un fichero con el nombre pv.yaml con el siguiente contenido y aplicándolo con kubectl apply -f pv.yaml :

kind: PersistentVolume
apiVersion: v1
metadata:
  name: volumen1
  labels:
   type: local
spec:
  volumeMode: Filesystem
  storageClassName: mysql
  persistentVolumeReclaimPolicy: Retain
  capacity:
   storage: 10Gi
  accessModes:
  - ReadWriteOnce
    hostPath:
     path: "/media/data1"

Con esta configuración hemos creado un volumen de 10G que almacenará la información en /mnt/data1. Podemos comprobar que se ha creado correctamente ejecutando kubectl get pv

Ahora crearemos un persistent volume claim, que montaremos en un pod y guardará la información en el pv que hemos creado anteriormente. Creamos un fichero con el nombre pvc.yaml con el siguiente contenido:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  labels:
   app: wordpress
spec:
  volumeMode: Filesystem
  storageClassName: mysql
  accessModes:
  - ReadWriteOnce
  resources:
   requests:
    storage: 10Gi

Aplicamos la configuración y comprobamos que se ha creado correctamente ejecutando kubectl get pvc

Una vez creado el almacenamiento, vamos a crear un deployment que nos creará un pod con mariadb. Creamos el fichero deploy-mysql.yaml con el siguiente contenido:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
   labels:
   app: mysql
spec:
  selector:
   matchLabels:
    app: mysql
  replicas: 1
  template:
    metadata:
     labels:
      app: mysql
 spec:
  containers:
  - image: mariadb
    name: mysql
    ports:
    - containerPort: 3306
    name: mysql
    volumeMounts:
    - name: mysql-pvc
      mountPath: "/var/lib/mysql/" 
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: mypassword
 volumes:
  - name: mysql-pvc
    persistentVolumeClaim:
     claimName: mysql-pvc

Aplicamos la configuración del fichero y vemos que se ha creado el pod ejecutando kubectl get pods . Si ahora accedemos a la ruta /mnt/data1 , podremos ver el contenido de la ruta /var/lib/mysql/ del pod. Podemos probar a eliminar el pod y dejar que se cree de nuevo, para comprobar que la información no se ha eliminado.

Te recordamos que en Occentus Network somos Kubernetes Certified Service Provider (KCSP) y que gracias a esta certificación ofrecemos servicios de implementación oficial de Kubernetes, así como consultoría y formación a empresas que eligen Kubernetes.

Artículos relacionados