Traefik jako edge router: auto-discovery, ACME i migracja na v3
Traefik nie jest „szybszym Nginx" — to inna kategoria narzędzia. Jego przewagą nie jest wydajność surowa, tylko to, że reguły routingu i certyfikaty powstają automatycznie z etykiet kontenerów i API orkiestratora, bez edycji pliku i bez przeładowania. Cena za to jest konkretna: brak serwowania plików statycznych i plikowy acme.json, który nie skaluje się poza jedną replikę. Poniżej: architektura, automatyzacja TLS, metryki, ścieżka migracji v2 → v3 i uczciwe porównanie z Nginx na zweryfikowanych liczbach.
Co konkretnie robi edge router
Traefik przechwytuje ruch na brzegu infrastruktury i rozkłada go na cztery komponenty (doc.traefik.io):
- EntryPoints — nasłuch na portach TCP/UDP.
- Routers — reguły dopasowania (host, ścieżka, nagłówki) decydujące, dokąd idzie żądanie.
- Middlewares — modyfikacja żądania po drodze (auth, rate limit, przepisanie ścieżki, nagłówki).
- Services — fizyczne backendy z konfiguracją load balancingu.
Rozdział, który odróżnia Traefik od klasycznego proxy, przebiega między konfiguracją statyczną (instalacyjną: dostawcy, entrypointy, parametry sieciowe — czytana przy starcie) a dynamiczną (reguły routingu — pobierana w locie). Dostawcy konfiguracji dynamicznej:
- pliki (TOML, YAML),
- etykiety kontenerów (Docker, AWS ECS),
- Kubernetes — własne CRD
IngressRoute, natywnyIngressoraz Gateway API, - magazyny klucz-wartość (Redis, etcd, ZooKeeper),
- Consul i Nomad przez tagi.
Praktyczna konsekwencja jest jedna: cykl życia reguły routingu = cykl życia kontenera. Kontener wstaje z etykietami, trasa istnieje. Kontener znika, trasa znika. Nie ma reload, nie ma okna serwisowego.
TLS: ACME zamiast Certbota w cronie
Integracja z Let's Encrypt obejmuje uzyskanie, przechowanie i odnowienie certyfikatu, bez zewnętrznego narzędzia i bez zadania w cronie (doc.traefik.io). Do wyboru są trzy typy wyzwań:
- HTTP-01 — najprostsze, wymaga portu 80 osiągalnego z internetu. Traefik sam odpowiada tokenem generowanym w locie.
- DNS-01 — konieczne dla certyfikatów wildcard (
*.example.com). Traefik tworzy rekord TXT przez API dostawcy DNS (wewnętrznie przez bibliotekę Lego) i czeka na propagację przed walidacją. - TLS-ALPN-01 — walidacja na porcie 443 przez dedykowany certyfikat, bez otwierania portu 80. Przydatne tam, gdzie port 80 jest zamknięty polityką sieciową.
Traefik zarządza domyślnie certyfikatami 90-dniowymi i rozpoczyna odnowienie 30 dni przed wygaśnięciem. Warto wiedzieć, że odnawia też certyfikaty, których już nikt nie używa — nie sprawdza, czy dana trasa nadal istnieje. Przy dużej rotacji domen to prosta droga do rate limitów Let's Encrypt.
Do utwardzenia warto dołożyć jawną politykę TLS przez TLSOption: minimum TLS 1.2 i zawężony zestaw szyfrów (doc.traefik.io/traefik/https/tls):
tls:
options:
default:
minVersion: VersionTLS12
cipherSuites:
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
Jedno zastrzeżenie, o które łatwo się potknąć przy audycie: cipherSuites dotyczy wyłącznie TLS 1.2 i niższych. W TLS 1.3 zestawy szyfrów nie są konfigurowalne — Go wymusza tam pełny zestaw, uznany za bezpieczny z definicji. Lista wyżej nie ma więc żadnego wpływu na połączenia 1.3 i nie ma sensu tłumaczyć jej obecności „zawężeniem szyfrów w 1.3".
Słaby punkt — i to poważny: certyfikaty i klucz konta ACME lądują w pliku acme.json. Plik musi leżeć na trwałym nośniku (w Kubernetes: PVC), a plikowy zapis nie ma sensownej spójności przy więcej niż jednej replice. Skalowanie poziome Traefika z wbudowanym ACME po prostu nie działa poprawnie — dwie repliki potrafią równolegle wystartować to samo wyzwanie. Wyjścia są trzy: jedna replika, przeniesienie certyfikatów do cert-manager, albo płatny Traefik Enterprise z rozproszonym magazynem. To jest realny próg architektoniczny, nie detal konfiguracyjny, i trzeba go rozstrzygnąć przed wdrożeniem, nie po pierwszym skalowaniu.
Dwie mniejsze uwagi operacyjne:
- W Docker Swarm hashe haseł do basic auth wpisane w etykietach usługi są widoczne dla każdego z dostępem do API Dockera przez
docker service inspect. To nie jest miejsce na poświadczenia. - Jeśli mimo wszystko zostajesz przy wolumenie plikowym w środowisku rozproszonym, upewnij się, że jest współdzielony (NFS) — i licz się z tym, że NFS nie rozwiązuje problemu współbieżnego zapisu, tylko go przesuwa.
Obserwowalność i pułapka kardynalności
Traefik eksportuje metryki do Prometheusa i ślady przez OpenTelemetry, z etykietami na trzech poziomach: entrypointów, routerów i serwisów (doc.traefik.io/traefik/observability).
Podstawowe zapytanie na p99 opóźnienia entrypointu:
histogram_quantile(0.99,
sum(rate(traefik_entrypoint_request_duration_seconds_bucket[5m])) by (le, entrypoint))
Trzy alerty, które warto mieć od pierwszego dnia produkcji:
| Alert | Warunek | Okno |
|---|---|---|
TraefikHighErrorRate | udział odpowiedzi 5xx > 5% | 5 min |
TraefikHighLatency | p99 entrypointu > 1 s | 5 min |
TraefikServiceDown | traefik_service_server_up == 0 | natychmiast |
Słaby punkt: metryki per-router i per-service to prosta droga do eksplozji kardynalności. W środowisku z tysiącami dynamicznych tras każda trasa mnoży serie czasowe i potrafi położyć Prometheusa szybciej niż sam ruch położy aplikację. Rozsądny domyślny wybór: metryki per-entrypoint włączone globalnie, per-service tylko dla krytycznych usług. Logi dostępu warto trzymać w JSON z jawnym filtrem nagłówków — Authorization i Cookie wykluczone, User-Agent zachowany.
Migracja v2 → v3 bez okna serwisowego
Podniesienie wersji reverse proxy jest ryzykowne, bo niedopasowana składnia reguł to natychmiastowy brak routingu w całym klastrze. Traefik v3 daje na to warstwę emulacji składni v2 (doc.traefik.io/traefik/migration):
- Włącz kompatybilność. W konfiguracji statycznej ustaw
core.defaultRuleSyntax: v2. Binarka v3 startuje na dotychczasowych regułach v2 bez błędów parsowania. - Podnieś instancje stopniowo. Rolling update w Kubernetes, z monitoringiem ruchu w trakcie — to jest moment, w którym metryki z poprzedniej sekcji zarabiają na siebie.
- Przepisuj reguły partiami. Aplikacja po aplikacji. Gdy wszystkie reguły są już w składni v3, usuń
defaultRuleSyntaxz konfiguracji.
Osobna sprawa: wycofanie ingress-nginx
To akurat temat, który w 2026 dotyczy znacznie większej liczby zespołów niż sama migracja v2 → v3. Projekt Kubernetes NGINX Ingress Controller ogłosił zakończenie wsparcia w marcu 2026 — nie dostaje już aktualizacji ani łatek bezpieczeństwa (doc.traefik.io). Dla każdego, kto stoi na ingress-nginx, to nie jest optymalizacja, tylko zadanie z terminem.
Traefik daje na to ścieżkę w postaci osobnego providera kubernetesIngressNGINX, który obserwuje zasoby Ingress i tłumaczy adnotacje nginx.ingress.kubernetes.io/* na własną konfigurację dynamiczną — routery, serwisy i middleware powstają automatycznie.
Dwa zastrzeżenia, żeby nie było rozczarowania:
- Dokumentacja mówi o wsparciu „wielu" adnotacji ingress-nginx, nie wszystkich. Przed migracją trzeba zestawić listę adnotacji faktycznie używanych w klastrze z listą wspieranych, a nie zakładać pełne pokrycie.
- To jest osobny provider, który trzeba włączyć i któremu trzeba dołożyć RBAC — nie zadziała samo z faktu uruchomienia Traefika.
Ciekawostka spinająca ten wpis z tekstem o X-Forwarded-For: provider ma opcję ipAllowListStrategy.depth, czyli liczbę zaufanych przeskoków pomijanych przy wyciąganiu adresu klienta z XFF na potrzeby adnotacji allowlist-source-range. Wariant „stała liczba przeskoków" — z dokładnie tymi kompromisami, które tam opisałem.
Traefik vs Nginx — liczby, nie deklaracje
Wybór między nimi to wybór między konfiguracją deklaratywną w plikach a konfiguracją wyprowadzaną z orkiestratora. Dane sprawdzone 5 września 2026:
| Kryterium | Traefik | Nginx |
|---|---|---|
| Licencja | MIT | BSD-2-Clause |
| Gwiazdki GitHub | ~64 700 (traefik/traefik) | ~31 600 (nginx/nginx, mirror) |
| Rola | reverse proxy / load balancer | serwer WWW + reverse proxy |
| Konfiguracja | etykiety Docker / CRD Kubernetes | statyczne pliki (nginx.conf) |
| TLS | wbudowany klient ACME | zewnętrzny (Certbot + cron) |
| Wykrywanie usług | automatyczne (API Docker/K8s) | ręczne + nginx -s reload |
| Pliki statyczne | brak wsparcia | natywne, wysoka wydajność |
| Panel graficzny | wbudowany dashboard | brak |
Nginx działa od 2004 roku i wg W3Techs obsługuje 31,3% wszystkich witryn, dla których znany jest serwer WWW (stan na 5 września 2026). Jego cykl dodania usługi to: nowy blok server, uruchomienie Certbota, wpis do crona na odnowienie, nginx -s reload. W Traefiku to jest zestaw etykiet przy kontenerze.
Próg opłacalności jest dość wyraźny: przy kilku statycznych usługach różnica jest kosmetyczna i Nginx wygrywa prostotą. Powyżej mniej więcej pięciu skonteneryzowanych usług, które dochodzą i znikają, ręczne utrzymanie konfiguracji i certyfikatów zaczyna kosztować realny czas i generować pomyłki — i tam automatyzacja się zwraca.
Czego Traefik nie zrobi: nie poda pliku z dysku. Jest wyłącznie proxy, więc statyki (grafiki, zbudowany frontend) potrzebują backendu — w praktyce Nginx w kontenerze za Traefikiem. Architektura hybrydowa, w której Traefik trzyma brzeg, routing i TLS, a Nginx serwuje pliki, jest tu normą, nie kompromisem.
Dla zespołów, które cenią silnik Nginx, ale chcą klikalnego zarządzania, pośrednią drogą jest Nginx Proxy Manager — GUI plus uproszczona integracja z Let's Encrypt, kosztem auto-discovery i zaawansowanych reguł routingu.
Kiedy co wybrać
- Statyczna infrastruktura, kilka usług, dużo plików statycznych → Nginx. Auto-discovery nie ma czego odkrywać.
- Docker Compose / Swarm / Kubernetes, usługi zmieniają się co deploy → Traefik, ale z rozstrzygniętą kwestią
acme.json(jedna replika albocert-manager). - Wysoka dostępność brzegu + wiele replik → Traefik do routingu,
cert-managerdo certyfikatów. Nie próbuj skalować wbudowanego ACME. - Mieszanka API i statyków → Traefik na brzegu, Nginx jako backend statyczny.