Docker Logo

Desplegando un cluster de Docker con Swarm en Azure

En las últimas entradas en las que hablaba sobre Docker, todo el rato trabajaba contra un único servidor donde estaba alojado el motor. A la hora de realizar pruebas puede ser suficiente; sin embargo, a la hora de desplegar entornos más complejos, con alta disponibilidad y otras características de nivel empresarial, es necesario disponer de más herramientas.

El equipo de Docker está trabajando en ello con Machine, Compose y Swarm. La primera de ellas ya la cubrí en un artículo anterior, la segunda vendrá en uno futuro y la tercera es la que explicaré en este artículo.

Swarm es la solución nativa de clusterización para contenedores de Docker. Permite unificar diferentes motores como un único host virtual y desplegar en él tus soluciones. Lo mejor es que se puede gestionar desde otras herramientas de forma transparente como el propio cliente de Docker, Compose, Jenkins, etc

Vamos a ver cómo podemos montar un cluster de Docker y gestionarlo con Swarm desde cero en Azure. En lugar de utilizar las extensiones disponibles en Azure para máquinas virtuales, veremos cómo crearlo paso por paso a mano.

Desplegando los nodos que formarán el cluster

En primer lugar necesitaremos tener diferentes nodos en los que se esté ejecutando el motor de Docker donde poder desplegar nuestros contenedores y gestionarlo con Swarm. Para hacer un ejemplo un poco significativo desplegaremos tres nodos. Por lo tanto, necesitaremos crear tres máquinas virtuales en Azure con una distribución de Linux que soporte Docker como puede ser Ubuntu.

El esquema de nuestro servicio cloud será el siguiente, tendrá dichos tres nodos más uno extra que utilizaremos para gestión.

Docker Swarm Cluster Esquema
Docker Swarm Cluster Esquema

Como extra, desplegaremos los nodos de nuestro cluster dentro de un grupo de disponibilidad y una red virtual con dos subredes independientes

El grupo de disponibilidad nos permite que las máquinas que usemos estén en alta disponibilidad. De esta manera, si existe algún problema con Azure nuestro cluster estará protegido para que no todos los nodos caigan. Por otro lado, el uso de una red virtual nos va a permitir gestionar el rango de direcciones privadas que utilizarán las máquinas.

Los pasos que debemos realizar son los siguientes:

  1. Desplegar las cuatro máquinas con Ubuntu en Azure: az4li-dock-sw-1, az4li-dock-sw-2, az4li-dock-sw-3, az4li-ubu-man
  2. Instalar Docker en todas ellas siguiendo el procedimiento Instalación manual del motor de Docker del artículo anterior publicado.
  3. Opcional: Si queremos evitar tener que utilizar sudo a la hora de invocar los comandos, podemos añadir a nuestro usuario al grupo Docker con lo siguiente:

    $ sudo usermod -aG docker tuUsuario

    Será necesario cerrar la sesión para que se apliquen los permisos correctos.

  4. Por defecto, Docker utiliza sockets unix para las comunicaciones pero necesitaremos disponer de extremos TCP para Swarm. Por lo tanto, lo podemos configurar sin certificados SSL o con certificados SSL según lo deseemos. La recomendación es hacerlo con SSL si van a estar expuestos a Internet. En nuestro caso, dado que solo estarán en nuestra red privada lo haremos sin certificados.
  5. Opcional: si no quieres configurar el motor de Docker cada vez que reinicies la máquina para que arranque escuchando en el puerto tcp es posible modificar la variable DOCKER_OPTS en el fichero /etc/default/docker para que incluya el parámetro.

    DOCKER_OPTS="-H 0.0.0.0:2375"

Configurando el cluster con Swarm

Ejecutaremos el proceso de crear nuestro cluster de Swarm en nuestro nodo de gestión llamado az4li-ubu-man. El procedimiento recomendado para su instalación es realizarlo como un contenedor de Docker. Para ello, nos bajaremos la imagen de Swarm y la lanzaremos con el parámetro de crear.

$ docker pull swarm
$ docker run --rm swarm create
Creando un contenedor con swarm
Creando un contenedor con swarm

Tras lanzar el comando run es importante que guardemos dicha cadena ya que será el identificador único de nuestro cluster.

Añadiendo los nodos de Docker al cluster

Cada nodo que vaya a formar parte del cluster necesita ejecutar un agente de Swarm que permitirá asociarlo al mismo. Además, será el encargado de monitorizar e informar sobre su estado.

Para ello, en cada uno de los nodos ejecutaremos un contenedor con el agente de Swarm:

$ docker run -d swarm join --addr="node_ip" token://"cluster_id"

Será necesario que reemplacemos node_ip por la de cada uno de nuestros nodos, y cluster_id por el identificador único de nuestro cluster que comentaba en el apartado anterior. En la imagen se ve el proceso en uno de ellos.

Añadiendo un nodo de Docker a Swarm
Añadiendo un nodo de Docker a Swarm

Gestionando nuestro cluster

Finalmente, una vez que ya tenemos nuestro cluster creado y los nodos unidos a él, nos queda realizar las tareas de gestión del mismo. Para ello, en nuestro equipo de gestión, az4li-ubu-man, lanzaremos un contenedor que ejecute las tareas de gestión de Swarm. No obstante, podemos gestionarlo desde otra máquina en Azure o desde nuestro equipo local.

Utilizando el parámetro manage, crearemos un nuevo contenedor sobre la imagen de Swarm y lo ejecutaremos exponiendo un puerto al exterior. A través de dicho puerto gestionaremos nuestro cluster de Swarm de la misma manera que lo hacemos con el motor de Docker. Esto es posible ya que el equipo de Docker ha implementado la misma api de Docker en Swarm para las comunicaciones.

$ docker run -d -p 5005:2375 swarm manage token://"cluster_id"

Una vez en ejecucción únicamente será necesario conectarnos con nuestro cliente de Docker y ejecutar los comando tradicionales como version, donde veremos que nos estamos comunicando con Swarm revisando la cadena Server version: swarm/0.1.0

Comprobando la versión de Swarm
Comprobando la versión de Swarm

U obtener la información de los nodos que forman parte del cluster.

Obtener información de nodos de Swarm
Obtener información de nodos de Swarm

A partir de aquí ya podremos empezar a trabajar con nuestro cluster de Docker pero eso ya será motivo para otro artículo.

One thought on “Desplegando un cluster de Docker con Swarm en Azure”

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.