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.