Get it on Google Play
Tu partner Freelance para tus proyectos IT

Edge Service con Traefik y Docker

26-06-2020

Traefik es uno de los players mas de moda en el mundo del despliegue de microservicios. Traefik es un proxy/router/balanceador para implementar dar salida a nuestros microservicios. Lo que lo hace tan especial es su integración con herramientas cloud como Docker, Kubernetes, etc.

En este artículo vamos a implementar un sistema de enrutamiento y balanceo de carga usando esta herramienta.

Arrancar Traefik como contenedor Docker

Podemos configurar Traefik a través de un fichero de configuración ‘yaml’, aunque también acepta el formato ‘toml’. Vamos a crear el siguiente fichero de configuración ‘traefik.yml’:

## traefik.yml

entryPoints:
  http:
    address: ":80"

providers:
  docker:
    network: "app1"

api:
  insecure: true

Este fichero de configuración tiene tres partes bien diferenciadas:

  • ‘entryPoints’ donde se configuran los puntos de entrada a la aplicación, en este caso solo configuramos el acceso http por el puerto 80.
  • ‘providers’ en Traefik hay que configurar los proveedores, en este caso solo le hemos configurado docker, pero tiene proveedores para Kubernetes, Rancher, etc. Gracias a los proveedores Trafeik será capaz de obtener la configuración dinámicamente.
  • ‘api’ Trafeik dispone de un dashboard para consultar la configuración del sistema y acceder a métricas para monitorización. En este caso le hemos configurado que lo arranque en modo inseguro.

Ahora que ya tenemos nuestro fichero de configuración(Muy sencillo) ya podemos crear una red en Docker(Es muy recomendable hacer que todos los contenedores de una misma app estén en su propia red) y arrancar Traefik:

# Creamos la red
sudo docker network create app1

# Arrancamos Trafeik
sudo docker run -d \
      -v /var/run/docker.sock:/var/run/docker.sock \
      -v /path/a/traefik.yml:/etc/traefik/traefik.yml \
      -p 80:80 \
      -p 8080:8080 \
      --network app1 \
      --name traefik \
      traefik:v2.2.1

Aquí arrancamos el contenedor de Traefik con el nombre ‘traefik’, usando la imagen ‘traefik:v2.2.1′(Que es la mas reciente hasta la fecha) y añadiéndolo a la red ‘app1’ (La misma que hemos creado ahora mismo). Además de esto hemos mapeado los puertos 80 y 8080 para tener acceso desde localhost al contenedor, hemos mapeado el fichero de configuración que hemos creado y mapeamos el fichero ‘/var/run/docker.sock'(Para que traefik se pueda auto-configurar).

Ahora mismo si accedemos a la URL http://127.0.0.1:8080 deberíamos ver un dashboard como este:

Traefik dashboard

Traefik dashboard

Os animo a que le echéis un vistazo porque tiene gran cantidad de información útil. A parte de esto, ahora mismo no hemos configurado nada de enrutamientos o balanceos de carga, esto es porque Trafeik leerá esta configuración de forma dinamica.

Enrutamiento en Trafeik

Vamos a suponer que tenemos una aplicación de microservicios que tiene dos microservicios de frontend, uno que escucha en la URL ‘/’ y el otro que escucha en la URL ‘/test’. Esto podemos simularlo arrancando contenedores con Nginx:

# Arrancamos el primer microservicio
sudo docker run -d \
      --name nginx1 \
      -l 'traefik.http.routers.router0.rule=Host(`127.0.0.1`)' \
      -l traefik.docker.network=app1 \
      --network app1 \
      nginx

# Arrancamos el segundo microservicio
sudo docker run -d \
      --name nginx2 \
      -l 'traefik.http.routers.router1.rule=Host(`127.0.0.1`) && PathPrefix(`/test`)' \
      -l traefik.docker.network=app1 \
      --network app1 \
      nginx

Fijaros que rápido! Simplemente añadiendo dos etiquetas al contenedor Traefik es capaz de autoconfigurarse. De hecho, la primera etiqueta configura la regla a usar para enrutar una petición hacia este microservicio(traefik.http.routers.router1.rule) y la segunda simplemente configura la network del proveedor docker de Trafeik(traefik.docker.network).

Para que sea mas fácil de ver lo que hace el servicio os recomiendo que ejecutéis estos comandos que básicamente añaden contenidos a los servicios de Nginx:

# Añadimos el contenido 'hola1' en '/'(En el primer Nginx)
sudo docker exec -it nginx1 /bin/bash -c "echo 'hola1' > /usr/share/nginx/html/index.html"

# Añadimos el contenido 'hola2' en '/' y 'hola2/test' en '/test'(En el segundo Nginx)
sudo docker exec -it nginx2 /bin/bash -c "echo 'hola2' > /usr/share/nginx/html/index.html; mkdir /usr/share/nginx/html/test; chmod 777 /usr/share/nginx/html/test; echo 'hola2/test' > /usr/share/nginx/html/test/index.html; chmod 666 /usr/share/nginx/html/test/index.html"

Ahora deberíamos ver fácilmente el comportamiento del servicio:

# Si ejecutamos el siguiente comando Traefik debería servir el contenido 'hola1'(Del primer Nginx)
curl 127.0.0.1/

# Si ejecutamos el siguiente comando Traefik debería servir el contenido 'hola2/test'(Del segundo Nginx)
curl 127.0.0.1/test

Como veis el principal fuerte de Trafeik es su capacidad para configurarse de manera automática a partir de los contenedores que tiene desplegados.

Balanceo de carga con Traefik

Después de ver como conseguimos enrutar peticiones a partir de una configuración vamos a ver como conseguimos balancear la carga entre dos o mas contenedores. Podemos hacerlo con el siguiente ejemplo(Eliminar los Nginx anteriores para no tener problemas):

sudo docker run -d \
      --name nginx3 \
      -l 'traefik.http.routers.router3.rule=Host(`127.0.0.1`)' \
      -l traefik.docker.network=app1 \
      --network app1 \
      nginx

sudo docker run -d \
      --name nginx4 \
      -l 'traefik.http.routers.router4.rule=Host(`127.0.0.1`)' \
      -l "traefik.http.services.nginx3.loadbalancer.server.port=80" \
      -l traefik.docker.network=app1 \
      --network app1 \
      nginx

Fijaros que lo único que añadimos a la segunda(Y sucesivas) réplicas del servidor la etiqueta ‘traefik.http.services.<servicio>.loadbalancer.server.port’ con el puerto. De esta manera, Trafeik ya sabe que tiene que añadir este servidor al servicio(En este caso nginx3) para balancearlos.

Al igual como hemos hecho antes mejor si modificamos el contenido de los nginx para ver cosas distintas:

# Añadimos el contenido 'hola3' en '/'(En el tercer Nginx)
sudo docker exec -it nginx3 /bin/bash -c "echo 'hola3' > /usr/share/nginx/html/index.html"

# Añadimos el contenido 'hola4' en '/'(En el cuarto Nginx)
sudo docker exec -it nginx4 /bin/bash -c "echo 'hola4' > /usr/share/nginx/html/index.html"

Ahora si ejecutamos varias veces ‘curl http://127.0.0.1/’ deberíamos recibir ‘hola3’ y ‘hola4’ alternativamente.

Como veis Traefik es super sencillo y 100% Cloud/Microservicios Friendly.

Si te ha servido, por favor comparte

Interesado en formación Docker?

 

Leave a Reply