Contenido

Clúster Microk8s en LXD

Problemas con LXD
Debido a que LXD ya no es parte de Linux Containers project las imagenes como Rocky Linux ya no estan presentes en sus repositorios para su uso, en su lugar se sugiere el uso de Incus. Se tiene una nueva guia usando K3s en Incus aqui:

La Instalación de un clúster con 6 nodos en LXD para pruebas de servicios de un SOC me llevó más tiempo de lo esperado y despues de resolver varios (y estresantes problemas) por fin pude conseguir un clúster funcional usando Microk8s. Aquí los pasos:

Requisitos previos

  • Es necesario tener LXD instalado en el equipo host en mi caso usé la versión que viene en Snap ya que contiene una interfaz web para facilitar la administración de los contenedores. la instalación de LXD dependerá de la distribución Linux que se esté usando, la guia de instalación de la interfaz web se encuentra aquí.
  • Como minimo se necesita 8GB de Ram para un clúster de 3 nodos si se requiere más nodos el sistema podría ponerse inestable.

Instalación de Rocky Linux en LXD

Una vez instalado LXD se instalará el nodo maestro (master) donde se realizará todas las configuraciones necesarias y posteriormente se creará los otros nodos a partir de este contenedor.

  • Primero se debe descargar el perfil especial creado para correr Microk8s en LXD, existen dos versiones de este perfil, dependiendo el sistema de archivos que tenga nuestra instalación de Linux en el host para EXT4 usar este y para ZFS usar este
Instalación de LXD y el perfil
Existe una guía de Instalación de Microk8s en LXD y los perfiles en https://microk8s.io/docs/install-lxd
  • Agregar este perfil (en este ejemplo para EXT4) a un proyecto de LXD en la sección “Profiles” para este clúster se creó el proyecto kubeTest como se muestra en la imagen:

/devops/kubernetes/instalacion/images/2.png
Figura 1: Sección Profiles

  • Una vez agregado el perfil procedemos a crear el contenedor con Rocky Linux en la sección “Instances” y presionando el boton “Create Instance” las siguientes imagenes muestran este proceso:
Por que Rocky Linux?
Rocky Linux es una versión gratuita de Red Hat por lo que su rendimiento como servidor es excelente. todos los pasos descritos posteriormente pueden ser ajustados a cualquier otra distribución Linux.

/devops/kubernetes/instalacion/images/3.png
Figura 2: Selección de la imagen

/devops/kubernetes/instalacion/images/4.png
Figura 3: Selección de la imagen Rocky Linux

/devops/kubernetes/instalacion/images/5.png
Figura 4: Selección del perfil microk8s

/devops/kubernetes/instalacion/images/6.png
Figura 5: Selección del pool de almacenamiento ‘default’

/devops/kubernetes/instalacion/images/7.png
Figura 6: Selección de la interfaz de red

Siguiendo estos pasos ya deberíamos tener Rocky Linux instalado en LXD.

Agregar un usuario no root, instalar Open SSH y nfs-utils en el contenedor

Es importante agregar un usuario no root para administrar Microk8s:

1
2
3
4
5
# adduser node
# passwd node
# usermod -aG wheel node
# dnf update && dnf upgrade -y
# dnf install openssh-server nano nfs-utils -y

Instalación de SNAP y Microk8s en el contenedor

  • Para SNAP seguir los pasos descritos en snapcraft
  • Para la instalación de Microk8s escribimos los siguientes comandos como root:
  • Deshabilitar setenforce:
1
2
# setenforce 0
# sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config
  • Instalar Microk8s y agregar al usuario node al grupo Microk8s:
1
2
# snap install microk8s --classic
# usermod -aG microk8s node
  • Como usuario node se debe crear la carpeta .kube, configurar permisos, agregar alias al .bashrc y crear la carpeta .ssh:
1
2
3
4
5
6
7
# su node
$ cd /home/node
$ mkdir .kube
$ sudo chown -f -R node ~/.kube
$ echo "alias kubectl='microk8s kubectl'" >> .bashrc
$ echo "alias helm='microk8s helm3'" >> .bashrc
$ ssh-keygen
  • Si es necesario agregar una clave publica al archivo .ssh/authorized_keys
  • Verificamos el estado de Microk8s:
1
$ microk8s status

Creación de un snapshot

  • En la sección Snapshots del nodo master crearemos un snapshot que se usará para crear los otros nodos del clúster previamenete debemos apagar el contenedor:

/devops/kubernetes/instalacion/images/8.png
Figura 7: Creación del snapshot de Rocky Linux

Creando nodos del clúster

  • En una terminal del host copiamos el Snapshot:
1
2
3
4
5
$ lxc copy master/basemaster node2
$ lxc copy master/basemaster node3
$ lxc copy master/basemaster node4
$ lxc copy master/basemaster node5
$ lxc copy master/basemaster node6

En este paso podemos crear todos los nodos que necesitemos pero como minimo deben ser 3.

Minimo de nodos en un clúster
Un clúster Kubernetes como minimo debe estar formado por 3 nodos. Ref documentación Kubernetes.

Agregando los nodos al clúster

  • Hasta este punto la sección “Instances” debe mostrar todos los contenedores LXD:

/devops/kubernetes/instalacion/images/11.png
Figura 8: Instancias en ejecución

  • En la terminal del nodo Master como usuario node escribimos el comando:
1
$ microk8s add-node
  • La ejecución de este comando genera una clave unica. Esta clave debe ejecutarse en un único nodo. Por lo tanto, se deben generar diferentes claves para cada nodo.

/devops/kubernetes/instalacion/images/12.png
Figura 9: Generación de la key para el clúster

/devops/kubernetes/instalacion/images/x.png
Figura 9.1: Se agregó el nodo2 al cluster

  • Ejecutamos el siguiente comando en el nodo master para verificar el estado del clúster:
1
$ microk8s kubectl get no

y deberíamos tener una lista de todos los nodos que conforman el clúster

/devops/kubernetes/instalacion/images/13.png
Figura 10: lista de nodos que pertenecen al clúster

Desde este punto solo queda desplegar servicios eso se verá en los siguientes posts.