Skip to content

Traefik

© 2020 by César Arcila

El concepto de proxy inverso, en pocas palabras, permite el enrutamiento de direcciones publicas a direcciones (y puertos) definidas por servicios internos en una máquina, brindando seguridad y organización de las aplicaciones o servicios. Traefik no sólo aplica este concepto, sino tambien otros aspectos como el de balanceador de carga y SSL de un modo simple.

Si se ha escuchado sobre Nginx, el cual cumple la misma función, entonces se comprende que es una alternativa muy eficiente y enfocada para la gestión en la nube (DevOps). Al igual que Docker está escrito en el lenguaje Go y orientado para el uso de contendores de un modo más sencillo (proporcionando integración con Docker).

Nuevamente, el contexto de esta herramienta corresponde a una dirección de internet que nos lleva a nuestra infraestructura, en la cual podemos traducir una ruta externa (consultada por el usuario) a una interna (disponible por una aplicación, servicio, o en un contenedor). Esto puede asociarse también con el mapeo de diversos servidores internos que prestan distintos servicios aunque para un usuario sólo consiste en direcciones con rutas públicas sencillas que hasta los buscadores las proporcionan (por ejemplo: domain.com/blog, app.domain.com, mail.domain.com).

Instalación

Instalación directa

bash
# Linux
wget https://github.com/traefik/traefik/releases/download/v3.0.0/traefik_v3.0.0_linux_amd64.tar.gz
tar -xzf traefik_v3.0.0_linux_amd64.tar.gz
sudo mv traefik /usr/local/bin/

# macOS
brew install traefik

# Verificar instalación
traefik version

Docker

bash
docker run -d \
  --name traefik \
  -p 80:80 \
  -p 8080:8080 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  traefik:v3.0

Configuración básica

Archivo de configuración

Crear traefik.yml:

yaml
api:
  dashboard: true
  insecure: true

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

providers:
  docker:
    exposedByDefault: false
  file:
    filename: /etc/traefik/dynamic.yml

certificatesResolvers:
  letsencrypt:
    acme:
      email: [email protected]
      storage: acme.json
      httpChallenge:
        entryPoint: web

Configuración dinámica

Crear dynamic.yml:

yaml
http:
  routers:
    api:
      rule: "Host(`traefik.localhost`)"
      service: "api@internal"
      middlewares:
        - "auth"

  middlewares:
    auth:
      basicAuth:
        users:
          - "admin:$2y$10$..."

Ejemplo con Docker Compose

yaml
version: '3.8'

services:
  traefik:
    image: traefik:v3.0
    container_name: traefik
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.yml:/etc/traefik/traefik.yml:ro
      - ./acme.json:/acme.json
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.dashboard.rule=Host(`traefik.localhost`)"
      - "traefik.http.routers.dashboard.service=api@internal"

  webapp:
    image: nginx:alpine
    container_name: webapp
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.webapp.rule=Host(`app.localhost`)"
      - "traefik.http.services.webapp.loadbalancer.server.port=80"

  api:
    image: node:alpine
    container_name: api
    command: node server.js
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api.rule=Host(`api.localhost`)"
      - "traefik.http.services.api.loadbalancer.server.port=3000"

Middlewares comunes

Autenticación básica

yaml
http:
  middlewares:
    auth:
      basicAuth:
        users:
          - "user:$2y$10$hashed_password"

Redirección HTTPS

yaml
http:
  middlewares:
    redirect-to-https:
      redirectScheme:
        scheme: https
        permanent: true

  routers:
    web-redirect:
      rule: "hostregexp(`{host:.+}`)"
      entrypoints:
        - "web"
      middlewares:
        - "redirect-to-https"

Rate Limiting

yaml
http:
  middlewares:
    rate-limit:
      rateLimit:
        burst: 100
        average: 50

Balanceador de carga

yaml
http:
  services:
    my-service:
      loadBalancer:
        servers:
          - url: "http://10.0.0.1:8080"
          - url: "http://10.0.0.2:8080"
        healthCheck:
          path: "/health"
          interval: "30s"

SSL/TLS automático

yaml
certificatesResolvers:
  letsencrypt:
    acme:
      email: [email protected]
      storage: acme.json
      httpChallenge:
        entryPoint: web
      # O usar DNS challenge
      dnsChallenge:
        provider: cloudflare
        delayBeforeCheck: 0

En los servicios:

yaml
labels:
  - "traefik.http.routers.app.tls=true"
  - "traefik.http.routers.app.tls.certresolver=letsencrypt"

Ejemplo completo de producción

yaml
# traefik.yml
api:
  dashboard: true

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entrypoint:
          to: websecure
          scheme: https
  websecure:
    address: ":443"

providers:
  docker:
    exposedByDefault: false
  file:
    filename: /etc/traefik/dynamic.yml
    watch: true

certificatesResolvers:
  letsencrypt:
    acme:
      email: [email protected]
      storage: /letsencrypt/acme.json
      httpChallenge:
        entryPoint: web

log:
  level: INFO

accessLog: {}

metrics:
  prometheus: {}

Comandos útiles

bash
# Ejecutar con configuración
traefik --configfile=traefik.yml

# Validar configuración
traefik --configfile=traefik.yml --dry-run

# Ver dashboard
open http://localhost:8080

# Generar hash para autenticación
echo $(htpasswd -nb user password) | sed -e s/\$/\$\$/g

Ventajas de Traefik

  • Autodescubrimiento: Detecta servicios automáticamente
  • SSL automático: Certificados Let's Encrypt integrados
  • Dashboard: Interfaz web para monitoreo
  • Middlewares: Funcionalidades modulares
  • Multi-provider: Docker, Kubernetes, Consul, etc.
  • Hot reload: Recarga configuración sin reinicio
  • Métricas: Prometheus y Jaeger integrados

Traefik simplifica significativamente la gestión de proxy inverso y balanceador de carga, especialmente en entornos containerizados y de microservicios.