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.