Saltar a contenido

Traefik

Ingress / API Gateway del cluster (Gateway API).

Resumen

Traefik v3 hace de ingress de todo el tráfico HTTP/HTTPS interno, sustituyendo a Nginx Proxy Manager (legacy). Usa el provider kubernetesGateway (Gateway API, estándar), no el Ingress clásico.

Estado

Campo Valor
Estado Operativo
Argo CD Application — (bootstrap Ansible)
Namespace traefik

Despliegue

Campo Valor
Método Helm traefik/traefik
Versión (chart) 41.4.0 (Traefik v3)
Rol k3s/ansible/roles/traefik (+ files/values.yaml)
Gateway API v1.6.1 (canal standard)

Red

Campo Valor
Service traefik (LoadBalancer)
IP 192.168.20.60
Puertos 80/443 (→ entrypoints web 8000 / websecure 8443)
Gateway traefik-gateway (ns traefik)
Listeners web (HTTP 8000), websecure (HTTPS 8443, TLS cert-manager)
URLs https://<svc>.local.gorkarevilla.com

Dashboard

Traefik v3 trae dashboard integrado (--api.dashboard=true, entrada interna traefik en el puerto 8080, path /dashboard/). Está expuesto solo en LAN por HTTPS vía un IngressRoute dedicado (backend api@internal), sin exponer el puerto 8080 en el LoadBalancer:

Campo Valor
URL https://traefik.local.gorkarevilla.com/dashboard/ (la / final es obligatoria)
EntryPoint websecure (TLS wildcard *.local.gorkarevilla.com)
Backend api@internal (TraefikService)
Autenticación basic auth (Middleware traefik-dashboard-auth)

El dashboard expone configuración del cluster; por eso va protegido con basic auth. El Secret traefik-dashboard-auth (tipo kubernetes.io/basic-auth, claves username/password) lo gestiona Vaultwarden → VKS (ítem en la colección Homelab).

Acceso y usuarios

  • Dashboard: basic auth (credenciales en el Secret gestionado por VKS).
  • Resto: no aplica (proxy; el acceso lo controla cada servicio).

Configuración

  • provider kubernetesGateway habilitado.
  • Listener websecure con certificateRefs → secret traefik-local-tls (wildcard *.local.gorkarevilla.com emitido por cert-manager).
  • El Traefik v2 empaquetado de k3s se deshabilita en la instalación.
  • ingressRoute.dashboard habilitado en k3s/ansible/roles/traefik/files/values.yaml (match por host traefik.local.gorkarevilla.com, entryPoints: [websecure], tls.secretName: traefik-local-tls, middleware traefik-dashboard-auth).
  • Middleware traefik-dashboard-auth (basicAuth) creado vía extraObjects en el mismo values.yaml.

Almacenamiento

  • No aplica.

Dependencias

  • Depende de: k3s, MetalLB (IP), cert-manager (cert TLS).
  • Usado por: todos los servicios HTTP internos.

Backup y recuperación

  • No aplica (config en GitOps/Ansible).

Monitorización

  • Expone métricas Prometheus en :9100 (--metrics.prometheus=true).
  • Scrapeado vía PodMonitor traefik (clusters/luka/config/servicemonitors/traefik.yaml).

Referencias

  • Chart: https://github.com/traefik/traefik-helm-chart
  • Docs: https://doc.traefik.io/traefik/

Notas / TODO

  • Migrar la gestión de Traefik de Ansible a Argo CD.
  • Crear las HTTPRoutes del resto de servicios (hoy aún en NPM).
  • SafeNaming (warning de arranque): arreglado con providers.kubernetesCRD.safeNaming: true en values.yaml (el provider CRD está activo por el dashboard IngressRoute).
  • Hardening de entrypoints (v3.7.12) — aplicado en values.yaml (ports.*.http):
  • aliasHeadersStrategy: delete en web, websecure, traefik y metrics (evita spoofing de headers aliased como X_Auth_User vs X-Auth-User).
  • encodedCharacters.*: false en web y websecure (rechaza caracteres codificados en el path: anti path-traversal / split-view).
  • Nota: Traefik v3.7.12 sigue emitiendo el warning Encoded characters in the request path en cada arranque de forma incondicional (bug/aviso fijo en cmd/traefik/traefik.go); no se puede silenciar por config, pero el hardening ya está aplicado.