Docker Swarm Cluster con Raspberry Pi. Parte 2

Docker y armado del cluster

En la primera parte llegamos hasta darle conectividad full a nuesto Raspberry Pi que actuará como master del cluster, ahora toca instalar docker y armar el cluster, agarra una cerveza/refresco/(limonada? ;p) que ya empezamos.

Instalando docker

Nota: para la instalación de docker se asume que tienes la VPN activada, si no estos comandos no funcionarán porque verá que estás en Cuba y te bloqueará.
Comenzamos por instalar las dependencias:
sudo apt-get install apt-transport-https ca-certificates software-properties-common -y
Y los instalamos directo del server con el script recomendado (esto demorará un rato)
curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh
Donde veremos algo como esto:
root@raspberrypi:~# curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh
# Executing docker install script, commit: 26ff363bcf3b3f5a00498ac43694bf1c7d9ce16c
+ sh -c apt-get update -qq >/dev/null
+ sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -qq apt-transport-https ca-certificates curl >/dev/null
+ sh -c curl -fsSL "https://download.docker.com/linux/raspbian/gpg" | apt-key add -qq - >/dev/null
Warning: apt-key output should not be parsed (stdout is not a terminal)
+ sh -c echo "deb [arch=armhf] https://download.docker.com/linux/raspbian buster stable" > /etc/apt/sources.list.d/docker.list
+ sh -c apt-get update -qq >/dev/null
+ [ -n ]
+ sh -c apt-get install -y -qq --no-install-recommends docker-ce >/dev/null
Es posible que esto termine con un error, si este es el caso el culpable es systemd, simplemente haz un update y upgrade (apt update && apt upgrade -y) y reinicia, cuando retorne del reinicio ejecuta: apt install -f hasta que veas que el error desaparece.
Para confirmar puedes ejecutar esto en consola
root@raspberrypi:~# docker info
Client:
Debug Mode: false
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 19.03.11
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
[...]
Una vez que logres esto tenemos que plantearnos la configuración del resto del hardware, veamos dos casos, uno usando otros Raspberry o Las Orange Pi con Armbian, pero primero haza salvas

Perate, porque no haz hecho salvas?

Usa cualquier herramienta posible y haz una salva de la uSD en este momento, en Ubuntu puedes usar la herramienta de Discos del sistema, o puedes ver este tutorial de la revista MagPi serio, haz la salva porlo lo vas a necesidat más alante en este tutorial.

Tu cluster es completo de Raspberry Pi?

Si el resto del hardware es Raspberry pi, tienes el 99% del camino recorrido, sigue estos pasos (ya hiciste la salva?):
  • Apaga la Raspberry Pi que actua como master
  • Restaura la salva de la uSD del master en una uSD y usala para iniciar uno de los otros Raspberry Pi que actuarán como workers
  • Conectate físicamente al worker (terminal serie o display/teclado) e inicíalo (no hace falta que el master esté encendido)
  • Deshabilita y desinstala: hostapd, dnsmasq, firehol y openvpn
    • systemctl stop hostapd dnsmasq firehol openvpn
    • apt purge hostpad dnsmasq firehol penvpn
  • Deshabilita la IP fija en el interface wifi, edita el fichero con el comando siguiente y deja solo los comentarios
    • nano /etc/network/interfaces
  • Apuntar el server ntp al server ntp de la red, corre el comando nano /etc/systemd/timesyncd.conf y poner la IP del server NTP en la variable NTP (ver parte 1)
  • Deshabilitar el RTC por hardware, correr el comando nano /boot/config.txt y comentar (poner un # delante) las lineas siguientes:
    • dtparam=i2c_arm=on,i2c_arm_baudrate=400000
    • dtoverlay=i2c-rtc,ds3231
  • Regenera las claves SSH (es necesario por seguridad) con el comando siguiente:
    • /bin/rm -v /etc/ssh/ssh_host_* && dpkg-reconfigure openssh-server
  • Cambia el nombre del nodo ejecutando los siguientes comandos en la consola, en este ejemplo «rpi1» es el nombre de este host
    • NAME=rpi1
    • echo $NAME > /etc/hostname
    • sed -i s/raspberrypi/$NAME/g /etc/hosts
  • Reinicia el worker para aplicar los cambios
En este punto ya tienes la configuración base para TODOS los nodos workers raspi que quieras, por lo que te recomiendo que hagas un backup de esta uSD y la nombres como worker_base para identificación.
Para crear los restantes nodos es simplemente restaurar el backup marcado como worker_base en un nuevo worker y repetir los pasos antes mencionados relativos al regenerado de claves SSH y el cambio de nombre del nodo y andando.

Un comentario sobre los nombres

En mi caso uso los nombres que pudieron apreciar en la primera parte
  • rpi0
  • opi1
  • opi2
Les recomiendo usar nombres cortos, estos nombres deben coincidir con los que introducimos en el fichero /etc/dnsmasq.conf en la parte 1

Y si el resto del hardware es Orange Pi Prime (u otros SBC) con Armbian y no Raspberry?

En mi caso tengo 3 SBC de este tipo, pero hay uno que está dando problemas, por lo que vamos con dos workers. Flashea las uSD con la imagen de Armbian correspondiente y enciendelas , Armbian viene con baterías puestas, por lo que no hay que hacer tantas cosas como en Raspberry
Le recomiendo que haga el trabajo en una sola uSD y al final clone el resto para ahorrar el tiempo de trabajo y los MB de la conexión; recuerde que cuando clona debe resetear las claves ssh y cambiar la el nombre del nodo y MAC persistente como aprenderá a continuación.

MAC persistente

Solo aclarar que a diferencia de Raspbian muchas SBC Orange Pi no conservan la MAC del ethernet/wifi en los reinicios y esto es malo, recuerdas que cuando configuramos dnsmasq en la parte 1, fijamos las MACs los los clientes a valores pre-establecidos…
Pues vamos a hacer un truco para que siempre inicien con la misma MAC en la Wifi, con el comando nano /etc/rc.local editas este fichero y añades justo ANTES de la linea que dice «exit 0» lo siguiente:
ip link set dev wlan0 address 0c:8c:24:2c:50:be &
Donde por supuesto la MAC es la que quieres que tenga en la Wifi el dispositivo y esta tiene que machear con las que declaraste en el fichero de dnsmasq en la parte 1

Fecha y hora

Usted debe configurar la zona horaria con el comando dpkg-reconfigure tzdata como hicimos anteriormente y poner en el fichero /etc/systemd/timesyncd.conf el server NTP de su red o el del nodo master

Docker

Las installación de docker es seguir los mismos pasos que en la primera parte, exactamente igual.

Iniciando la config general del cluster

Ya teniendo todas las SBC iniciadas pasaremos a unir los dos nodos workers ya sean raspberry Pi o Orange Pi a la red del cluster con el comando siguiente en cada nodo:
nmcli device wifi connect "PiCluster" password "P45w0rd__"
Esto unirá permanentemente ese nodo a la red del cluster, dándole la IP en dependencia de la MAC y la IP que establecimos en la primera parte en el fichero /etc/dnsmasq.conf
Puede que falle a la primera el comando anterior, en mi caso una red WiFi de un vencino estaba encima de la mía y tuve que darle par de veces para lograr que se conectara
Tip: Si te pasa esto puedes usar una de las tantas herramientas de escaneo de redes wifi en el cell para averiguar cual es el canal más limpio en tu ambiente y cambia la variable «channel=12» en la config del hostapd al número del canal libre y reicia la Raspberry Pi
Pruebe el ping entre los nodos usando el nombre corto de cada nodo, esto es importante, si no puede hacer ping a un nodo por su nombre revise los ficheros /etc/dnsmasq.conf en el nodo master y los ficheros /etc/hostname y /etc/hosts en todos los nodos.
Recuerda que los Armbian no los has «updateado» este sería un buen momento para hacer:
apt update && apt upgrade
Otro punto importante es la fecha y hora, verifique con el comando «date» que todos los nodos tiene la misma fecha y hora, si no es así revise las configuraciones y reinicie los nodos hasta que obtengan la hora del server NTP.
Si estas dos premisas no funcionan el cluster puede no funcionar

Docker swarm

Como le decía a un amigo en Twitter:  la parte más fácil es instalar el docker swarm y portainerio, es realidad es muy simple; en el nodo maestro es simple, solo ejecute lo siguiente para iniciar el cluster:

docker swarm init --advertise-addr 10.42.1.1
En su caso si usó otro rango de IP debe poner aquí la IP del nodo master, de no ponerlo como usamos un VPN verá un mensaje de error que le alerta que docker no puede adivinar en que dirección debe escuchar y le pide que la explicite
Este comando debe dar una salida parecida a la siguiente:
Swarm initialized: current node (bp0c48ma96mpp7jt65s62t6ek) is now a manager.
To add a worker to this swarm, run the following command:
        docker swarm join --token SWMTKN-1-4r1cd8xkqu5r4yjycnf8agoj2lgpw6og2tqpid0p605gkizk3x-53gdi0ta9twngssb6472x2q89 10.42.1.1:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Si, ese comando debe correrlo en cada uno de los nodos para que se unan al swarm,  luego que los nodos se unan podrá ejecutar lo siguiente para verificar que ya cuanta con los nodos registrados (salida modificada por tamaño)
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
bp0[...] * rpi0 Ready Active Master 19.03.11
0e5[...] * opi1 Ready Active Worker 19.03.11
ba3[...] * opi2 Ready Active Worker 19.03.11
Y ya tenemos el cluster iniciado y corriendo, ahora a probar servicios y stacks, pero muchos quieren una interfaz visual, pues adelante, instalemos portainerio

Portainerio como GUI

En el propio sitio de portainer encontramos que para un nodo aislado es un comando de instalación, pero para correr el servicio en un docker swarm hay que crear un stack de servico con los agentes a nivel del cluster y el portainer a nivel del nodo master, se hace de la siguiente manera:
curl -L https://downloads.portainer.io/portainer-agent-stack.yml -o portainer-agent-stack.yml
docker stack deploy --compose-file=portainer-agent-stack.yml portainer
Esto desplegará el deploy, descargará las imágenes e iniciará los servicios, luego de una rato en dependencia de la conectividad (se acuerda que deben tener la VPN activa cierto?) tendrán su cluster activo y podrán dirigirse a la dirección del master del cluster en el puerto 9000, en mi caso es http://10.42.1.1:9000 y allí tendrán listo a portainerio

Portainerio entrada inicial

A partir de aquí es solo usar y disfrutar tu nuevo docker cluster, en la tercera parte dare un bosquejo por algunas mejoras y para este cluster criollo y hablaré de algunas mejoras que pueden implementarse para mostrar información de manera inmediata.
Portainerio Mostrando el ClusterCluster Overview
En las imágenes pueden apreciar el portainerio administrado un servicio de monitoreo, noten que hay contenedores dando error en la vista del cluster, eso está acabado de montar, falta el storage por NFS, eso para la parte 3 con otras mieles.
Aquí les dejo una imagen del hardware real, queda tema para la parte 3 con las cosas que tiene encima… stay tuned!
Cluster Bare Metal
Cluster Top
Que lo disfruten.

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuar!

Promedio de puntuación 5 / 5. Recuento de votos: 2

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Sé el primero en comentar

Dejar una contestacion

Tu dirección de correo electrónico no será publicada.


*