Skip to content

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 volumen nfs no 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:

  1. nfs: Este utiliza un servidor NFS externo como almacenamiento.
  2. 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:

  1. Crear un Persistent Volume que utilice el StorageClass nfs.
  2. 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:~>

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

  2. Debemos contar con el paquete open-iscsi para 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
    

  3. Habilitaremos el acceso al cluster1 defieniedo la variable KUBECONFIG. Utilizaremos el cluster1.

    export KUBECONFIG=/home/student/rke2_conn/cluster1/cluster1_kubeconfig.yaml
    

  4. 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 de drain en un cluster productivo.

    kubectl drain FQDN_NODO --ignore-daemonsets --delete-emptydir-data
    
    ssh student@FQDN_NODO 'sudo reboot'
    
    watch kubectl get node FQDN_NODO
    
    Espere hasta que el nodo vuelva a estar en estado Ready.
    kubectl wait node FQDN_NODO --for condition=ready --timeout=600s
    
    kubectl uncordon FQDN_NODO
    

  5. Repita el paso anterior para el siguiente nodo del cluste, únicamente los workers.

  6. Por medio del UI de Rancher Manager Server, seleccionaremos el cluster cluster1 / Explore. En la sección de Apps/Charts buscaremos el chart de longhorn y lo seleccionamos. Longhorn app

  7. El proceso de instalacion es bastante simple. Hacer click sobre el botón Install. Utilizaremos el Proyecto System.

  8. Personalización: Custom1 Custom2

  9. Next / Install

  10. 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. Longhorn app

  11. Crearemos nuevo namespace llamado nginx.

    kubectl create ns nginx
    

  12. Crearemos el archivo deployment-pvc.yaml con 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
    

  13. Aplicamos este archivo con el comando

    kubectl apply -f deployment-pvc.yaml
    
    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.

  14. Procemos a crear un archivo index.html en 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 $POD
    
    kubectl 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
    
    Nos debe de devolver el Hello from nginx

  15. Vamos a eliminar el pod con el siguiente comando

    kubectl delete ${POD}
    
    Esperamos a que se elimine y se vuelva a crear y ejecutamos el siguiente comando
    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
    
    Debido a que tenemos un volumen persistente podemos acceder a index.html, con el contenido creado anteriormente.

  16. Limpiar el ambiente.

    kubectl delete ns nginx