Comment acheminer le trafic vers les conteneurs Docker avec le proxy inverse Traefik
Traefik est un proxy inverse et un équilibreur de charge de premier plan pour les opérations natives dans le cloud et les charges de travail conteneurisées. Il fonctionne comme un routeur de périphérie qui publie vos services sur Internet.
Traefik achemine les demandes vers vos conteneurs en faisant correspondre les attributs de demande tels que le domaine, l’URL et le port. Le proxy intègre la découverte automatique des services afin que vous puissiez ajouter de nouveaux conteneurs en temps réel, sans redémarrer le service Traefik.
Dans ce guide, nous allons mettre en place un déploiement Traefik v2 simple qui publiera plusieurs conteneurs Docker. Cela vous permet d’utiliser une installation Docker pour fournir plusieurs services sur le même port, comme une application Web, une API et un panneau d’administration.
Sommaire
Commencer
Il est plus simple de déployer Traefik en utilisant sa propre image Docker. Nous supposerons que vous utilisez Traefik avec Docker pour le reste de ce guide. Des fichiers binaires à fichier unique sont disponibles comme option alternative si vous préférez que Traefik reste en dehors de votre installation Docker.
Vous devez créer un fichier de configuration avant de pouvoir commencer à utiliser Traefik. Ajoutez le contenu suivant à un traefik.toml
fichier – nous expliquerons ce qu’il fait ci-dessous:
[entryPoints] [entryPoints.http] address = ":80" [entryPoints.http.http.redirections.entryPoint] to = "https" scheme = "https" [entryPoints.https] address = ":443" [providers] [providers.docker] network = "traefik"
Ce fichier de configuration configure Traefik avec deux « points d’entrée ». Les points d’entrée décrivent comment les demandes atteignent le service Traefik. Les points d’entrée HTTP et HTTPS sont créés pour écouter respectivement sur les ports 80 et 443. Dans le cas d’une requête HTTP, une règle de redirection est utilisée pour la transmettre au https
point d’entrée à la place. Supprimez la section de redirection si vous souhaitez pouvoir diffuser du contenu via HTTP simple.
La section « fournisseurs » configure les sources qui définissent vos routes réseau. Les fournisseurs sont simplement des composants d’infrastructure qui peuvent émettre Traefik avec des instructions de routage. Si vous le souhaitez, vous pouvez écrire un point de terminaison d’API HTTP personnalisé pour définir vos itinéraires.
Dans cet exemple, nous gardons les choses simples et utilisons le docker
fournisseur. Cela surveille les conteneurs Docker exécutés sur votre hôte. Lorsqu’un nouveau conteneur apparaît avec des étiquettes spécifiques à Traefik, ces valeurs seront utilisées pour configurer un itinéraire vers le conteneur. Les conteneurs devront être attachés au traefik
Réseau Docker pour que cela fonctionne car c’est le réseau spécifié dans le fichier de configuration. Créez le réseau maintenant :
docker network create traefik
Démarrer Traefik
Vous êtes maintenant prêt à démarrer Traefik ! Déployez un nouveau conteneur avec l’image Traefik. Liez les ports 80 et 443 à votre hôte, permettant à Traefik d’écouter les demandes entrantes. Vous devez également joindre le conteneur au traefik
réseau créé précédemment.
Montez le socket Docker de votre hôte dans le conteneur Traefik avec le -v
drapeau. Cela donne à Traefik la possibilité d’accéder à d’autres conteneurs exécutés sur votre hôte, permettant la détection automatique des itinéraires via le docker
fournisseur configuré dans votre fichier de configuration. Le fichier de configuration lui-même est monté sur /traefik.toml
à l’intérieur du conteneur Traefik.
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
Démarrez ensuite quelques conteneurs pour tester le fonctionnement de Traefik :
docker run -d --label traefik.http.routers.apache.rule=Host(`apache.example.com`) --name apache --network traefik httpd:latest docker run -d --label traefik.http.routers.nginx.rule=Host(`nginx.example.com`) --name nginx --network traefik nginx:latest
Assurez-vous d’avoir ajouté des enregistrements DNS pour apache.example.com
et nginx.example.com
cette carte à votre hôte Traefik. Vous devriez pouvoir visiter ces domaines dans votre navigateur pour voir respectivement les pages de destination Apache et NGINX par défaut. Les deux conteneurs sont rattachés au réseau Traefik ; leur traefik.http.routers
les étiquettes configurent des routes de base qui correspondent aux demandes entrantes par la valeur de leur Host
entête.
Routage du trafic
Traefik prend en charge plusieurs « matchers » différents pour acheminer votre trafic. Nous avons utilisé le Host matcher ci-dessus, mais vous pouvez également router par méthode HTTP, en-têtes, URI, adresse IP et paramètres de chaîne de requête. Ajoutez plusieurs matchers à vos conteneurs pour créer des règles de routage plus complexes.
Traefik prend également en charge les middlewares qui vous permettent de modifier la demande avant qu’elle n’atteigne vos services. Vous pouvez ajouter un préfixe, ajuster les en-têtes ou appliquer l’authentification de base au niveau du proxy. Voici un exemple d’utilisation de Headers
middleware pour ajouter un extra X-Proxied-By
en-tête de requête :
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 achemine le trafic vers les ports exposés de vos conteneurs. Vous pouvez spécifier un port différent en définissant le traefik.http.services.<demo-service>.loadbalancer.server.port=8080
étiqueter.
Ajout de SSL
Ensuite, vous devez ajouter SSL pour vous assurer que votre trafic est entièrement protégé. Traefik inclut l’intégration Let’s Encrypt, nous allons donc l’utiliser maintenant pour automatiser la génération de certificats.
Ajoutez la section suivante à votre traefik.toml
déposer:
[certificatesResolvers.lets-encrypt.acme] email = "you@example.com" storage = "/acme.json" [certificatesResolvers.lets-encrypt.acme.tlsChallenge]
Cela configure Traefik pour utiliser le fournisseur Let’s Encrypt ACME lors de la résolution des demandes de certificat. Assurez-vous de remplacer l’adresse e-mail par la vôtre afin de recevoir les rappels d’expiration de certificat envoyés par Let’s Encrypt. le tlsChallenge
section définit comment la vérification de la certification se produit ; le laisser vide utilisera le flux par défaut consistant à servir un fichier unique que Let’s Encrypt demandera et validera lors de l’émission du certificat.
Redémarrez ou remplacez votre conteneur Traefik pour appliquer la nouvelle configuration. Vous devez également monter un nouveau fichier pour /acme.json
à l’intérieur du conteneur – Traefik l’utilisera pour stocker les certificats.
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
Utilisation du tableau de bord
Traefik inclut une interface utilisateur Web qui offre une vue graphique des points de terminaison, des fournisseurs et des services (conteneurs) actifs dans votre déploiement. Vous pouvez exposer l’interface utilisateur en configurant une route pour celle-ci dans votre fichier de configuration.
Modifiez d’abord votre existant traefik.toml
avec la rubrique suivante :
[api] dashboard = true [providers.file] filename = "/traefik_dashboard.toml"
Créer ensuite traefik_dashboard.toml
avec le contenu suivant :
[http.middleware.dashboard_auth.basicAuth] users = [ "admin:$123..." ] [http.routers.api] rule = "Host(`traefik.example.com`)" entrypoints = ["https"] middlewares = ["dashboard_auth"] service = "api@internal" [http.routers.api.tls] certResolver = "lets-encrypt"
Le nouveau fichier est nécessaire car Traefik ne prend pas en charge la configuration « dynamique » (services et routeurs) aux côtés des valeurs « statiques » dans votre main traefik.toml
. Le fichier de configuration du tableau de bord définit manuellement un itinéraire qui mappe traefik.example.com
au service d’interface utilisateur Web interne. le providers.file
ligne ajoutée à traefik.toml
enregistre la nouvelle définition d’itinéraire avec le file
fournisseur.
Utiliser htpasswd
pour générer un ensemble d’informations d’identification HTTP Basic Auth. Ajoutez la chaîne générée au users
tableau dans le dashboard_auth
middleware. Vous devrez utiliser ce nom d’utilisateur et ce mot de passe pour accéder au tableau de bord.
sudo apt install apache2-utils htpasswd -nb admin your_password # Outputs admin:$123...
Redémarrez maintenant Traefik avec votre configuration mise à jour, en vous rappelant de monter le nouveau traefik_dashboard.toml
fichier aussi :
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
Vous devriez pouvoir accéder au tableau de bord en vous rendant sur traefik.example.com
dans votre navigateur. Si vous ne souhaitez pas exposer l’interface utilisateur Web en tant que route et que vous y accéderez toujours à partir de votre ordinateur local, vous pouvez publier le port 8080
sur votre conteneur Traefik à la place. Modifiez votre traefik.toml
fichier avec la section suivante :
[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
Cela vous permettra d’accéder au tableau de bord via http://localhost:8080
. Cette approche ne doit pas être utilisée dans des environnements de production sécurisés, mais permet une configuration plus rapide des expériences locales.
Conclusion
Traefik est une solution de proxy inverse polyvalente pour vos conteneurs. Dans cet article, nous n’avons couvert que les fonctionnalités les plus fondamentales. Au-delà de l’utilisation de base avec Docker, Traefik fonctionne également avec les principales solutions d’orchestration de conteneurs, notamment Kubernetes, Docker Swarm et Mesos.
Traefik fournit une API REST ainsi que des métriques dans des formats compris par Prometheus, InfluxDB, Datadog et Statsd. Ces fonctionnalités vous permettent d’automatiser et d’instrumenter les déploiements Traefik aux côtés des autres composants d’infrastructure de votre pile. C’est un moyen idéal de publier des charges de travail conteneurisées dans le monde entier sans utiliser une solution d’orchestration complète.