image1

Traefik es una herramienta muy potente gracias a que soporta varios providers como backend, en este caso usaremos traefik para que nos sirva como Dynamic Reverse Proxy sobre un cluster de Docker Swarm en Amazon Web Services.

Componentes:

3 Instancias (1 Manager  y 2 worker):

Manager: Esta instancia sera la que controlara todo el cluster, en ella desplegaremos traefik y los servicios que no son worker, esta instancia estará sobre una subnet , la cual llamaremos “subnet frontend” y tendrá su respectivo Secure Group

Worker: las instancias llamadas workers son dichas instancias donde correran nuestros servicios desplegados en AWS, sin tener en cuenta los servicios de “management” que podemos desplegar en la subnet de frontend, aquí desplegaremos los servicios que necesitemos como un web server, un micro servicio, etc, estas dos instancias estarán sobre otra subnet, la cual la llamaremos “subnet backend” y tendrá su respectivo Secure Group

Es necesario abrir estos puertos entre los  secure group frontend y backend para permitir la comunicación del cluster

  • 2377/tcp
  • 7946/tcp-udp
  • 4789/udp

Ya teniendo en cuenta los componentes, iniciemos:

Instalación de Docker y despliegue de Docker Swarm

Voy a concluir que ya se tiene desplegadas las instancias en cada subnet y se utilizo la ami de amazon linux, para instalar docker y dejarlo corriendo sin problemas es necesario ejecutar los siguientes comandos en las 3 instancias ( Manager  y workers )

sudo yum install docker
sudo service docker start
sudo chkconfig docker on

Con estos comandos, docker ya esta instalado, ahora si, vamos a crear un cluster de Docker Swarm

Inicializando el Cluster

Ejecutaremos este comando en la instancia “Manager” para inicializar el Swarm Cluster y obtener el token

docker swarm init

Obtendremos un output parecido a este:

image1

El output nos genera un token, este token lo usamos para unir los worker al cluster, ahora ejecutamos el siguiente comando en cada worker ( cambiando la ip de su respectiva instancia )

docker swarm join --token TOKEN-GENERADO \
--listen-addr ip-worker \
--advertise-addr ip-worker ip-manager:2377

En cada worker cambiar:

ip-worker:  la ip del worker

Después de ejecutar el comando anterior tendremos un output el cual nos dice que el nodo ingreso al cluster como worker:

“This node joined a swarm as a worker.”

Para verificar que docker Swarm pueda ver los nodos ejecutamos el siguiente comando en el manager para ver los nodos:

docker node ls

images3

Finalmente, creamos una red tipo overlay para nuestro cluster, ejecutamos el siguiente comando desde el manager:

docker network create --driver=overlay traefik-net

Desplegando Traefik en nuestro Swarm Cluster

Ya que tenemos listo nuestro Swarm Cluster, desde nuestro Manager vamos a desplegar nuestro Traefik, el cual se encargara de recibir todos los request y enviarlo a su respectivo container.

docker service create \
    --name traefik \
    --constraint=node.role==manager \
    --publish 80:80 --publish 8080:8080 \
    --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
    --network traefik-net \
    traefik \
    --docker \
    --docker.swarmmode \
    --docker.domain=traefik \
    --docker.watch \
    --web

Con el comando anterior, le decimos a docker que nos despliegue un nuevo servicio llamado traefik, nos publique el puerto 80 para recibir los request y el puerto 8080 para acceder al dashboard, tambien se especifica la red a utilizar, se especifica que es un servicio “manager” y  por ultimo los diferentes parámetros de docker swarm.

SI el comando anterior no genera ningun error, podemos ejecutar el siguiente comando para observar si el servicio fue desplegado.

docker service ls

image3

Como se observa en la imagen, vemos que se encuentra el servicio traefik desplegado y a la escucha de request por el puerto 80

Desplegando nuestras aplicaciones

Ya que tenemos nuestro Traefik funcionando en nuestro Swarm Cluster, podemos desplegar nuestras aplicaciones para que traefik haga balanceo del trafico, en este caso, volveré a usar la imagen de katacoda docker-http-server

docker service create \
    --name app01 \
    --constraint node.role==worker \
    --label traefik.port=80 \
    --network traefik-net \
    --label traefik.frontend.rule=Host:app01.braybaut.com \
    --label traefik.backend=app01 \
    katacoda/docker-http-server

En el despliegue del servicio app01 utilizamos varios label, los mas importantes son traefik.port=80 el cual le decimos a traefik el puerto a usar y traefik.frontend.rule=Host:app01.braybaut.co con este label, le decimos a traefik que todo el trafico que llegue a app01.braybaut.com debe ser redireccionado a los container que hagan parte de ese servicio app01

Desplegamos otro servicio el cual sera app02 y el endpoint sera: app02.braybaut.com

docker service create \
    --name app02 \
    --constraint node.role==worker \
    --label traefik.port=80 \
    --network traefik-net \
    --label traefik.frontend.rule=Host:app02.braybaut.com \
    --label traefik.backend=app02 \
    katacoda/docker-http-server

Observamos los servicios desplegados: image4

Observamos que tenemos nuestro traefik y  nuestras dos apps (app01 y app02)

Con esto, logramos desplegar dos apps en nuestro Swarm Cluster, ahora, podemos acceder desde nuestro balanceador a nuestras dos Apps.

image4

Con los anteriores Request, observamos que app01 se esta ejecutando en el contenedor d066207b1e23  y el app02 corre en el contenedor 80f164e6b5de

Cada contenedor se encuentra en una worker diferente:

image4

Podemos escalar  nuestros servicios y observar como funciona el balanceo de nuestro traefik:

Escalamos app01 a 4 containers

docker service scale app01=4

Realizamos peticiones a nuestro app con el endpoint app01.braybaut.com

image4

Como se observa en la imagen, en cada request responde un container diferente, esto quiere decir que traefik realiza el balanceo del trafico de una manera correcta.

Vemos que nuestro servicio se encuentra escalado:

image4

Esto es todo, traefik balancea nuestro trafico de una manera dinámica, sin importar el momento en que nuestro servicio escale, traefik sera capas de reconocer los nuevos container y balancear dicho trafico.

Mas información:

https://docs.docker.com/engine/swarm/

https://docs.traefik.io/