Comment acheminer le trafic vers des conteneurs Docker avec le proxy inverse Traefik

0
235

Traefik est un proxy inverse et un équilibreur de charge de premier plan pour les opérations cloud natives et les charges de travail conteneurisées. Il fonctionne comme un routeur périphérique qui publie vos services sur Internet.

Traefik achemine les demandes vers vos conteneurs en faisant correspondre les attributs de la 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, tels qu'une application Web, une API et un panneau d'administration.

Mise en route

Il est plus facile 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 fichier traefik.toml – nous allons vous expliquer ce qu'il fait ci-dessous :

[entryPoints] [entryPoints.http] adresse = ":80" [entryPoints.http.http.redirections.entryPoint] à = "https" schéma = "https" [entryPoints.https] adresse = ":443"   [fournisseurs] [fournisseurs.docker] réseau = "traefik" Publicité

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 point d'entrée https à la place. Supprimez la section de redirection si vous souhaitez pouvoir diffuser du contenu via HTTP simple.

Les “fournisseurs” configure les sources qui définissent vos itinéraires 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 fournisseur Docker. 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 réseau traefik 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émarrage de 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 requêtes entrantes. Vous devez également joindre le conteneur au réseau traefik créé précédemment.

 

Montez le socket Docker de votre hôte dans le conteneur Traefik avec l'indicateur -v. 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 fournisseur de docker 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 que Traefik fonctionne :

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:dernière publicité

Assurez-vous d'avoir ajouté des enregistrements DNS pour apache.example.com et nginx.example.com qui correspondent à 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 ; leurs étiquettes traefik.http.routers configurent des routes de base qui correspondent aux requêtes entrantes par la valeur de leur en-tête Host.

Routing Traffic

Traefik prend en charge plusieurs “matchers” pour acheminer votre trafic. Nous avons utilisé le comparateur d'hôte 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 du middleware Headers pour ajouter un en-tête de requête X-Proxied-By supplémentaire :

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 libellé traefik.http.services.<demo-service>.loadbalancer.server.port=8080.

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 fichier traefik.toml :

[certificatesResolvers.lets-encrypt.acme] email = "you@example.com" stockage = "/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 tous les rappels d'expiration de certificat envoyés par Let's Encrypt. La section tlsChallenge définit comment se produit la vérification de la certification ; le laisser vide utilisera le flux par défaut de servir un fichier unique que Let’s Encrypt demandera et validera lors de l'émission du certificat.

Publicité

Redémarrez ou remplacez votre conteneur Traefik pour appliquer la nouvelle configuration . Vous devez également monter un nouveau fichier sur /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.

Premièrement modifiez votre traefik.toml existant avec la section suivante :

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

Créez ensuite traefik_dashboard.toml avec le contenu suivant :

[http.middleware.dashboard_auth.basicAuth] users = [ "admin:$123…" ]  Règle [http.routers.api] = "Hôte(`traefik.example.com`)" points d'entrée = ["https"] middlewares = ["dashboard_auth"] service = "api@internal" [http.routers.api.tls] certResolver = "lets-encrypt"

Le nouveau fichier est nécessaire en tant que Traefik car ne prend pas en charge “dynamic” configuration (services et routeurs) aux côtés de la “statique” valeurs dans votre traefik.toml principal. Le fichier de configuration du tableau de bord définit manuellement une route qui mappe traefik.example.com au service d'interface utilisateur Web interne. La ligne providers.file ajoutée à traefik.toml enregistre la nouvelle définition de route auprès du fournisseur de fichiers.

Utilisez htpasswd pour générer un ensemble d'informations d'identification HTTP Basic Auth. Ajoutez la chaîne générée au tableau users dans le middleware dashboard_auth. 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…

Maintenant, redémarrez Traefik avec votre configuration mise à jour , sans oublier de monter également le nouveau fichier traefik_dashboard.toml :

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édez 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 machine locale, vous pouvez publier le port 8080 sur votre conteneur Traefik à la place. Modifiez votre fichier traefik.toml avec la section suivante :

[api] tableau de bord = vrai non sécurisé = vrai 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 Publicité

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 polyvalente de reverse proxy 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 Statistiques 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.