
Creacion de volumenes en RKE2 v2
Introducción
Los volúmenes persistentes son un componente esencial en un entorno de Kubernetes, ya que, por defecto, los contenedores son efímeros. Esto significa que cualquier dato o información generada dentro de ellos se pierde una vez que un pod se reinicia.
Aunque algunas aplicaciones, como las APIs, pueden no requerir datos persistentes, existen muchos otros tipos de aplicaciones, como bases de datos, que dependen de volúmenes con datos persistentes para su correcto funcionamiento.
En este tema, exploraremos el funcionamiento de los volúmenes persistentes, incluyendo su creación, eliminación y las diversas formas de aprovisionarlos. Nos enfocaremos específicamente en el uso de Longhorn, una herramienta proporcionada por Rancher para gestionar volúmenes persistentes de manera eficiente.
Objetivo
Objetivo General:
- Capacitar a los administradores de sistemas y equipos de DevOps en el proceso de creación y administración de volúmenes persistentes utilizando la herramienta Longhorn. El propósito es brindar los conocimientos y las mejores prácticas necesarias para implementar aplicaciones que utilicen estos volúmenes en un entorno productivo de RKE2, garantizando su eficacia y confiabilidad.
Funcionamiento General de Volúmenes
Como se mencionó en la introducción, todos los archivos dentro de un contenedor son efímeros, lo que representa un problema para aplicaciones que necesitan mantener información o para casos donde se requiere compartir datos entre pods.
Kubernetes ofrece una solución a este problema a través de los volúmenes. Un pod puede utilizar múltiples volúmenes al mismo tiempo. A diferencia de los volúmenes efímeros, los volúmenes persistentes, como su nombre lo indica, permanecen disponibles incluso si los pods son eliminados. En su esencia, un volumen es simplemente un directorio que Kubernetes administra.
Kubernetes soporta diversos tipos de volúmenes, entre los cuales se incluyen:
- emptyDir: Es un volumen efímero que se crea en el momento en que el pod se inicia y se elimina cuando el pod es eliminado. Ideal para almacenamiento temporal de datos.
- hostPath: Monta directamente un directorio del sistema de archivos del nodo donde se está ejecutando el pod. Útil para acceder a archivos específicos del host.
- nfs: Permite montar un sistema de archivos de red (NFS) compartido en el pod. A diferencia de
emptyDir, el contenido de un volumennfsno se elimina cuando el pod se elimina, sino que simplemente se desmonta, lo que lo hace ideal para compartir datos entre múltiples pods.
Persistent Volumes y Persistent Volume Claims
Un Persistent Volume (PV) es una pieza de almacenamiento en el clúster que puede ser aprovisionada de forma manual o dinámica utilizando un StorageClass.
Un StorageClass se define como el tipo de almacenamiento que se utilizará, como los tipos de volúmenes mencionados anteriormente.
Un Persistent Volume, por lo tanto, es una unidad de almacenamiento que podemos solicitar a un StorageClass específico, como un nfs o un volumen proporcionado por Longhorn.
Un Persistent Volume Claim (PVC) es una solicitud de almacenamiento que se realiza hacia un Persistent Volume. Básicamente, un PVC especifica la cantidad de almacenamiento requerida y las características del volumen que se necesitan.
Ejemplo de uso:
Supongamos que tenemos dos StorageClass configurados:
- nfs: Este utiliza un servidor NFS externo como almacenamiento.
- longhorn: Este utiliza volúmenes aprovisionados dinámicamente por Longhorn.
Si necesitamos que los datos de nuestro pod se guarden en un servidor externo fuera del clúster de Kubernetes, deberíamos seguir estos pasos:
- Crear un Persistent Volume que utilice el StorageClass
nfs. - Crear un Persistent Volume Claim que haga referencia al Persistent Volume recién creado.
Esto garantiza que los datos del pod se almacenen de manera persistente en un servidor externo, cumpliendo con los requisitos de la aplicación.
Longhorn
Longhorn es un sistema de almacenamiento proporcionado por Rancher, diseñado para aprovisionar volúmenes persistentes. Este sistema permite utilizar volúmenes como almacenamiento persistente para nuestras aplicaciones, brindando funcionalidades avanzadas como:
- Respaldo de volúmenes: Permite realizar copias de seguridad de los volúmenes hacia un almacenamiento externo, garantizando la protección de los datos.
- Replicación de volúmenes: Los volúmenes pueden replicarse en múltiples nodos, lo que asegura una mayor disponibilidad y resiliencia en caso de fallos en el clúster.
- Gestión sencilla: Proporciona una interfaz intuitiva para administrar el almacenamiento persistente de forma eficiente y escalable.
Longhorn se convierte en una herramienta ideal para gestionar volúmenes persistentes en entornos de Kubernetes, asegurando tanto la integridad como la disponibilidad de los datos.
Laboratorio: Instalacion de longhorn y creacion de volumen de prueba en cluster (cluster1)
Antes de comenzar
- Contar con el acceso al ambiente de laboratorio
- Haber realizado la validación de conexión y funcionamiento
- Finalizar las prácticas de laboratorio de las instalaciones de RKE2.
Inicio de laboratorio
Asegurarse de utilizar en el servidor bastion con el usuario student
student@lab-0-bastion:~>
-
Si ha reinstalado u omitido la guía de preparación del bastion, ejecute el siguiente comando para obtener los archivos correspondientes de cada cluster.
~/lab.sh get_kubeconfig -
Debemos contar con el paquete
open-iscsipara poder utilizar volúmenes de Longhorn en lo nodos del cluster que harán uso de el.for node in {1..2}; do ssh student@lab-${LAB}-node${node} 'sudo zypper install -y open-iscsi' ; done -
Habilitaremos el acceso al
cluster1defieniedo la variableKUBECONFIG. Utilizaremos elcluster1.export KUBECONFIG=/home/student/rke2_conn/cluster1/cluster1_kubeconfig.yaml -
Este procedimiento es recomendado realizarlo antes de instalar el cluster de
RKE2, como preparación si se desea utilizar este tipo de almacenamiento. En este caso neceistamos reiniciar el nodo luegos de instalar este paquete. Asegurese de realizar el procedimiento adecuado dedrainen un cluster productivo.kubectl drain FQDN_NODO --ignore-daemonsets --delete-emptydir-datassh student@FQDN_NODO 'sudo reboot'Espere hasta que el nodo vuelva a estar en estadowatch kubectl get node FQDN_NODOReady.kubectl wait node FQDN_NODO --for condition=ready --timeout=600skubectl uncordon FQDN_NODO -
Repita el paso anterior para el siguiente nodo del cluste, únicamente los workers.
-
Por medio del UI de Rancher Manager Server, seleccionaremos el cluster
cluster1/Explore. En la sección deApps/Chartsbuscaremos el chart de longhorn y lo seleccionamos.
-
El proceso de instalacion es bastante simple. Hacer click sobre el botón
Install. Utilizaremos el ProyectoSystem. -
Personalización:

-
Next/Install -
Una vez se termine la instalación podemos acceder a la ui de longhorn usando el menu de la izquierda en la sección
Longhorn.
-
Crearemos nuevo namespace llamado nginx.
kubectl create ns nginx -
Crearemos el archivo
deployment-pvc.yamlcon el siguiente contenido.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nginx namespace: nginx spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: longhorn --- apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: nginx name: nginx namespace: nginx spec: replicas: 1 selector: matchLabels: app: nginx strategy: {} template: metadata: creationTimestamp: null labels: app: nginx spec: volumes: - name: nginx persistentVolumeClaim: claimName: nginx containers: - image: nginx:latest name: nginx ports: - containerPort: 80 name: "http-server" resources: {} volumeMounts: - mountPath: "/usr/share/nginx/html" name: nginx -
Aplicamos este archivo con el comando
Podemos notar en este archivo, que se ha definido un persistentvolumeclaim de 1gb, que utiliza el storage class de longhorn y luego un deployment de nginx que monta ese pvc en el path de /usr/share/nginx/html.kubectl apply -f deployment-pvc.yaml -
Procemos a crear un archivo
index.htmlen la ruta del volumen y consultamos la respuesta del pod de nginx.kubectl get pods -n nginx -l app=nginx -o name POD=$(kubectl get pods -n nginx -l app=nginx -o name) echo $PODNos debe de devolver el Hello from nginxkubectl exec -it ${POD} -n nginx -- bash touch /usr/share/nginx/html/index.html echo "Hello from Nginx" >> /usr/share/nginx/html/index.html curl localhost exit -
Vamos a eliminar el pod con el siguiente comando
Esperamos a que se elimine y se vuelva a crear y ejecutamos el siguiente comandokubectl delete ${POD}Debido a que tenemos un volumen persistente podemos acceder a index.html, con el contenido creado anteriormente.kubectl get pods -n nginx -l app=nginx -o name POD=$(kubectl get pods -n nginx -l app=nginx -o name) echo $POD kubectl exec -it ${POD} -n nginx -- curl http://localhost -
Limpiar el ambiente.
kubectl delete ns nginx