Traefik; Containous (sonradan Traefik Labs) tarafından geliştirilen, konteyner çağı için tasarlanmış L7 reverse proxy ve yük dengeleyicidir. Geleneksel reverse proxy’lerin aksine konfigürasyon dosyasıyla statik tanım yerine, çalışma ortamından (Docker, Kubernetes, Consul, ECS) dinamik servis keşfi yapar.
Bir servisin yeni bir replica’sı çalıştığında Traefik bunu konfigürasyon değişikliği veya reload olmadan otomatik tanır ve yük dağıtmaya başlar. Bu özellik özellikle blue-green / canary deploy’lerde, yatay ölçeklendirmede ve mikroservis ortamlarında geliştirici deneyimini ciddi iyileştirir.
Mono’nun yaklaşımı
Mono ekibi Traefik’i hem K8s ingress controller olarak hem de VM/Docker host ortamlarında reverse proxy olarak kullanır. Standart kurulum kararları:
- TLS: Let’s Encrypt + DNS-01 challenge (Cloudflare); wildcard sertifika *.example.com.
- Provider önceliği: K8s’te
kubernetescrd(IngressRoute), VM’defileprovider; ikisinin paralel çalıştığı hibrit kurulumlar mümkün. - Middleware kütüphanesi: Standart Mono middleware paketi — auth (forward-auth → Keycloak), rate-limit, security headers, gzip/brotli sıkıştırma, retry.
- Observability: Prometheus metrikleri açık, access log JSON formatta Loki’ye, Tempo ile request tracing.
- Sticky session: Stateful uygulamalar için cookie-based; stateless’ler için least-conn veya weighted round-robin.
Tipik kurulum
K8s’te IngressRoute CRD ile route tanımlanır. Bir uygulama deployment’ı oluşturulduğunda IngressRoute manifest’i de aynı paket içinde geldiği için dağıtım = route güncellemesi atomik şekilde olur.
Docker host’ta servis label’ları (traefik.http.routers.web.rule) kullanılır; docker compose dosyası tek başına route + TLS yönetimini içerir.
Yaygın sorunlar ve çözümler
- 404 sorunu route doğru görünüyor: TLS ile HTTP arasındaki entrypoint farkı. Her iki entrypoint için ayrı router (HTTP redirect dahil).
- ACME rate-limit: Test ortamında staging endpoint kullanın (
caServer: https://acme-staging-v02.api.letsencrypt.org/directory); CI’da sertifika cache’i. - Yavaş ilk istek: Connection pooling ve keep-alive ayarları (
forwardingTimeouts); upstreamresponseHeaderTimeoutartırılır. - Memory artışı: Erken sürümlerde access log buffer’ı problem olabiliyordu; v3+ ile çözüldü, eski sürümleri yükseltin.
- WebSocket kopması:
read/write timeout‘ları yeterli değil. Idle WebSocket’ler içinforwardingTimeouts.idleConnTimeout: 1h.