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.

  1. 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.
  2. 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

  1. 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?

  1. 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

definición del volumen-hostpath-1

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

crear-pod-y-obtener-sus-detalles

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

crear-dir-en-el-host-y-luego-crear-un-pod

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

entrar-en-el-pod-y-crear-un-archivo

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

borrar-el-pod-y-verificar-el-archivo-en-el-host

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

definición del volumen-hostpath-2

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

crear-un-pod-y-obtener-sus-detalles

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/

crear-archivo-en-host-y-verificar-en-el-pod

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
borrar-el-pod-y-verificar-el-archivo-en-el-host

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: {}

definición de volumen-vacío

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

crear-un-pod-y-describir-sus-detalles

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

entrar-en-el-pod-y-ver-sin-carpeta-en-el-host

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.

También te podría gustar...