Verkeer naar Docker-containers leiden met Traefik Reverse Proxy

0
205

Traefik is een toonaangevende reverse proxy en load balancer voor cloud-native operaties en gecontaineriseerde werklasten. Het functioneert als een edge-router die uw services op internet publiceert.

Traefik routeert verzoeken naar uw containers door aanvraagkenmerken zoals het domein, de URL en de poort te matchen. De proxy bevat automatische servicedetectie, zodat u in realtime nieuwe containers kunt toevoegen zonder de Traefik-service opnieuw te hoeven starten.

In deze handleiding zullen we een eenvoudige Traefik v2-implementatie samenstellen die meerdere zal publiceren Docker-containers. Hierdoor kunt u één Docker-installatie gebruiken om meerdere services via dezelfde poort te leveren, zoals een webtoepassing, API en administratiepaneel.

Aan de slag

Het is het gemakkelijkst om Traefik te implementeren met zijn eigen Docker-image. We gaan ervan uit dat je Traefik met Docker gebruikt voor de rest van deze handleiding. Binaire bestanden met één bestand zijn beschikbaar als een alternatieve optie als u liever wilt dat Traefik buiten uw Docker-installatie zit.

U moet een configuratiebestand maken voordat u Traefik kunt gaan gebruiken. Voeg de volgende inhoud toe aan een traefik.toml-bestand – we zullen hieronder uitleggen wat het doet:

[entryPoints] [entryPoints.http] adres = ":80" [entryPoints.http.http.redirections.entryPoint] naar = "https" schema = "https" [entryPoints.https] adres = ":443"   [providers] [providers.docker] netwerk = "traefik" Advertentie

Dit configuratiebestand configureert Traefik met twee “entrypoints.” Entrypoints beschrijven hoe aanvragen de Traefik-service bereiken. HTTP- en HTTPS-toegangspunten worden gemaakt om te luisteren op respectievelijk poort 80 en 443. In het geval van een HTTP-verzoek wordt in plaats daarvan een omleidingsregel gebruikt om het door te sturen naar het https-ingangspunt. Verwijder de omleidingssectie als u inhoud via gewone HTTP wilt kunnen aanbieden.

De “providers” sectie configureert de bronnen die uw netwerkroutes definiëren. Providers zijn simpelweg infrastructuurcomponenten die Traefik routeringsinstructies kunnen geven. Als je wilt, kun je een aangepast HTTP API-eindpunt schrijven om je routes te definiëren.

In dit voorbeeld houden we het simpel en gebruiken we de docker-provider. Dit bewaakt de Docker-containers die op uw host worden uitgevoerd. Wanneer er een nieuwe container verschijnt met Traefik-specifieke labels, worden die waarden gebruikt om een ​​route naar de container op te zetten. De containers moeten worden gekoppeld aan het traefik Docker-netwerk om dit te laten werken, aangezien dat het netwerk is dat is gespecificeerd in het configuratiebestand. Maak nu het netwerk aan:

docker-netwerk create traefik

Traefik starten

Nu ben je klaar om Traefik te starten! Implementeer een nieuwe container met de Traefik-image. Bind poorten 80 en 443 aan uw host, zodat Traefik kan luisteren naar inkomende verzoeken. U moet de container ook toevoegen aan het eerder gemaakte traefik-netwerk.

 

Monteer de Docker-socket van uw host in de Traefik-container met de vlag -v. Dit geeft Traefik de mogelijkheid om toegang te krijgen tot andere containers die op uw host draaien, waardoor routes automatisch kunnen worden gedetecteerd via de docker-provider die is ingesteld in uw configuratiebestand. Het configuratiebestand zelf is gekoppeld aan /traefik.toml in de Traefik-container.

docker run -d -p 80:80 -p 443:443 -v $PWD/traefik.toml:/traefik.toml -v /var/run/docker.sock:/var/run/docker .sock –name traefik –network traefik traefik:2.6

Start vervolgens een aantal containers om te testen of Traefik werkt:

docker run -d –label traefik.http.routers.apache.rule=Host(`apache.example.com`) –name apache –network traefik httpd:laatste docker run -d –label traefik.http.routers.nginx.rule=Host(`nginx.example.com`) –name nginx –network traefik nginx:latest Advertisement

Zorg ervoor dat je DNS-records hebt toegevoegd voor apache.example.com en nginx.example.com die zijn toegewezen aan je Traefik-host. U zou die domeinen in uw browser moeten kunnen bezoeken om respectievelijk de standaard Apache- en NGINX-bestemmingspagina's te zien. De twee containers zijn aangesloten op het Traefik-netwerk; hun labels traefik.http.routers stellen basisroutes in die overeenkomen met inkomende verzoeken op basis van de waarde van hun Host-header.

Routing van verkeer

Traefik ondersteunt verschillende “matchers” voor het routeren van uw verkeer. We hebben de bovenstaande Host-matcher gebruikt, maar u kunt ook routeren via de HTTP-methode, headers, URI, IP-adres en queryreeksparameters. Voeg meerdere matchers toe aan uw containers om complexere routeringsregels op te bouwen.

Traefik ondersteunt ook middlewares waarmee u het verzoek kunt wijzigen voordat het uw services bereikt. Misschien wilt u een voorvoegsel toevoegen, kopteksten aanpassen of basisverificatie toepassen op proxyniveau. Hier is een voorbeeld van het gebruik van de Headers-middleware om een ​​extra X-Proxied-By-verzoekheader toe te voegen:

docker run -d –label traefik.http.routers.nginx.rule=Host( `nginx.example.com`) –label traefik.http.middlewares.demo.headers.customrequestheaders.X-Proxied-By=traefik –name nginx –network traefik nginx:latest

Traefik leidt het verkeer naar de blootgestelde poorten van uw containers. U kunt een andere poort specificeren door het label traefik.http.services.<demo-service>.loadbalancer.server.port=8080 in te stellen.

SSL toevoegen

Vervolgens moet u SSL toevoegen om ervoor te zorgen dat uw verkeer volledig wordt beschermd. Traefik bevat Let’s Encrypt-integratie, dus die gaan we nu gebruiken om het genereren van certificaten te automatiseren.

Voeg de volgende sectie toe aan je traefik.toml-bestand:

[certificatesResolvers.lets-encrypt.acme] email = "you@example.com" opslag = "/acme.json" [certificatesResolvers.lets-encrypt.acme.tlsChallenge]

Dit configureert Traefik om de Let's Encrypt ACME-provider te gebruiken bij het oplossen van certificaataanvragen. Zorg ervoor dat u het e-mailadres door uw eigen e-mailadres vervangt, zodat u herinneringen voor het verlopen van certificaten ontvangt die door Let's Encrypt zijn verzonden. De sectie tlsChallenge definieert hoe certificeringsverificatie plaatsvindt; als u dit leeg laat, wordt de standaardstroom gebruikt voor het serveren van een uniek bestand dat door Let's Encrypt wordt aangevraagd en gevalideerd tijdens de certificaatuitgifte.

Advertentie

Herstart of vervang uw Traefik-container om de nieuwe configuratie toe te passen . U moet ook een nieuw bestand koppelen aan /acme.json in de container – Traefik zal dit gebruiken om certificaten op te slaan.

docker run -d -p 80:80 -p 443:443 -v $PWD/acme.json:/acme.json -v $PWD/traefik.toml:/traefik.toml -v /var/run/docker.sock:/var/run/docker.sock –name traefik –network traefik traefik:2.6

Het dashboard gebruiken

Traefik bevat een web-UI die een grafische weergave biedt van de eindpunten, providers en services (containers) die actief zijn in uw implementatie. U kunt de gebruikersinterface blootleggen door er een route voor in te stellen in uw configuratiebestand.

< /p>

Wijzig eerst uw bestaande traefik.toml met de volgende sectie:

[api] dashboard = true   [providers.file] bestandsnaam = "/traefik_dashboard.toml"

Maak vervolgens traefik_dashboard.toml met de volgende inhoud:

[http.middleware.dashboard_auth.basicAuth] gebruikers = [ "admin:$123…" ]   [http.routers.api] regel = "Host(`traefik.example.com`)" entrypoints = ["https"] middlewares = ["dashboard_auth"] service = "api@internal" [http.routers.api.tls] certResolver = "lets-encrypt"

Het nieuwe bestand is nodig omdat Traefik geen ondersteuning biedt voor “dynamic” configuratie (services en routers) naast de “statische” waarden in uw hoofdtraefik.toml. Het dashboardconfiguratiebestand definieert handmatig een route die traefik.example.com koppelt aan de interne web-UI-service. De regel providers.file toegevoegd aan traefik.toml registreert de nieuwe routedefinitie bij de bestandsprovider.

Gebruik htpasswd om een ​​set HTTP Basic Auth-referenties te genereren. Voeg de gegenereerde tekenreeks toe aan de gebruikersarray in de dashboard_auth-middleware. U moet deze gebruikersnaam en dit wachtwoord gebruiken om toegang te krijgen tot het dashboard.

sudo apt install apache2-utils htpasswd -nb admin your_password # Outputs admin:$123…

Herstart Traefik nu opnieuw met uw bijgewerkte configuratie , denk eraan om ook het nieuwe traefik_dashboard.toml-bestand te mounten:

docker run -d -p 80:80 -p 443:443 -v $PWD/acme.json:/acme.json -v $PWD/traefik.toml:/traefik.toml -v $PWD/traefik_dashboard.toml:/traefik_dashboard.toml -v /var/run/docker.sock:/var/run/docker.sock –name traefik –network traefik traefik:2.6

Je zou in staat moeten zijn om toegang tot het dashboard door in uw browser naar traefik.example.com te gaan. Als u de web-UI niet als een route wilt weergeven en er altijd toegang toe hebt vanaf uw lokale computer, kunt u in plaats daarvan poort 8080 op uw Traefik-container publiceren. Wijzig uw traefik.toml-bestand met de volgende sectie:

[api] dashboard = true insecure = true docker run -d -p 8080:8080 -p 80:80 -p 443:443 -v $PWD/acme.json:/acme.json -v $PWD /traefik.toml:/traefik.toml -v /var/run/docker.sock:/var/run/docker.sock –name traefik –network traefik traefik:2.6 Advertentie

Hiermee krijgt u toegang tot het dashboard via http://localhost:8080. Deze aanpak mag niet worden gebruikt in beveiligde productieomgevingen, maar zorgt voor een snellere opzet van lokale experimenten.

Conclusie

Traefik is een veelzijdige reverse proxy-oplossing voor uw containers . In dit artikel hebben we alleen de meest fundamentele mogelijkheden besproken. Naast het basisgebruik met Docker, werkt Traefik ook met toonaangevende oplossingen voor containerorkestratie, waaronder Kubernetes, Docker Swarm en Mesos.

Traefik biedt een REST-API en statistieken in formaten die worden begrepen door Prometheus, InfluxDB, Datadog en Statistieken. Met deze mogelijkheden kunt u Traefik-implementaties automatiseren en instrumenteren naast de andere infrastructuurcomponenten in uw stack. Het is een ideale manier om gecontaineriseerde workloads naar de wereld te publiceren zonder een volledige orkestratie-oplossing te gebruiken.