Entradas

docker swarm digital ocean

Cluster de servidores con Docker Swarm en Digital Ocean

Docker Swarm es una herramienta integrada en el ecosistema de Docker que permite la gestión de un cluster de servidores. Pone a nuestra disposición una API con la que podemos administrar las  tareas y asignación de recursos de cada contenedor dentro de cada una de las máquinas. Dicha API nos permite gestionar el cluster como si se tratase de una sola máquina Docker.

En este artículo veremos cómo construir un cluster de servidores con Docker Swarm, se utilizará Docker Machine con el driver de Digital Ocean para aprovisionar cada una de las máquinas.

Docker Swarm

 

La mejor manera de orquestar docker es con el propio docker Click Para Twittear

Requisitos

Para seguir este tutorial necesitamos los siguiente:

  • Tener instalado docker en tu máquina (puedes instalarlo desde aquí)
  • Disponer de un token de API de Digital Ocean. Si no lo tienes puedes generar uno siguiendo esta guía.

Generar el token de Swarm

El sistema de descubrimiento de nodos de Swarm, Discovery Service, se sirve de un token para reconocer todos nodos que forman parte de un clúster. Veamos como generar dicho token para poder hacer uso de Discovery Service.

En primer lugar guardaremos en una variable de sesión el token de Digital Ocean:

export DO_TOKEN="abcdefghijklmnopqrstuvwxyz1234567890"

A continuación, creamos una maquina con docker machine llamada swarm-1, dicha máquina servirá simplemente para generar el token de cluster:

docker-machine create \
--driver digitalocean \
--digitalocean-access-token ${DO_TOKEN} \
--digitalocean-image "ubuntu-16-04-x64" \
--digitalocean-region "lon1" \
--digitalocean-size "512mb" \
swarm-1

Seleccionamos esta maquina:

eval $(docker-machine env swarm-1)

Generamos el token de cluster:

docker run swarm create

Almacenamos en una variable de entorno dicho token y lo exportamos:

export SWARM_TOKEN=61ef79938e5559d480c2841991c49f5d

Ya podemos eliminar esta instancia de digital ocean, como hemos dicho sólo la necesitabamos para crear el ID.

docker-machine rm swarm-1

Nodo principal (Swarm Master)

Es el encargado de gestionar los recursos del clúster. Para crearlo ejecutaremos el siguiente código:

docker-machine create \
--driver digitalocean \
--digitalocean-access-token ${DO_TOKEN} \
--digitalocean-image "ubuntu-16-04-x64" \
--digitalocean-region "lon1" \
--digitalocean-size "512mb" \
--swarm --swarm-master \
--swarm-discovery token://${SWARM_TOKEN} \
swarm-master

Nodos secundarios

Una vez creado el nodo principal ya podemos añadir los nodos secundarios que necesitemos, en este caso vamos a añadir dos nodos al cluster:
Nodo 1:

docker-machine create \
--driver digitalocean \
--digitalocean-access-token ${DO_TOKEN} \
--digitalocean-image "ubuntu-16-04-x64" \
--digitalocean-region "lon1" \
--digitalocean-size "512mb" \
--swarm \
--swarm-discovery token://${SWARM_TOKEN} \
swarm-node-1

Nodo 2:

docker-machine create \
--driver digitalocean \
--digitalocean-access-token ${DO_TOKEN} \
--digitalocean-image "ubuntu-16-04-x64" \
--digitalocean-region "lon1" \
--digitalocean-size "512mb" \
--swarm \
--swarm-discovery token://${SWARM_TOKEN} \
swarm-node-2

Comprobamos que todos los nodos están funcionan correctamente

docker-machine ls

Si seleccionamos unos de los nodos: eval $(docker-machine env --swarm swarm-master)y, ejecutamos docker info, podremos ver la información de los dos nodos secundarios y del nodo principal, containers, CPUs, Memoria kernel.

Contenedores en el clúster

Vamos a ejecutar dos contenedores con la imagen nginx y aplicando una limitación de 400M de memoria a cada uno de los contenedores

docker run --name web-1 -d -P -m 400M nginx

Podemos comprobar si el contenedor está ejecutandose correctamente con docker ps. Observamos que el planificador de docker swarm ha escogido para correr el contenedor web-1 el nodo principal.

Veamos que ocurre si inicializamos otro contenedor denominado “web-2” con las mismas restricciones que el anterior:

docker run --name web-2 -d -P -m 400M nginx

En esta ocasión, el planificador ha asignado el contenedor al nodo 1, porque no había suficiente memoria en el nodo principal.

Si lo consideramos necesario podemos ampliar el tamaño del cluster, ejecutando simplemente:

docker-machine create \
--driver digitalocean \
--digitalocean-access-token ${DO_TOKEN} \
--digitalocean-image "ubuntu-16-04-x64" \
--digitalocean-region "lon1" \
--digitalocean-size "512mb" \
--swarm \
--swarm-discovery token://${SWARM_TOKEN} \
swarm-node-3

Conclusión

Hemos podido ver que orquestar hosts de Docker con Docker Swarm es un proceso relativamente sencillo. Poco a poco el ecosistema de docker se está volviendo más robusto y completo. En el caso concreto de Swarm,  personalmente aun no lo utilizaría en entornos de producción, pero como hemos podido ver es una herramienta que promete mucho.

Happy clustering!!