Como crear un Clúster en Docker

En esta entrada voy a explicaros como podéis configurar un clúster de Docker Hosts o como también se conoce modo swarm.

Tipos de nodos

Antes de pasar a la parte práctica es importante que os explique, de forma muy breve, los 2 tipos de nodos que existen y cuales son su cometido.

Nodos Manager: Estos tipos de nodos son los encargados de gestionar el clúster, es decir, son los encargados de distribuir las tareas entre los distintos nodos Workers.

De entre todos los nodos tipo Manager se elige, de forma automática, un nodo que será el lider y se encargará de mantener el correcto estado del clúster.

Por último comentar que los nodos Manager por defecto también actúan como nodos Worker aunque se puede cambiar su configuración para que sólo asuman tareas de Manager en caso de necesitarlo.

Nodos Workers: Este tipo de nodos simplemente reciben tareas de los nodos manager y se encargan de ejecutarlas.

Una vez tenemos claro los tipos de nodos que existen y cual es su cometido vamos a pasar a ver como se realiza la configuración del clúster.

Requisitos

  • Versión 1.2 o superior de Docker instalada en los host.

Configuración del clúster

Inicializar clúster y crear nuestro primer Host tipo Manager

En primer lugar tenemos que activar el modo swarm, para ello nos iremos a uno de los host que queremos que actúe como Manager y ejecutamos el siguiente comando.

Nota: Debéis sustituir la IP del ejemplo 192.168.233.132 por la IP que queráis utilizar para que vuestro servidor se comunique con el resto de hosts.

[sergio.portillo@localhost ~]$ sudo docker swarm init --advertise-addr 192.168.233.132:2377 --listen-addr 192.168.233.132:2377

Ejecutado el comando nos mostrará una información muy importante que necesitaremos para seguir avanzando con la creación de nuestro clúster. Os la explico paso a paso.

[sergio.portillo@localhost ~]$ sudo docker swarm init --advertise-addr 192.168.233.132:2377 --listen-addr 192.168.233.132:2377
[sudo] password for sergio.portillo:
Swarm initialized: current node (ax20j3drpcjo8b5p89mlj7vaf) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join --token SWMTKN-1-4qrqc1n83fqcy2fypuygkjabe97mkku8ou1rshdpou1z8dvp1k-2qv9pyuxxe8bf6uicpx9sr9sw 192.168.233.132:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

La primera línea nos indica que hemos inicializado el clúster y que el host actual ha pasado a ser del tipo Manager.

Swarm initialized: current node (ax20j3drpcjo8b5p89mlj7vaf) is now a manager.

El siguiente párrafo nos da el comando exacto que tendremos que utilizar para agregar al clúster aquellos hosts que vayan a ser del tipo Worker.

To add a worker to this swarm, run the following command:

docker swarm join --token SWMTKN-1-4qrqc1n83fqcy2fypuygkjabe97mkku8ou1rshdpou1z8dvp1k-2qv9pyuxxe8bf6uicpx9sr9sw 192.168.233.132:2377

El último párrafo nos indica el comando que tenemos que utilizar para obtener el comando final que usaremos para agregar a nuestro clúster nuevos hosts del tipo Manager.

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[sergio.portillo@localhost ~]$ sudo docker swarm join-token manager
[sudo] password for sergio.portillo:
To add a manager to this swarm, run the following command:

docker swarm join --token SWMTKN-1-4qrqc1n83fqcy2fypuygkjabe97mkku8ou1rshdpou1z8dvp1k-cfbqg0ocmn23ii7mgpz8e4qqf 192.168.233.132:2377

Por último tendremos que abrir, en el Firewall de nuestro host, el puerto 2377 para permitir la conexión del resto de hosts.

Agregar un Host tipo Manager

En el paso anterior inicializamos el clúster y creamos nuestro primer host tipo Manager, en esta ocasión vamos a unir un nuevo host que sea tipo Manager a nuestro clúster. Para ello nos iremos al nuevo servidor, abrimos en el Firewall de nuestro host el puerto 2377 y ejecutamos el comando que obtuvimos en el paso anterior aunque yo, como buena práctica, acostumbro a añadirle un par de parámetros adicionales para indicarle la IP y el puerto que utilizará el servidor para comunicarse con el resto de hosts (recordar sustituir la IP del ejemplo por las vuestras).

[sergio.portillo@localhost ~] sudo docker swarm join --token SWMTKN-1-4qrqc1n83fqcy2fypuygkjabe97mkku8ou1rshdpou1z8dvp1k-cfbqg0ocmn23ii7mgpz8e4qqf 192.168.233.132:2377  --advertise-addr 192.168.233.134:2377 --listen-addr 192.168.233.134:2377

Y listo ya tendremos agregado nuestro host al clúster como Manager.

[sergio.portillo@localhost ~] sudo docker swarm join --token SWMTKN-1-4qrqc1n83fqcy2fypuygkjabe97mkku8ou1rshdpou1z8dvp1k-cfbqg0ocmn23ii7mgpz8e4qqf 192.168.233.132:2377  --advertise-addr 192.168.233.134:2377 --listen-addr 192.168.233.134:2377
This node joined a swarm as a manager.

Agregar un Host tipo Worker

Para unir un host de tipo Worker a nuestro clúster simplemente tenemos que irnos a la máquina que queremos unir, abrir en el Firewall de nuestro host el puerto 2377 y ejecutar el comando que obtuvimos en el paso anterior aunque yo, al igual que hicimos antes, suelo añadirle un par de parámetros adicionales para indicarle al servidor la IP y puerto que debe de utilizar para comunicarse con el resto de hosts del clúster.

sudo docker swarm join --token SWMTKN-1-4qrqc1n83fqcy2fypuygkjabe97mkku8ou1rshdpou1z8dvp1k-2qv9pyuxxe8bf6uicpx9sr9sw 192.168.233.132:2377 --advertise-addr 192.168.233.133:2377 --listen-addr 192.168.233.133:2377

Y listo ya tenemos nuestro host agregado al clúster como un host del tipo Worker.

[sergio.portillo@localhost ~]$ sudo docker swarm join --token SWMTKN-1-4qrqc1n83fqcy2fypuygkjabe97mkku8ou1rshdpou1z8dvp1k-2qv9pyuxxe8bf6uicpx9sr9sw 192.168.233.132:2377 --advertise-addr 192.168.233.133:2377 --listen-addr 192.168.233.133:2377
This node joined a swarm as a worker.

Como ver los host que forman parte de nuestro clúster

Para poder ver los hosts que forman parte de nuestro cluster simplemente nos vamos a un host del tipo Manager y ejecutamos el siguiente comando:

[sergio.portillo@localhost ~]$ sudo docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
ax20j3drpcjo8b5p89mlj7vaf *   SERVER1             Ready               Active              Leader              18.09.1
r43ovu75ioubfa7s3rxu93t3b     SERVER2             Ready               Active                                  18.09.1

Podemos ver que tenemos un servidor del tipo Manager que actua como Leader (es normal al ser el único) y tenemos también otro servidor que actúa como Worker (Columna MANAGER STATUS en blanco).

Promover un Host tipo Worker a Manager

Si por algún motivo queremos promover un host tipo Worker a Manager simplemente tenemos que conectarnos a un host que sea del tipo Manager y ejecutar el siguiente comando sustituyendo el ID del ejemplo por el del servidor que queráis promover. Este ID podéis obtenerlo ejecutando el comando del paso anterior.

[sergio.portillo@localhost ~]$ sudo docker node promote r43ovu75ioubfa7s3rxu93t3b
Node r43ovu75ioubfa7s3rxu93t3b promoted to a manager in the swarm.

Y como podemos comprobar pasará al estado Reachable que nos indica que efectivamente ha pasado a ser del tipo Manager.

Importante: Para que el nuevo servidor pase a estar en estado Ready es muy importante que en el servidor que acabáis de promover abráis el puerto 2377 al igual que hicimos anteriormente con el primer servidor de tipo Manager.

[sergio.portillo@localhost ~]$ sudo docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
ax20j3drpcjo8b5p89mlj7vaf *   SERVER1             Ready               Active              Leader              18.09.1
r43ovu75ioubfa7s3rxu93t3b     SERVER2             Ready               Active              Reachable           18.09.1

Despromover un Host tipo Manager a Worker

Si en cambio queremos hacer lo inverso al punto anterior, es decir, pasar un nodo de Manager a Worker ejecutamos el siguiente comando sustituyendo el ID del ejemplo por el del servidor que queráis despromover.

[sergio.portillo@localhost ~]$ sudo docker node demote r43ovu75ioubfa7s3rxu93t3b
Manager r43ovu75ioubfa7s3rxu93t3b demoted in the swarm.

Y como podemos comprobar efectivamente nuestro nodo ha pasado a ser de tipo Worker de nuevo.

[sergio.portillo@localhost ~]$ sudo docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
ax20j3drpcjo8b5p89mlj7vaf *   SERVER1             Ready               Active              Leader              18.09.1
r43ovu75ioubfa7s3rxu93t3b     SERVER2             Ready               Active                         
18.09.1

Como obtener los comandos de unión en el caso que no los conozcamos

Si pasado un tiempo necesitais agregar nuevos hosts al clúster y no encontráis los comandos de unión que obtuvimos al crear el clúster no os preocupéis que voy a deciros los comandos que debéis utilizar para obtenerlos.

Obtener comando unión para un Host tipo Manager

sudo docker swarm join-token manager

Obtener comando unión para un Host tipo Worker

sudo docker swarm join-token worker

Estar atentos a próximas entradas que iré publicando sobre Docker.

Espero os haya sido de utilidad.

Entradas relacionadas

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.