Appearance
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 versionDocker
bash
docker run -d \
--name traefik \
-p 80:80 \
-p 8080:8080 \
-v /var/run/docker.sock:/var/run/docker.sock \
traefik:v3.0Configuració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: webConfiguració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: 50Balanceador 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: 0En 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/\$/\$\$/gVentajas 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.