Ir al contenido

Construyendo un clúster de Kubernetes en Raspberry Pi (con automatización)

·682 palabras·4 mins
DevOps
Alejandro Duarte
Autor
Alejandro Duarte
Alejandro Duarte es un Ingeniero de Software, escritor publicado y galardonado. Actualmente, trabaja para MariaDB plc como Ingeniero de Relaciones con Desarrolladores (Developer Relations Engineer). Comenzó su trayectoria en programación a los 13 años con BASIC en una rudimentaria pantalla negra, para lugo rápidamente transitar a C, C++ y Java durante sus años académicos en la Universidad Nacional de Colombia. Trasladándose primero al Reino Unido y luego a Finlandia, Alejandro profundizó su participación en la comunidad de código abierto. Es reconocido en los círculos de Java, acreditado con artículos y videos que acumulan millones de vistas, y presentaciones en eventos internacionales.

Clúster de Raspberry Pi

Hace unos meses, tuve la suerte de conseguir un montón de minicomputadoras Raspberry Pi de MariaDB Corporation. Mi idea era construir un clúster de Linux donde pudiera mostrar algunas de las capacidades de las bases de datos MariaDB en Docker y Kubernetes. Así que ensamblé el clúster y jugué con Ansible para configurar los dispositivos de manera automatizada, ¡no quería copiar/pegar una multitud de comandos en cada uno de los 8 dispositivos! Puedes encontrar un tutorial completo con muchas fotos e instrucciones detalladas en DZone.

En esta publicación, me centro en los comandos necesarios para configurar un clúster de Kubernetes. Supongo que ya tienes un conjunto de dispositivos Raspberry Pi funcionando y conectados a tu red local.

Habilita grupos de control
#

Los grupos de control (o cgroups) es una característica del kernel de Linux que permite asignar recursos, como CPU y memoria, a procesos. Kubernetes utiliza esta característica del kernel para limitar recursos a los procesos. Para habilitar esta característica, conéctate por SSH a tu Raspberry Pi y ejecuta:

sudo sh -c "echo ' cgroup_enable=memory cgroup_memory=1' >> /boot/cmdline.txt"

Configura el nombre de host
#

Para asegurarte de que el nombre de host esté configurado correctamente, ejecuta:

sudo sh -c "echo '$(hostname).local' > /etc/hostname"

Además, configura la configuración de localización para evitar problemas más adelante:

export LC_ALL=C.UTF-8
export LANG=C.UTF-8
echo "LC_ALL=en_US.UTF-8" | sudo tee -a /etc/environment
echo "en_US.UTF-8 UTF-8" | sudo tee -a /etc/locale.gen
echo "LANG=en_US.UTF-8" | sudo tee -a /etc/locale.conf
sudo locale-gen en_US.UTF-8

Reinicia la máquina para aplicar los cambios:

sudo reboot

Instalar Kubernetes
#

Dado que estamos usando dispositivos Raspberry Pi, tiene sentido usar una de las distribuciones ligeras de Kubernetes. En mi caso, utilicé Microk8s de Ubuntu. Otra buena opción es K3s.

Estos son los comandos requeridos (ejecútalos en cada dispositivo):

sudo apt install -y snapd
sudo snap install core
sudo snap install microk8s --classic
sudo usermod -a -G microk8s pi
sudo chown -f -R pi ~/.kube

Configura los nodos maestros y secundarios
#

Una vez que hayas instalado todo el software requerido en todos los nodos, debes elegir un nodo para ser el maestro en el clúster. En el nodo maestro, debes generar un token (de un solo uso) para cada nodo secundario que quieras unir al clúster.

Conéctate por SSH al nodo maestro:

Genera un token:

microk8s.add-node --token-ttl 300

Copia la cadena de token y el puerto. Conéctate por SSH al primer nodo secundario y ejecuta:

microk8s.join rpi01.local:25000/TOKEN

Repite el proceso (generar token en el maestro + unirse desde el nodo secundario) para cada nodo secundario.

Verifica el estado
#

Puedes verificar el estado actual del clúster desde cualquiera de los nodos, ejecutando:

microk8s.kubectl get node

Deberías ver una lista de todos los nodos en el clúster cada uno en el estado Ready.

Elimina nodos del clúster
#

Si en algún momento quieres eliminar un nodo del clúster, conéctate por SSH a él y ejecuta:

microk8s.leave
microk8s remove-node

Automatiza con Ansible
#

Puedes automatizar la mayoría de estos pasos usando Ansible. He creado varios playbooks de Ansible para configurar un clúster de Kubernetes en Raspberry Pi sin tener que ejecutar manualmente los mismos comandos en cada dispositivo:

  • ping.yml: Hace ping a todas las máquinas
  • new-cluster.yml: Actualiza las máquinas y expande su sistema de archivos
  • shutdown.yml: Apaga todas las máquinas
  • microk8s-prepare.yml: Prepara para la instalación de Kubernetes (Microk8s)
  • microk8s-install.yml: Instala Kubernetes (MicroK8s)
  • microk8s-master.yml: Genera tokens de unión en el nodo maestro
  • microk8s-workers.yml: Hace que los secundarios se unan al clúster
  • temperature.yml: Muestra la temperatura de cada máquina

Debes crear un inventario de Ansible como el siguiente:

# Clúster de Raspberry Pi de 8 nodos
[rpies]
rpi[01:08].local ansible_user=pi

[master]
rpi01.local ansible_user=pi

[workers]
rpi02.local ansible_user=pi token=¡CAMBIA_ESTO!!!
rpi03.local ansible_user=pi token=¡CAMBIA_ESTO!!!
rpi04.local ansible_user=pi token=¡CAMBIA_ESTO!!!
rpi05.local ansible_user=pi token=¡CAMBIA_ESTO!!!
rpi06.local ansible_user=pi token=¡CAMBIA_ESTO!!!
rpi07.local ansible_user=pi token=¡CAMBIA_ESTO!!!
rpi08.local ansible_user=pi token=¡CAMBIA_ESTO!!!

[workers:vars]
master=rpi01.local:¡CAMBIA_ESTO_TAMBIÉN!!!

Luego ejecuta cualquiera de los playbooks de la siguiente manera:

ansible-playbook algun-playbook.yml

Dado que esto está pensado para ser un ambiente de laboratorio para jugar, deshabilité la verificación de la clave del host (¡usa claves SSH en entornos de producción!) y habilité el pedido de contraseña en el archivo /etc/ansible/ansible.cfg:

host_key_checking=False
ask_pass=True

Relacionados

Cómo iniciar un servidor web usando Java
·433 palabras·3 mins
Programación
¿Quieres iniciar un servidor HTTP básico para servir los archivos de un directorio en tu máquina usando Java?
¿Qué es JPA?
·376 palabras·2 mins
Programación Bases de Datos
JPA significa Jakarta Persistence API (anteriormente, Java Persistence API). Es una especificación de una API para conectividad de bases de datos desde aplicaciones Java.
¿Qué es un pool de conexiones de base de datos?
·284 palabras·2 mins
Programación Bases de Datos
Un pool de conexiones de base de datos almacena conexiones de base de datos listas para usar.