Docker Logo

Mecanismos de descubrimiento de nodos con Swarm

En el artículo anterior sobre Swarm cubrimos uno de los mecanismos de descubrimiento de nodos que tiene. Sin embargo, la plataforma a día de hoy soporta otros gracias a un modelo extensible basado en plugins:

  • Servicio de descubrimiento alojado en Docker Hub (Hosted Discovery Service): el mecanismo utilizado en el artículo anterior.
  • Fichero de descripción del cluster.
  • Listado estático de IPs.
  • Etcd: un almacenamiento basado en claves de caracter distribuido y consistente para el descubrimiento de servicios y entornos de configuración compartida.
  • Consul: una herramienta para facilitar el descubrimiento y la configuración de servicios en tu infraestructura.
  • Apache Zookeper: un servidor open-source enfocado a la coordinación de sistemas distribuidos de forma altamente fiable.

En este artículo veremos cómo funciona dicho método de descubrimiento y cómo podemos hacer el descubrimiento de los nodos a través de otros dos métodos: un fichero de descripción del cluster y un listado de direcciones IP.

Servicio de descubrimiento alojado en Docker Hub

Swarm viene con este servicio sencillo de descubrimiento que se integra con Docker Hub. Actualmente está en fase alfa y su funcionamiento se basa en peticiones HTTP contra la API.

  • Crear un nuevo cluster: a la hora de crear un nuevo cluster en el artículo anterior, ejecutábamos el siguiente comando:
    $ docker run --rm swarm create

    Esto por debajo se traduce en una petición POST contra la URL: https://discovery-stage.hub.docker.com/v1/clusters. La respuesta es el identificador único de nuestro cluster que debemos guardar como comentaba.

  • Añadir un nuevo nodo: para añadir cada uno de los tres nodos que iban a formar nuestro cluster ejecutábamos lo siguiente:
    $ docker run -d swarm join --addr="node_ip" token://"cluster_id"

    Esto por debajo se traduce en una petición POST contra la URL: https://discovery-stage.hub.docker.com/v1/clusters/{{ClusterIdToken}} donde la variable {{ClusterIdToken}} será el identificador que hemos obtenido de la anterior. En el cuerpo de la petición deberemos incluir la siguiente pareja de datos:

    {{ip}}:{{puerto}}

    Reemplazando las variables {{ip}} y {{puerto}} por los del nodo que queremos añadir. Un OK como respuesta será el indicador de que la petición se ha realizado de forma correcta.

  • Listar los nodos en un cluster: para obtener la información de los nodos que se habían añadido al cluster ejecutábamos una consulta contra nuestro contenedor de gestión de swarm.
    Por debajo, esto se traducía en la siguiente llamada GET contra la URL: https://discovery-stage.hub.docker.com/v1/clusters/{{ClusterIdToken}} donde la variable {{ClusterIdToken}} será el identificador de nuestro cluster. La respuesta por parte del servicio será un listado de los nodos de una forma similar a la siguiente:

     ["{{ip:port}}","{{ip:port}}"]
  • Eliminar todos los nodos en el cluster : para eliminar todos los nodos que se han añadido al cluster esto se traduce en la siguiente llamada DELETE contra la URL: https://discovery-stage.hub.docker.com/v1/clusters/{{ClusterIdToken}} donde la variable {{ClusterIdToken}} será el identificador de nuestro cluster.
    Un OK como respuesta será el indicador de que la petición se ha realizado de forma correcta.

Si quieres probarlo de forma fácil, te dejo aquí una colección de Postman y su fichero de entorno correspondiente. Únicamente tendrás que configurar tu variable de entorno ClusterIdToken una vez que ejecutes la llamada de crear el cluster y ya podrás invocar el resto.

Fichero de descripción del cluster

Si no queremos interactuar con el servicio de descubrimiento de Docker Hub como explicaba en el apartado anterior podemos utilizar un fichero de texto que describa nuestro cluster. De esta manera, Swarm cogerá la información del mismo y podremos gestionarlo de forma similar al anterior.

Lo primero es crear nuestro fichero con el listado de las IPs de nuestros nodos:

$ echo <node_ip1:2375> >> /tmp/my_cluster
$ echo <node_ip2:2375> >> /tmp/my_cluster
$ echo <node_ip3:2375> >> /tmp/my_cluster

A partir de ahí, en lugar de gestionar nuestros nodos indicándole el token que identificaba de forma única a nuestro cluster, necesitaremos indicarle el fichero de definición que hemos creado. Si has seguido el otro artículo, sería algo similar a:

$ docker run -d -p 5005:2375 swarm manage file://tmp/my_cluster

A partir de ahí podemos interactuar con nuestro cluster de la misma forma.

Usando un listado de IPs estáticas

Finalmente, este método es el más sencillo de todos y el que menos pasos de configuración requiere. Únicamente es necesario indicar a Swarm un listado de direcciones IPs y puertos de los nodos en el momento de arrancar nuestro nodo gestor. Para ello, realizaremos lo siguiente:

$ docker run -d -p 5005:2375 swarm manage nodes://nodo_ip1:puerto,nodo_ip2:puerto, ...

O lo siguiente:

$ docker run -d -p 5005:2375 swarm manage nodo_ip1:puerto,nodo_ip2:puerto,...

A partir de ahí podemos interactuar con nuestro cluster de la misma forma.

En estos dos últimos escenarios, si tenemos que añadir un gran número de nodos a nuestro cluster podemos simplificar el proceso utilizando un patrón de rango de direcciones IP. Es decir, si queremos especificar el rango 192.168.1.0/24 lo podremos hacer de la siguiente forma 192.168.1.[1:254]

Leave a Reply

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