Utilizando Traefik como Dynamic Reverse Proxy en Docker Swarm sobre AWS

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 )

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

Obtendremos un output parecido a este:

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 )

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:

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

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.

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.

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

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

Observamos los servicios desplegados:

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.


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:

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

Escalamos app01 a 4 containers

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

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:

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/

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *