Przejdź do głównej zawartości

Traefik jako edge router: auto-discovery, ACME i migracja na v3

· 7 min aby przeczytać
Przemysław Majdak
Full-Stack Developer, Automation Engineer & Web Security Specialist

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, natywny Ingress oraz 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ń:

  1. HTTP-01 — najprostsze, wymaga portu 80 osiągalnego z internetu. Traefik sam odpowiada tokenem generowanym w locie.
  2. 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ą.
  3. 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:

AlertWarunekOkno
TraefikHighErrorRateudział odpowiedzi 5xx > 5%5 min
TraefikHighLatencyp99 entrypointu > 1 s5 min
TraefikServiceDowntraefik_service_server_up == 0natychmiast

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):

  1. Włącz kompatybilność. W konfiguracji statycznej ustaw core.defaultRuleSyntax: v2. Binarka v3 startuje na dotychczasowych regułach v2 bez błędów parsowania.
  2. 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.
  3. Przepisuj reguły partiami. Aplikacja po aplikacji. Gdy wszystkie reguły są już w składni v3, usuń defaultRuleSyntax z 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:

KryteriumTraefikNginx
LicencjaMITBSD-2-Clause
Gwiazdki GitHub~64 700 (traefik/traefik)~31 600 (nginx/nginx, mirror)
Rolareverse proxy / load balancerserwer WWW + reverse proxy
Konfiguracjaetykiety Docker / CRD Kubernetesstatyczne pliki (nginx.conf)
TLSwbudowany klient ACMEzewnętrzny (Certbot + cron)
Wykrywanie usługautomatyczne (API Docker/K8s)ręczne + nginx -s reload
Pliki statycznebrak wsparcianatywne, wysoka wydajność
Panel graficznywbudowany dashboardbrak

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 albo cert-manager).
  • Wysoka dostępność brzegu + wiele replik → Traefik do routingu, cert-manager do certyfikatów. Nie próbuj skalować wbudowanego ACME.
  • Mieszanka API i statyków → Traefik na brzegu, Nginx jako backend statyczny.