Home » Balanceo con Traefik
banner de balanceo con traefik

Balanceo con Traefik

He sabido de muchos que tienen interés por Traefik pero han sufrido en su proceso de aprendizaje y configuración. Yo mismo pasé por la misma experiencia. Así que en esta ocasión me enfoco en explicar de la manera más sencilla posible sobre esta genial herramienta para el balanceo de aplicaciones.

Hoy hablaré sobre balanceo con Traefik hecho de forma sencilla. Es que para entornos pequeños o de prueba, a veces deseas una opción rápida de balanceo de una aplicación con uno o más servidores detrás. Esto no quiere decir que Traefik no sea adecuado para entornos más críticos o de producción.

Hay distintas opciones para configurar balanceadores por software en el mundo Open Source, tales como haproxy y nginx, siendo esta última quizá la más popular. Pero traefik es una excelente opción, fácil de configurar como te lo mostraré a continuación.

1. ¿Qué es Traefik?

Traefik es un proxy inverso y balanceador de carga moderno, diseñado para entornos de microservicios y aplicaciones nativas de la nube.

Es un proyecto de código abierto y de uso gratuito. Sin embargo, ofrece también algunos componentes y servicios adicionales que sí son de pago, tal como el API Gateway, API Management y Soporte (más información aquí)

Su principal fortaleza radica en la configuración automática y dinámica, integrándose con diversas infraestructuras como Docker, Kubernetes, y más. Esto significa que Traefik puede descubrir y configurar automáticamente los servicios que se ejecutan en tu infraestructura, simplificando enormemente la gestión del tráfico y la exposición de aplicaciones.

No menos importante es mencionar que Traefik cuenta con un amplio catálogo de plugins que permiten extender la funcionalidad de la solución. Por ejemplo, hay varios plugins relacionados a seguridad, como WAF, bloqueo de IPs con fail2ban, autenticación con Keycloak, bloqueo por países, entre otros. Compruébalo tú mismo mirando la lista de todos los plugins disponibles. De este modo, ya te vas dando cuenta que el balanceo con traefik es solo una de las funcionalidades base iniciales, pero puede hacer más, mucho más en realidad.

Aprender Traefik es crucial porque facilita la implementación, el escalado y la gestión de aplicaciones complejas, optimizando el rendimiento y la seguridad, lo cual es esencial en el desarrollo y despliegue de aplicaciones modernas.

2. Instalación en Linux

Si bien Traefik suele ser más usado en entornos de contenedores, como Docker y Kubernetes, en esta ocasión haré la instalación sobre una máquina virtual Ubuntu para poder explicar los conceptos base de forma sencilla.

Por ello, es necesario descargar la última versión del binario de Traefik para tu arquitectura en la página de releases.

# Ejemplo
wget https://github.com/traefik/traefik/releases/download/v3.2.3/traefik_v3.2.3_linux_amd64.tar.gz

Luego, descomprimes el tarball e instalas el binario en /usr/local/bin:

tar -zxf traefik_v3.2.3_linux_amd64.tar.gz

sudo install traefik /usr/local/bin

Ahora, crea el archivo de servicio Systemd en /etc/systemd/system/traefik.service con este contenido:

[Unit]
Description=Traefik
Documentation=https://doc.traefik.io/traefik/
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/traefik
AssertPathExists=/etc/traefik/traefik.yml

[Service]
Type=notify
ExecStart=/usr/local/bin/traefik --configFile=/etc/traefik/traefik.yml
Restart=always
WatchdogSec=1s

[Install]
WantedBy=multi-user.target

Guarda los cambios en el archivo, crea el archivo de configuraación vacío y aplica los cambios en Systemd:

sudo mkdir /etc/traefik
sudo touch /etc/traefik/traefik.yml

sudo systemctl daemon-reload

3. Configuración de Traefik

El archivo Systemd de traefik creado previamente hace referencia a /etc/traefik/traefik.yml como archivo de configuración. Si bien la ruta es sugerida, no hay una ubicación ni nombre de archivo que deba ser obligatorio, pues tú lo decides. Lo que importa es el contenido de la configuración que te mostraré a más adelante como ejemplo.

3.1. Conceptos base – Tipos de configuraciones

Traefik tiene dos grupos de configuraciones: las estáticas y las dinámicas.

Las configuraciones estáticas están relacionadas a aspectos propios del arranque del servicio y otros referentes a parámetros que no suelen ser de modifcación frecuente, tal como los providers y entrypoints. El cambio de estas configuraciones sí requiere un reinicio del servicio Traefik.

En cambio, las configuraciones dinámicas (que son la mayoría) están relacionadas a cómo Traefik maneja las peticiones y enrutamiento Web. Esto agrupa configuraciones que sí requieren ser modificadas con mayor frecuencia, tal como los routers, middlewares y services. La principal ventaja es que éstas no requieren un reinicio del servicio Traefik para hacerse efectivas, pues son detectadas y aplicadas dinámicamente de forma inmediata.

3.2. Configuración base (estática)

En el archivo /etc/traefik/traefik.yml debes colocar una configuración base como la siguiente:

---
entryPoints:
  web:
    address: ":80"
  websecure:
    address: ":443"

providers:
  file:
    directory: /etc/traefik/rules
    watch: true

log:
  filePath: /var/log/traefik.log
  level: INFO

accessLog:
  filePath: /var/log/access.log

Este archivo tiene las configuraciones mínimas recomendadas, todas de tipo estático. A continuación, te explico qué significan estas líneas:

3.3. Conceptos base – entryPoints

Los EntryPoints son los puntos de entrada de las conexiones a Traefik. Definen las direcciones IP, puerto y protocolo (TCP o UDP) por los cuales el servicio recibirá paquetes.

En el ejemplo mostrado arriba, se ha creado dos entryPoints: uno llamado «web» que escucha en el puerto 80, y otro llamado «websecure» que escucha en el puerto 443.

Descripción gráfica de los entryPoints
Fuente de imagen

https://doc.traefik.io/traefik/routing/entrypoints/

3.4. Conceptos base – providers

Traefik maneja el descubrimiento de configuraciones a través de los Providers. Los providers son componentes de infraestructura que son servidos y/o balanceados por Traefik.

Por ejemplo, si Traefik va a balancear el tráfico hacia un grupo de contenedores Docker, entonces el provider a utilizar será Docker. Lo mismo si se trata de Pods detrás de Ingress, entonces el provider será Kubernetes. Si en cambio, los hostnames o IPs de los servidores detrás de Traefik son definidos en alguna fuente de datos (archivo o servicio clave-valor) entonces el provider será uno compatible con dicha fuente de datos.

Descripción gráfica de los providers
Fuente de imagen

https://doc.traefik.io/traefik/providers/overview

El Provider define la fuente de datos (estática o dinámica) que permite indicar a Traefik cuáles son los hostnames o IPs de los equipos que están detrás y serán balanceados. Es así que si queremos definir dicha lista de equipos a través de un archivo estático YAML, el provider es File. De modo similar, la fuente de datos podría estar en un servicio Consul o Redis, para lo cual el provider a usar será Consul o Redis respectivamente.

Para que tengas una mejor idea, revisa la lista de todos los providers soportados por Traefik.

En el ejemplo de configuración mostrado en el punto 3.2, se ha definido un único provider de tipo «file» que apunta al directorio /etc/traefik/rules en busca de cualquier archivo YAML que pueda contener configuraciones dinámicas de enrutamiento (Ejm: routers, services, middlewares, etc.)

3.5. Otras configuraciones

En el mismo archivo de configuración del punto 3.2, se incluye unas configuraciones de logging que dice que:

  • Los logs del servicio Traefik se almacenan en /var/log/traefik.log
  • Los logs de acceso a los servicios se almacenan en /var/log/access.log
3.6. Configuración de enrutamiento (dinámica)

En la configuración mostrada en el punto 3.2 se hace referencia al directorio /etc/traefik/rules donde el provider «file» busca archivos YAML para configuraciones de balanceo con Traefik. Dado que el directorio no existe, hay que crearlo:

sudo mkdir /etc/traefik/rules

Ahora, crea un archivo de cualquier nombre pero de extensión .yaml o .yml tal como /etc/traefik/rules/routing.yml con un contenido como el siguiente:

---
http:
  routers:
    router1:
      rule: Host(`miempresa.com`) || Host(`www.miempresa.com`)
      service: service1
      tls:
        options: default
      entrypoints:
        - websecure

  services:
    service1:
      loadBalancer:
        servers:
          - url: http://192.168.0.201
          - url: http://192.168.0.202
          - url: http://192.168.0.203

tls:
  certificates:
    - certFile: /etc/traefik/miempresa.com.crt
      keyFile: /etc/traefik/miempresa.com.key

  options:
    default:
      minVersion: VersionTLS12
      maxVersion: VersionTLS13

Este archivo tiene las configuraciones mínimas recomendadas, todas de tipo dinámico. A continuación, te explico qué significan estas líneas:

3.7. Conceptos base – routers

Un router está a cargo de conectar las peticiones entrantes con los servicios o services que pueden procesarlos.

El router recibe las conexiones entrantes por un entryPoint y luego decide a cuál de los services existentes enviarlo. Por ello, su trabajo es solo de decisión y enrutamiento, tal cual lo hace un router de red tradicional.

Los routers pueden ser de tipo HTTP, TCP o UDP.

Descripción gráfica de los routers
Fuente de imagen

https://doc.traefik.io/traefik/routing/routers

En el ejemplo mostrado en la configuración se tiene un router de nombre «router1» que:

  • Es de tipo HTTP, debido a la anidación debajo de «http» al inicio del archivo.
  • Solo escucha peticiones por el entryPoint «websecure» (es decir, por el puerto 443).
  • Tiene activo el soporte TLS con un grupo de opciones o parámetros de nombre «default» el cual, líneas más abajo, indica que solo TLS v1.2 y v1.3 están soportados.
  • Acepta conexiones solo si la petición está dirigida hacia los dominios «miempresa.com» o «www.miempresa.com», según el valor definido en el encabezado Host de la conexión HTTP.
  • Según el nombre de dominio pedido y servido por el router («miempresa.com» o «www.miempresa.com»), Traefik buscará usar alguno de los certificados TLS definidos en la sección tls.certificates si es que coinciden con el campo CommonName y/o SubjectAlternativeName.
  • Pasa la petición hacia el servicio destino de nombre «service1» para que procese la conexión.
3.8. Conceptos base – services

Un service de Traefik es el responsable de configurar cómo conectar con los servicios de aplicaciones (servidores) que son los encargados de recibir y procesar las conexiones entrantes.

Los services pueden ser, también, de tipo HTTP, TCP o UDP.

Descripción gráfica de los services
Fuente de imagen

https://doc.traefik.io/traefik/routing/services

En el ejemplo mostrado en la configuración del punto 3.6 se tiene un service de nombre «service1» que:

  • Es de tipo HTTP, debido a la anidación debajo de «http» al inicio del archivo.
  • Realiza un balanceo de tipo round-robin con 3 servidores HTTP de IPs 192.168.0.201, 192.168.0.202 y 192.168.0.203.
3.9. Otras configuraciones

La sección tls tiene dos subsecciones:

  • certificates : Define una lista de pares de certificado y llave privada que pueden ser usados por alguno de los routers, siempre que coincidan los nombres del certificado (CommonName o SubjectAlternativeName).
  • options : Indica parámetros de TLS, tal como las versiones mínimas y máximas del protocolo soportadas en las conexiones.

Ambas subsecciones son usadas o referenciadas por uno o más routers.

4. Puesta en marcha

Una vez que terminamos la configuración de balanceo con Traefik, es momento de levantar el servicio y hacer las pruebas de conexión:

sudo systemctl enable traefik
sudo systemctl start traefik

Podemos mantener dos sesiones abiertas de shell para monitorear los logs por separado:

sudo tail -f /var/log/traefik.log
sudo tail -f /var/log/access.log

Luego, desde un navegador Web debemos apuntar hacia «miempresa.com» o hacia «www.miempresa.com» para verificar que podamos acceder a nuestra aplicación hospedada en cualquiera de los 3 servidores con IPs 192.168.0.201, 192.168.0.202 o 192.168.0.203.

Sin embargo, hay que tener en cuenta que:

  • Se asume que ya existe un registro DNS que resuelve «miempresa.com» y/o «www.miempresa.com» hacia la IP del servidor Traefik.
  • Si lo anterior no se cumple, al menos temporalmente, se puede realizar la prueba si se inscribe la IP del servidor Traefik en el archivo hosts de nuestro equipo cliente asociado a los nombres «miempresa.com» y/o «www.miempresa.com»
  • Los 3 servidores de IPs 192.168.0.201, 192.168.0.202 y 192.168.0.203 ya deben tener instalado y configurado un servidor Web con una aplicación operativa. Los 3 equipos deben tener la misma configuración y contenido de la aplicación para garantizar que el cliente vea siempre el mismo contenido.

A continuación, el diagrama de cómo quedaría la arquitectura simple de Traefik con las configuraciones realizadas en este artículo:

arquitectura de traefik para balanceo de 3 nodos

5. Conclusión

Este fue un post algo extenso, pero creí importante hacer las explicaciones necesarias de forma detallada para que no haya confusiones sobre los términos manejados por Traefik.

Si bien la forma común de instalar Traefik es sobre Docker o Kubernetes, he optado por la instalación más simple sobre una máquina virtual para evitar posibles complicaciones.

Traefik cuenta con muchas más configuraciones disponibles que hacen más flexible y potente esta herramienta. Espero poder compartir más sobre esto en un próximo artículo.

Si te fue de utilidad este post, no dudes en compartirlo.

Post navigation

Deja un comentario

Deja una respuesta

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