Traefik es un enrutador de borde (Edge Router) de código abierto que descubre y configura automáticamente rutas a sus servicios integrándose directamente con orquestadores como Docker y Kubernetes, actuando como un proxy inverso dinámico y un balanceador de carga.
Conceptos Fundamentales
Traefik opera sobre un modelo de configuración dinámica, eliminando la necesidad de actualizaciones manuales de archivos y reinicios de servicios cuando los servicios de backend cambian. Esta adaptabilidad en tiempo real se logra a través de varios componentes interconectados.
Proveedores
Los proveedores son los conectores que permiten a Traefik interactuar con su infraestructura. Monitorean la API del orquestador subyacente en busca de cambios, como nuevos contenedores, servicios o despliegues.
Los proveedores comunes incluyen:
* Docker: Monitorea eventos del demonio Docker y etiquetas de contenedores.
* Kubernetes: Monitorea la API de Kubernetes para recursos Ingress, IngressRoute, Service y Endpoint.
* File: Lee la configuración de archivos estáticos YAML o TOML.
* Consul, etcd, ZooKeeper: Se integra con almacenes de clave-valor para configuración dinámica.
Configuración de Enrutamiento
Traefik procesa las solicitudes entrantes a través de un flujo de enrutamiento definido:
- EntryPoints: Son oyentes de red que definen los puertos en los que Traefik escucha (por ejemplo,
weben el puerto 80,websecureen el puerto 443). - Routers: Los enrutadores analizan las solicitudes entrantes basándose en reglas definidas (por ejemplo,
Host(),PathPrefix(),Headers()). Si una solicitud coincide con la regla de un enrutador, se reenvía. Los enrutadores también especifican en qué EntryPoints escuchan y pueden aplicar Middlewares. - Middlewares: Los Middlewares son componentes que pueden modificar las solicitudes antes de que lleguen al servicio o modificar las respuestas antes de que se envíen de vuelta al cliente. Se pueden encadenar.
- Services: Los servicios definen cómo alcanzar las instancias reales de la aplicación de backend. Un servicio típicamente apunta a una o más direcciones IP y puertos de su aplicación. Traefik puede balancear la carga de las solicitudes entre múltiples instancias de un servicio.
El flujo es: Solicitud -> EntryPoint -> Router -> Middleware(s) -> Service -> Aplicación de Backend.
Características Clave
Descubrimiento Automático de Servicios
Traefik se integra directamente con orquestadores como Docker y Kubernetes. Descubre automáticamente los servicios leyendo metadatos (por ejemplo, etiquetas de Docker, anotaciones de Kubernetes o Custom Resources) y actualiza dinámicamente su configuración de enrutamiento sin requerir ninguna intervención manual o reinicios. Esto elimina la necesidad de mantener archivos de configuración de proxy separados.
Terminación SSL/TLS
Traefik ofrece soporte integrado para la terminación SSL/TLS. Puede aprovisionar y renovar certificados automáticamente utilizando Let's Encrypt a través del protocolo ACME (Automatic Certificate Management Environment), soportando los desafíos HTTP-01, TLS-ALPN-01 y DNS-01. También se pueden configurar certificados personalizados.
Balanceo de Carga
Traefik actúa como un balanceador de carga, distribuyendo el tráfico entrante entre múltiples instancias de un servicio.
Las estrategias de balanceo de carga disponibles incluyen:
* Round Robin: Distribuye las solicitudes secuencialmente a cada servidor.
* Weighted Round Robin: Permite asignar pesos a los servidores para controlar la distribución del tráfico.
* Sticky Sessions: Asegura que las solicitudes de un cliente específico siempre se enruten al mismo servidor.
Middlewares
Los Middlewares proporcionan una forma flexible de modificar solicitudes o respuestas. Se pueden aplicar a enrutadores específicos o globalmente.
Ejemplos de middlewares comunes incluyen:
* Autenticación: Autenticación básica (BasicAuth), autenticación Digest.
* Rate Limiting: Controla el número de solicitudes que un cliente puede realizar dentro de un tiempo especificado.
* Manipulación de Encabezados: Añadir, eliminar o modificar encabezados de solicitud/respuesta.
* Redirecciones: Redirección de HTTP a HTTPS, redirecciones permanentes.
* IP Whitelisting/Blacklisting: Restringir el acceso basado en direcciones IP del cliente.
Dashboard
Traefik incluye un panel de control basado en web que proporciona una visión general en tiempo real de los enrutadores, servicios y middlewares configurados. Permite a los administradores inspeccionar la configuración activa y monitorear el tráfico.
Traefik con Docker
La integración de Traefik con Docker implica ejecutar Traefik como un contenedor y permitirle acceder al socket del demonio Docker. La configuración del servicio se gestiona típicamente a través de etiquetas de Docker en los contenedores de la aplicación.
Ejemplo de Configuración docker-compose.yml
El siguiente ejemplo demuestra un archivo docker-compose.yml para configurar Traefik y una aplicación de ejemplo whoami.
version: '3.8'
services:
traefik:
image: traefik:v2.10
command:
- --api.dashboard=true
- --providers.docker=true
- --providers.docker.exposedbydefault=false # Solo expone servicios con traefik.enable=true
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --certificatesresolvers.myresolver.acme.tlschallenge=true # Para Let's Encrypt
- --certificatesresolvers.myresolver.acme.email=your-email@example.com
- --certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json # Almacenamiento persistente para certificados
ports:
- "80:80"
- "443:443"
- "8080:8080" # Exponer el Dashboard de Traefik
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro" # Montar el socket de Docker para acceso del proveedor
- "./letsencrypt:/letsencrypt" # Almacenamiento persistente para certificados ACME
labels:
# Habilitar Traefik para el propio servicio del dashboard
- "traefik.enable=true"
# Enrutador para el dashboard de Traefik
- "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.yourdomain.com`)"
- "traefik.http.routers.traefik-dashboard.entrypoints=websecure"
- "traefik.http.routers.traefik-dashboard.service=api@internal" # Servicio API interno de Traefik
- "traefik.http.routers.traefik-dashboard.tls.certresolver=myresolver"
# Middleware de autenticación básica para el dashboard (reemplazar con el hash htpasswd real)
- "traefik.http.routers.traefik-dashboard.middlewares=dashboard-auth@docker"
- "traefik.http.middlewares.dashboard-auth.basicauth.users=user:$$apr1$$YOUR_HTPASSWD_HASH"
networks:
- web
whoami:
image: traefik/whoami
labels:
- "traefik.enable=true" # Habilitar Traefik para este servicio
- "traefik.http.routers.whoami.rule=Host(`whoami.yourdomain.com`)" # Definir regla de enrutamiento
- "traefik.http.routers.whoami.entrypoints=websecure" # Escuchar en websecure (HTTPS)
- "traefik.http.routers.whoami.tls.certresolver=myresolver" # Usar el resolvedor de Let's Encrypt
networks:
- web
networks:
web:
external: true # Usar una red externa para todos los servicios orientados a la web
Nota: Antes de ejecutar docker-compose up -d, cree la red externa con docker network create web.
Genere un hash htpasswd para dashboard-auth usando echo $(htpasswd -nb user password).
Traefik con Kubernetes
Traefik se integra con Kubernetes a través de su API, utilizando recursos Ingress estándar y sus propias Definiciones de Recursos Personalizados (CRD) para configuraciones avanzadas. El método de instalación recomendado es a través de Helm.
Instalación con Helm
helm repo add traefik https://traefik.github.io/charts
helm repo update
helm install traefik traefik/traefik \
--namespace traefik \
--create-namespace \
-f values.yaml
El archivo values.yaml típicamente configura los EntryPoints, Proveedores y resolvedores ACME de Traefik (por ejemplo, myresolver para Let's Encrypt).
Configuración a través de Definiciones de Recursos Personalizados (CRD)
Traefik extiende las capacidades de Kubernetes con sus propias CRD, ofreciendo más control que el Ingress estándar:
* IngressRoute: Define reglas de enrutamiento, puntos de entrada y servicios asociados, incluyendo configuración TLS y middlewares. Esta es una alternativa más potente al Ingress estándar de Kubernetes.
* Middleware: Define modificadores de solicitud/respuesta reutilizables que se pueden aplicar a IngressRoutes.
* TraefikService: Permite definir servicios de backend con más detalle, incluyendo estrategias de balanceo de carga y servicios externos.
Ejemplo de Configuración de Kubernetes
Este ejemplo muestra un Deployment, Service e IngressRoute de Kubernetes para una aplicación whoami.
# whoami-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami
labels:
app: whoami
spec:
replicas: 2
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: traefik/whoami
ports:
- containerPort: 80
---
# whoami-service.yaml
apiVersion: v1
kind: Service
metadata:
name: whoami
spec:
selector:
app: whoami
ports:
- protocol: TCP
port: 80
targetPort: 80
---
# whoami-ingressroute.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: whoami-ingressroute
spec:
entryPoints:
- websecure # Asume que el punto de entrada 'websecure' está configurado en los valores de Helm de Traefik
routes:
- match: Host(`whoami.yourdomain.com`)
kind: Rule
services:
- name: whoami # Se refiere al Servicio de Kubernetes 'whoami'
port: 80
tls:
certResolver: myresolver # Asume que 'myresolver' para Let's Encrypt está configurado en los valores de Helm de Traefik
Comparación: Traefik vs. Proxies Tradicionales (Nginx/HAProxy)
| Característica | Traefik | Nginx/HAProxy (Tradicional) |
|---|---|---|
| Modelo de Configuración | Dinámico, impulsado por API, descubrimiento automático | Archivos estáticos, actualizaciones manuales, requiere recarga/reinicio |
| Descubrimiento de Servicios | Integrado para Docker, K8s, Consul, etc. | Requiere herramientas externas (ej., consul-template) o configuración manual |
| Gestión SSL/TLS | Integración automática con Let's Encrypt | Configuración manual, herramientas o scripts externos para automatización |
| Complejidad para Entornos Dinámicos | Baja, se integra nativamente, etiquetas/CRD simples | Alta, se necesita scripting o orquestación compleja para la automatización |
| Dashboard | UI web integrada | Típicamente no integrado, herramientas de monitoreo de terceros |
| Caso de Uso Principal | Microservicios, contenedores efímeros, entornos nativos de la nube | Servicios estables y de larga duración, proxy de borde de alto rendimiento |
Monitoreo y Dashboard
El dashboard de Traefik proporciona una interfaz gráfica para visualizar la configuración de enrutamiento actual y monitorear el estado de Traefik. Se puede acceder a él a través de un navegador web, típicamente en el puerto 8080 (como se configuró en el ejemplo de Docker). Por seguridad, es una práctica estándar proteger el dashboard con un middleware como la autenticación básica.
Mejores Prácticas
- Aislar Traefik: Ejecute Traefik en una red o namespace de Kubernetes dedicado para mejorar la seguridad y simplificar la gestión.
- Asegurar el Dashboard: Proteja siempre el dashboard de Traefik con autenticación (por ejemplo, middleware
BasicAuth) y asegúrese de que esté expuesto solo a personal autorizado. - Almacenamiento Persistente para ACME: Para los certificados de Let's Encrypt, asegúrese de que la ruta de almacenamiento ACME (por ejemplo,
/letsencrypt/acme.json) esté mapeada a un almacenamiento persistente. Esto evita la pérdida de certificados al reiniciar o redesplegar el contenedor. - Menor Privilegio: Al montar el socket de Docker (
/var/run/docker.sock), asegúrese de que Traefik se ejecute con los privilegios mínimos necesarios. Considere usar un montaje de solo lectura (:ro) si no se requiere acceso de escritura. exposedbydefault=false: Para los proveedores de Docker, establecer--providers.docker.exposedbydefault=falsees una buena práctica de seguridad y gestión. Esto requiere etiquetas explícitastraefik.enable=trueen los contenedores que deben ser expuestos.