Traefik 3 su Docker compose

Kas yra Traefik ir kodėl jis tapo tokiu populiariu

Traefik – tai šiuolaikinis reverse proxy ir load balancer, kuris puikiai dera su konteinerizuotomis aplikacijomis. Jei dirbate su Docker, Kubernetes ar kitomis panašiomis technologijomis, tikriausiai jau girdėjote apie šį įrankį. Trečioji Traefik versija atsirado 2023 metais ir atnešė nemažai pakeitimų, kurie verčia atnaujinti konfigūracijas, bet kartu suteikia ir naujų galimybių.

Pagrindinis Traefik privalumas – automatinis servisų aptikimas. Užuot rankiniu būdu redagavę konfigūracijos failus kiekvieną kartą, kai pridedame naują servisą, Traefik pats stebi Docker aplinką ir automatiškai konfigūruoja maršrutizavimą. Tai ypač patogu, kai valdote keliolika ar keliasdešimt skirtingų aplikacijų viename serveryje.

Dar viena svarbi detalė – integruotas Let’s Encrypt palaikymas. SSL sertifikatai generuojami ir atnaujinami automatiškai, be jokio papildomo vargo. Tiesiog nurodote savo el. paštą ir domeną, o Traefik pasirūpina visu likusiu procesu.

Traefik 3 pagrindiniai skirtumai nuo ankstesnių versijų

Jei naudojote Traefik 2.x, turėsite šiek tiek pakoreguoti savo konfigūracijas. Trečioji versija nėra tiesiog paprastas atnaujinimas – tai solidus žingsnis į priekį su keliais breaking changes.

Vienas didžiausių pokyčių – HTTP/3 palaikymas iš karto. Anksčiau tai buvo eksperimentinė funkcija, dabar ji veikia stabiliai ir gali būti naudojama produkcijoje. HTTP/3 naudoja QUIC protokolą, kuris teoriškai turėtų pagreitinti ryšį, ypač nestabiliuose tinkluose.

Kitas svarbus dalykas – Kubernetes Gateway API palaikymas. Jei planuojate migruoti į Kubernetes arba jau jį naudojate, Traefik 3 tampa dar patrauklesniu pasirinkimu.

Pasikeitė ir kai kurie konfigūracijos parametrai. Pavyzdžiui, api.insecure parametras dabar reikalauja aiškesnio saugumo nustatymų deklaravimo. Tai gali atrodyti kaip papildomas darbas, bet iš tikrųjų skatina geresnę saugumo praktiką.

Bazinė Traefik 3 konfigūracija su Docker Compose

Pradėkime nuo paprasčiausios Traefik konfigūracijos. Sukurkite docker-compose.yml failą su tokiu turiniu:

„`yaml
version: ‘3.8’

services:
traefik:
image: traefik:v3.0
container_name: traefik
restart: unless-stopped
security_opt:
– no-new-privileges:true
networks:
– proxy
ports:
– 80:80
– 443:443
volumes:
– /etc/localtime:/etc/localtime:ro
– /var/run/docker.sock:/var/run/docker.sock:ro
– ./traefik-data/traefik.yml:/traefik.yml:ro
– ./traefik-data/acme.json:/acme.json
labels:
– „traefik.enable=true”
– „traefik.http.routers.traefik.entrypoints=http”
– „traefik.http.routers.traefik.rule=Host(`traefik.jusudomenas.lt`)”
– „traefik.http.routers.traefik.service=api@internal”

networks:
proxy:
external: true
„`

Ši konfigūracija sukuria Traefik konteinerį, kuris klausosi 80 ir 443 portų. Svarbu atkreipti dėmesį į /var/run/docker.sock – tai leidžia Traefik stebėti kitus Docker konteinerius ir automatiškai juos konfigūruoti.

Dabar sukurkite traefik-data katalogą ir jame traefik.yml failą:

„`yaml
api:
dashboard: true
debug: true

entryPoints:
http:
address: „:80”
https:
address: „:443”

providers:
docker:
endpoint: „unix:///var/run/docker.sock”
exposedByDefault: false

log:
level: INFO
„`

Prieš paleidžiant, sukurkite Docker tinklą: docker network create proxy. Taip pat reikia sukurti tuščią acme.json failą su tinkamais leidimais: touch traefik-data/acme.json && chmod 600 traefik-data/acme.json.

SSL sertifikatų automatizavimas su Let’s Encrypt

Vienas iš svarbiausių Traefik privalumų – automatinis SSL sertifikatų valdymas. Papildykime traefik.yml failą:

„`yaml
certificatesResolvers:
letsencrypt:
acme:
email: [email protected]
storage: acme.json
httpChallenge:
entryPoint: http
„`

Dabar pakeiskime docker-compose.yml, kad būtų naudojamas HTTPS:

„`yaml
labels:
– „traefik.enable=true”
– „traefik.http.routers.traefik.entrypoints=https”
– „traefik.http.routers.traefik.rule=Host(`traefik.jusudomenas.lt`)”
– „traefik.http.routers.traefik.tls.certresolver=letsencrypt”
– „traefik.http.routers.traefik.service=api@internal”
„`

Svarbu suprasti, kaip veikia Let’s Encrypt challenge. Kai Traefik bando gauti sertifikatą, Let’s Encrypt serveriai bando prisijungti prie jūsų domeno per 80 portą ir patikrina, ar tikrai valdote tą domeną. Todėl įsitikinkite, kad jūsų DNS įrašai teisingai nukreipti į serverį ir 80 portas yra pasiekiamas iš interneto.

Jei naudojate wildcard sertifikatus (pvz., *.jusudomenas.lt), reikės naudoti DNS challenge vietoj HTTP. Tai šiek tiek sudėtingiau, nes reikia konfigūruoti DNS provider API prieigą.

Realus pavyzdys: kelių aplikacijų valdymas

Dabar pažiūrėkime, kaip pridėti realias aplikacijas prie Traefik. Tarkime, turime WordPress svetainę ir phpMyAdmin. Sukurkime atskirą docker-compose.yml failą šioms aplikacijoms:

„`yaml
version: ‘3.8’

services:
wordpress:
image: wordpress:latest
container_name: wordpress
restart: unless-stopped
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: slaptazodis
WORDPRESS_DB_NAME: wordpress
networks:
– proxy
– internal
labels:
– „traefik.enable=true”
– „traefik.http.routers.wordpress.entrypoints=https”
– „traefik.http.routers.wordpress.rule=Host(`www.jusudomenas.lt`)”
– „traefik.http.routers.wordpress.tls.certresolver=letsencrypt”
– „traefik.http.services.wordpress.loadbalancer.server.port=80”

db:
image: mysql:8.0
container_name: wordpress_db
restart: unless-stopped
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: slaptazodis
MYSQL_RANDOM_ROOT_PASSWORD: ‘1’
volumes:
– db_data:/var/lib/mysql
networks:
– internal

phpmyadmin:
image: phpmyadmin:latest
container_name: phpmyadmin
restart: unless-stopped
environment:
PMA_HOST: db
PMA_PORT: 3306
networks:
– proxy
– internal
labels:
– „traefik.enable=true”
– „traefik.http.routers.phpmyadmin.entrypoints=https”
– „traefik.http.routers.phpmyadmin.rule=Host(`pma.jusudomenas.lt`)”
– „traefik.http.routers.phpmyadmin.tls.certresolver=letsencrypt”

networks:
proxy:
external: true
internal:
external: false

volumes:
db_data:
„`

Atkreipkite dėmesį į keletą svarbių dalykų. Pirma, naudojame du tinklus: proxy (išorinis, kurį mato Traefik) ir internal (vidinis, tik aplikacijų komunikacijai). Duomenų bazė neprijungta prie proxy tinklo, todėl ji nepasiekiama iš interneto – tai saugumo praktika.

Antra, traefik.enable=true labai svarbus. Kadangi mūsų Traefik konfigūracijoje nustatėme exposedByDefault: false, tik konteineriai su šiuo label bus matomi Traefik.

Trečia, traefik.http.services.wordpress.loadbalancer.server.port=80 nurodo, kuriuo portu konteineris klausosi. Kartais Docker Compose automatiškai nustato teisingą portą, bet geriau būti aiškiam.

Middleware: papildomos funkcijos ir saugumas

Traefik middleware – tai tarpiniai sluoksniai, kurie apdoroja užklausas prieš jas pasiekiant galutinį servisą. Galite pridėti autentifikaciją, nukreipimus, antraštes ir daug ko kito.

Pavyzdžiui, pridėkime bazinę autentifikaciją phpMyAdmin. Pirma, sugeneruokite slaptažodį su htpasswd: echo $(htpasswd -nb admin slaptazodis) | sed -e s/\\$/\\$\\$/g

Dabar papildykite phpMyAdmin labels:

„`yaml
labels:
– „traefik.enable=true”
– „traefik.http.routers.phpmyadmin.entrypoints=https”
– „traefik.http.routers.phpmyadmin.rule=Host(`pma.jusudomenas.lt`)”
– „traefik.http.routers.phpmyadmin.tls.certresolver=letsencrypt”
– „traefik.http.routers.phpmyadmin.middlewares=pma-auth”
– „traefik.http.middlewares.pma-auth.basicauth.users=admin:$$apr1$$xxxxxxxx”
„`

Kitas naudingas middleware – HTTPS nukreipimas. Pridėkite prie traefik.yml:

„`yaml
entryPoints:
http:
address: „:80”
http:
redirections:
entryPoint:
to: https
scheme: https
https:
address: „:443”
„`

Arba galite tai daryti per labels konkrečiam servisiui:

„`yaml
– „traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https”
– „traefik.http.routers.wordpress-http.middlewares=redirect-to-https”
„`

Dar vienas populiarus middleware – saugumo antraščių pridėjimas:

„`yaml
– „traefik.http.middlewares.security-headers.headers.framedeny=true”
– „traefik.http.middlewares.security-headers.headers.sslredirect=true”
– „traefik.http.middlewares.security-headers.headers.stsSeconds=31536000”
– „traefik.http.middlewares.security-headers.headers.stsIncludeSubdomains=true”
– „traefik.http.middlewares.security-headers.headers.stsPreload=true”
– „traefik.http.routers.wordpress.middlewares=security-headers”
„`

Stebėjimas ir troubleshooting

Kai viskas sukonfigūruota, svarbu mokėti stebėti, kas vyksta. Traefik dashboard yra puikus įrankis tam. Jei dar neturite prieigos prie dashboard, įsitikinkite, kad traefik.yml yra nustatytas api.dashboard: true.

Norėdami pamatyti Traefik logus realiu laiku: docker logs -f traefik. Jei kažkas neveikia, logai paprastai parodo aiškią problemą.

Dažniausios problemos ir jų sprendimai:

Traefik nemato Docker konteinerių – patikrinkite, ar /var/run/docker.sock teisingai prijungtas ir ar konteineriai turi traefik.enable=true label.

SSL sertifikatas negeneruojamas – įsitikinkite, kad 80 portas pasiekiamas iš interneto (Let’s Encrypt turi galėti prisijungti), DNS įrašai teisingi ir el. paštas acme.json konfigūracijoje validus.

502 Bad Gateway klaida – dažniausiai reiškia, kad Traefik negali pasiekti konteinerio. Patikrinkite, ar konteineris veikia (docker ps), ar teisingas portas nurodytas labels ir ar abu konteineriai yra tame pačiame Docker tinkle.

Traefik dashboard nepasiekiamas – įsitikinkite, kad router taisyklė (Host) atitinka domeną, kurį naudojate naršyklėje, ir kad DNS įrašas nukreiptas į serverį.

Naudinga komanda problemų diagnozavimui: docker exec traefik traefik healthcheck. Ji parodo, ar Traefik veikia teisingai.

Pažangesnės konfigūracijos ir optimizavimas

Kai bazinė konfigūracija veikia, galite pradėti eksperimentuoti su pažangesnėmis funkcijomis.

Rate limiting – apsaugokite savo aplikacijas nuo per dažnų užklausų:

„`yaml
– „traefik.http.middlewares.rate-limit.ratelimit.average=100”
– „traefik.http.middlewares.rate-limit.ratelimit.burst=50”
– „traefik.http.routers.wordpress.middlewares=rate-limit”
„`

IP whitelist – leiskite prieigą tik iš konkrečių IP adresų:

„`yaml
– „traefik.http.middlewares.ip-whitelist.ipwhitelist.sourcerange=192.168.1.0/24,203.0.113.0/24”
– „traefik.http.routers.phpmyadmin.middlewares=ip-whitelist”
„`

Compression – automatiškai suspaudžia atsakymus, sumažindamas duomenų perdavimo kiekį:

„`yaml
– „traefik.http.middlewares.compression.compress=true”
– „traefik.http.routers.wordpress.middlewares=compression”
„`

Circuit breaker – apsaugo nuo perpildytų serverių:

„`yaml
– „traefik.http.middlewares.circuit-breaker.circuitbreaker.expression=ResponseCodeRatio(500, 600, 0, 600) > 0.30”
„`

Jei turite kelis serverius ir norite load balancing, galite naudoti kelias backend instancijas. Traefik automatiškai paskirstys apkrovą tarp jų.

Kai viskas veikia: kaip išlaikyti ir tobulinti

Traefik 3 su Docker Compose yra galingas derinys, kuris gali labai supaprastinti aplikacijų valdymą. Automatinis servisų aptikimas, SSL sertifikatų valdymas ir lanksti konfigūracija per labels daro jį idealiu pasirinkimu tiek mažiems projektams, tiek didesnėms infrastruktūroms.

Svarbiausias patarimas – pradėkite paprastai. Nesistenkite iš karto implementuoti visų galimų middleware ir funkcijų. Sukurkite bazinę konfigūraciją, įsitikinkite, kad ji veikia, ir tik tada pridėkite papildomų sluoksnių.

Reguliariai atnaujinkite Traefik į naujausią versiją. Kūrėjai aktyviai palaiko projektą ir dažnai išleidžia saugumo pataisymus. Kadangi naudojate Docker, atnaujinimas yra paprastas: docker-compose pull && docker-compose up -d.

Darykite konfigūracijos atsargines kopijas. Nors Docker Compose failai yra tekstiniai ir lengvai valdomi versijų kontrolės sistemose kaip Git, nepamirškite ir acme.json failo – jame saugomi jūsų SSL sertifikatai.

Ir paskutinis dalykas – eksperimentuokite. Traefik turi daug galimybių, kurias verta išbandyti. Sukurkite testavimo aplinką ir žaiskite su skirtingomis konfigūracijomis. Taip suprasite, kaip viskas veikia, ir būsite pasirengę spręsti problemas, kai jos iškils produkcijoje.

Daugiau

Selenium WebDriver: naršyklės automatizavimas

Apache Spark ar Databricks