Almacenamiento en Kubernetes
Los datos no se pueden almacenar en el pod, cuando el pod se elimina o se termina, los datos que contiene no permanecen en el sistema. Para proporcionar almacenamiento temporal y a largo plazo a los Pods en el clúster, Kubernetes proporciona diferentes tipos de mecanismos de almacenamiento.
En este artículo, veremos ejemplos de sólo 2 tipos de mecanismos de almacenamiento.
- hostPath:
Un volumen hostPath monta un archivo o directorio del sistema de archivos del nodo anfitrión en su Pod. Este tipo de volumen puede utilizarse para que un Pod especifique si un determinado hostPath debe existir antes de que el Pod se ejecute o si debe crearse. Este tipo de volumen no es algo que necesiten la mayoría de los Pods. El tipo DirectoryOrCreate creará un directorio vacío si no existe con el permiso establecido en 0755 y el tipo Directory ayuda a asegurarse de que existe un directorio en la ruta dada antes de que se cree el Pod. - emptyDir:
Un volumen emptyDir se crea por primera vez cuando se asigna un Pod a un Nodo y existe mientras ese Pod se esté ejecutando en ese nodo. Por defecto, los volúmenes emptyDir se almacenan en el tipo de almacenamiento que tenga nuestro entorno. También podemos establecer el campo emptyDir.medium como Memoria para indicar a Kubernetes que monte un sistema de archivos respaldado por RAM
Para conocer otros mecanismos de almacenamiento en Kubernetes, haz clic aquí.
Requisitos previos
- Clúster Kubernetes con al menos 1 nodo trabajador.
Si quieres aprender a crear un Clúster Kubernetes, haz clicaquí. Esta guía te ayudará a crear un cluster de Kubernetes con 1 Maestro y 2 Nodos en Instancias EC2 de AWS Ubuntu 18.04.
¿Qué vamos a hacer?
- Crear un pod con un volumen de diferentes tipos montado en él
Crea un pod con un volumen de diferentes tipos montado en él
Volumen de la ruta del host con el tipo: Directorio
Crea un archivo de definición de objetos para montar un directorio existente en el pod
vim volume-hostpath-1.yml
apiVersion: v1 kind: Pod metadata: name: volume-hostpath-example-1 spec: containers: - image: nginx name: my-container volumeMounts: - mountPath: /opt/mounted-here name: my-volume-1 volumes: - name: my-volume-1 hostPath: path: /dir type: Directory
Obtén una lista de pods y crea un pod que monte «/opt/mounted-here» dentro del pod en «/dir» del host.
kubectl get pods
kubectl create -f volume-hostpath-1.yml
kubectl get pods
kubectl describe pod volume-hostpath-example-1
Ahora, si describes el pod, verás que la creación del pod ha fallado. El montaje ha fallado porque el directorio «/dir» no existe en el host. Para montar un volumen en el pod con «tipo: Directorio», el directorio del host debe existir.
Ahora vamos a crear un directorio «/dir» en el host, es decir, en el nodo trabajador.
sudo mkdir /dir
Una vez que hayamos creado un directorio en los nodos trabajadores, podemos eliminar el pod creado anteriormente e intentar volver a crear un nuevo pod.
kubectl delete -f volume-hostpath-1.yml
kubectl create -f volume-hostpath-1.yml
kubectl get pods
kubectl describe pod volume-hostpath-example-1
Esta vez puedes ver que el pod se ha creado con éxito y en volúmenes se puede ver la ruta montada «/dir».
Ahora vamos a entrar en el pod y crear un archivo
kubectl get pods
kubectl exec -it volume-hostpath-example-1 /bin/bash
touch /opt/mounted-here/new-file
El archivo que hemos creado en el pod ahora se puede ver desde el nodo trabajador bajo el directorio montado «/dir»
ll /dir/ #Execute this command on the worker node
Esta vez vamos a eliminar el pod que hemos creado y a ver si el archivo sigue existiendo en el directorio montado «/dir» o no.
exit
kubectl get pods
kubectl delete pod volume-hostpath-example-1
Enumera los archivos bajo «/dir» en el nodo trabajador.
ll /dir/ #Execute this command on the worker node
Podemos ver que, incluso después de eliminar el pod, el archivo sigue existiendo en «/dir» en el nodo trabajador. Esto significa que los datos persisten incluso después de que el pod sea eliminado o terminado.
En este ejemplo, observamos que el directorio del host que debe montarse en el puerto debe existir.
El volumen de la ruta del host con el tipo DirectoryOrCreate
Para asegurarnos de que el directorio del host está disponible antes de montarlo, podemos utilizar «type: DirectoryOrCreate» en lugar de «type: Directorio» en el volumen de la ruta del host.
Crea un nuevo archivo con el tipo «type: DirectoryOrCreate».
vim volume-hostpath-2.yml
apiVersion: v1 kind: Pod metadata: name: volume-hostpath-example-2 spec: containers: - image: nginx name: my-container volumeMounts: - mountPath: /opt/mounted-here name: my-volume-2 volumes: - name: my-volume-2 hostPath: # directory location on host path: /mount-this type: DirectoryOrCreate
Obtén una lista de los pods existentes y crea un nuevo pod con el archivo creado en el estado anterior.
kubectl get pods
kubectl create -f volume-hostpath-2.yml
kubectl get pods
kubectl describe pod volume-hostpath-example-2
Cuando describimos el pod se puede ver que el pod se ha creado con éxito. Y el directorio «/mount-this», que no existe en el nodo host/worker, se ha creado en el host al montarlo en el volumen.
Ve a los nodos trabajadores y comprueba si el directorio se ha creado o no
ll /mount-this/ #Execute this command on the worker node
Ahora crea un nuevo archivo en los nodos trabajadores en el directorio «/mount-this» que está montado en el pod.
sudo touch /mount-this/created-on-host #Execute this command on the worker node
Entremos en el pod y comprobemos el directorio «/opt/mounted-here/» para ver si el archivo «/mount-this/created-on-host» que hemos creado en el nodo trabajador existe en el pod.
kubectl get pods
kubectl exec -it volume-hostpath-example-2 /bin/bash
ls -l /opt/mounted-here/
Ahora elimina el pod y comprueba si el archivo sigue existiendo en el nodo trabajador en «/mount-this/»
exit
kubectl get pods
kubectl delete pod volume-hostpath-example-2
Ejecuta el siguiente comando para listar el archivo en el nodo trabajador en «/mount-this/»
sudo ls -lt /mount-this/ #Execute this command on the worker node
En este ejemplo, hemos visto que aunque el directorio del host no exista, se crea en la máquina del host antes de que se monte en el pod.
volumen emptyDir
Crea un archivo de definición de objetos con lo siguiente.
vim volume-emptydir.yml
apiVersion: v1 kind: Pod metadata: name: volume-emptydir-example spec: containers: - image: nginx name: my-container volumeMounts: - mountPath: /opt/this name: my-volume-3 volumes: - name: my-volume-3 emptyDir: {}
Obtén una lista de pods y crea un nuevo pod para montar un volumen con el tipo «emptyDir»
kubectl get pods
kubectl create -f volume-emptydir.yml #Create an object using the file
kubectl get pods
kubectl describe pod volume-emptydir-example #Get details of the specified pod
En la captura de pantalla anterior, se puede ver que el pod se ha creado y el volumen está disponible.
Ahora entra en el pod y crea un directorio bajo la ruta de montaje «/opt/esto». Esta vez no tenemos ningún volumen del host.
kubectl exec -it volume-emptydir-example /bin/bash #Login into the Pod
Ahora podemos eliminar el pod si ya no es necesario.
kubectl get pods #Get a list of Pods
kubectl delete pod volume-emptydir-example #Delete the specified pod
Conclusión
En este artículo hemos visto los pasos y archivos de ejemplo para crear pods con un volumen de tipo hostPath y emptyDir. Hemos visto cómo «type:DirectoryOrCreate» en el tipo de volumen hostPath puede ayudarnos a montar un directorio que no existe en el nodo trabajador/host.