Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

technique:migration-traefik-v2 [2019/08/23 14:24] (Version actuelle)
qduchemi créée
Ligne 1: Ligne 1:
 +# Migration vers Traefik v2.0
  
 +**WIP : n'​utilisez pas cette page pour le moment !**
 +## Contexte ​
 +
 +La version 2.0 de Traefik est récemment passée en version beta et introduit un certain nombre de changements intéressants pour Picasoft.
 +
 +En particulier,​ Traefik était jusqu'​alors un reverse-proxy HTTP/HTTPS uniquement. Cette nouvelle version introduit la possibilité de placer Traefik comme reverse-proxy pour n'​importe quelle connexion TCP. Cette fonctionnalité est très intéressante pour deux raisons :
 +
 +* Le même outil pour tous les services, pas seulement les services web,
 +* La gestion automatique des certificats.
 +
 +En effet, Traefik génère et renouvelle automatiquement les certificats pour les services qu'il gère. Lorsque nous devions exposer un service non-HTTP (e.g. LDAP, serveur mail...) à l'​extérieur,​ il fallait soit gérer les certificats nous-même, soit faire "​croire"​ à Traefik qu'il s'​agissait d'un service web, le faire générer le certificat dans sa banque `acme.json`,​ puis l'​extraire à l'aide de scripts *ad-hoc* et le mettre à disposition de notre service. Cette solution nécessitait malgré tout une attention particulière portée au renouvellement.
 +
 +Grâce à cette nouvelle version, tout devient automatique. ​
 +
 +En revanche, cette version change énormément de choses, aussi bien au niveau des concepts que de la configuration. Cette page vise à regrouper les actions faites pour mettre à jour la configuration sur `pica01-test` et n'est pas du tout exhaustive : elle concerne uniquement l'​usage que nous faisons de Traefik avec Docker.
 +
 +Cette page sert également d'​exemple pour la mise en place d'un service TCP avec génération automatique du certificat.
 +
 +## Configuration TOML
 +
 +### Paramètres globaux
 +
 +Tous les paramètres au niveau root doivent maintenant être dans la section `global` :
 +
 +```
 +[global]
 +checkNewVersion = true
 +```
 +
 +`logLevel` n'est plus un paramètre de niveau root, mais appartient à la section `log` :
 +
 +```
 +[log]
 + level = "​INFO"​
 +```
 +
 +### Providers
 +
 +Les sections de type `providers` doivent être préfixées. Ainsi, la section `docker` devient :
 +
 +```
 +[providers]
 + ​[providers.docker]
 +  watch = true
 +  endpoint = "​unix:///​var/​run/​docker.sock"​
 +  exposedByDefault = false
 +```
 +
 +La directive `defaultEntryPoints` est supprimée.
 +
 +### Entrypoints
 +
 +La directive `compress` est supprimée.
 +
 +Avec Traefik 1.7.x, il était très facile de rediriger un entrypoint vers un autre entrypoint, e.g. :
 +
 +```
 +[entryPoints.http.redirect]
 +   ​entryPoint = "​https"​
 +```
 +
 +Cette façon de faire n'est plus d'​actualité. Voir [cette issue](https://​github.com/​containous/​traefik/​issues/​4863) pour plus d'​avancée sur cette fonctionnalité manquante. ​
 +
 +Le fix actuel comporte un service `dummy` qui n'est jamais atteint grâce à la redirection mais qui est obligatoire pour la configuration. ​
 +
 +La configuration est dite **dynamique** ; elle n'est pas propre à un entrypoint, mais concerne tout ce qui passe par le protocole `HTTP`, quel que soit l'​entrypoint. On configure directement le **routeur HTTP**. On peut bien sûr ajouter une contrainte sur ce point (directive `entryPoints`).
 +
 +```
 +[http.routers]
 + ​[http.routers.https-redirect]
 + rule = "​HostRegexp(`{any:​.*}`)"​
 + ​middlewares = ["​https-redirect"​]
 + ​service = "​dummy"​
 +
 +[http.middlewares]
 + ​[http.middlewares.https-redirect.redirectscheme]
 +  scheme = "​https"​
 +
 +[http.services]
 + ​[http.services.dummy.LoadBalancer]
 +  [[http.services.dummy.LoadBalancer.servers]]
 +   url = ""​
 +```
 +
 +La section `entryPoints.<​x>​.tls` est supprimée. Il faut maintenant passer par la section `tls`. Ainsi,
 +
 +```
 +[entryPoints.https.tls]
 +   ​MinVersion = "​VersionTLS11"​
 +   ​CipherSuites = ["​TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256","​TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA","​TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA"​ ]
 +```
 +
 +devient ​
 +
 +```
 +[tls]
 + ​[tls.options]
 +  [tls.options.default]
 +   ​cipherSuites = ["​TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256","​TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA","​TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA"​ ]
 +   ​minVersion = "​VersionTLS11"​
 +
 +```
 +### ACME
 +
 +La section `acme` est remplacée par `certificatesResolvers.<​x>​.acme`. À part la nomenclature,​ rien ne change.
 +
 +```
 +[certificatesResolvers]
 + ​[certificatesResolvers.picasoft.acme]
 +  email = "​picasoft@assos.utc.fr"​
 +  storage = "/​certs/​acme.json"​
 +  [certificatesResolvers.picasoft.acme.httpChallenge]
 +   ​entryPoint = "​http"​
 +```
 +
 +## Configuration dynamique avec Docker
 +
 +Les labels changent complètement avec Traefik v2. Pour rappels, ces derniers sont utilisés pour créer dynamiquement les `routers` et `services` pour les conteneurs Docker à partir de l'​inspection de leurs labels. La liste complète des labels utilisables est [disponible ici](https://​docs.traefik.io/​v2.0/​reference/​dynamic-configuration/​docker/​).
 +
 +En ce qui nous concerne :
 +
 +* `traefik.frontend.rule=Host:​x.picasoft.net` devient ``traefik.http.routers.<​container>​.rule=Host(`x.picasoft.net`)``
 +* `traefik.port=XX` devient `traefik.http.services.<​container>​.loadbalancer.server.port=XX`.
 +
 +`traefik.enable` reste tel quel, et est nécessaire puisque nous avons mis `exposedByDefault` à `false` dans la section globale.
 +
 +L'​activation de TLS (la plupart du temps, pour HTTPS) doit maintenant se faire au niveau du **routeur**,​ qui est spécifique à chaque conteneur. Ainsi, il faudra d'​abord ajouter la directive suivante : `traefik.http.routers.<​container>​.tls=true`.
 +
 +Si l'on souhaite qu'un certificat soit généré, il faudra ajouter un autre label précisant le fournisseur de certificats que l'on veut utiliser. Il s'agit de `picasoft` (nom arbitraire donné dans la [section ACME](#​acme)) dans notre cas : `traefik.http.routers.<​container>​.tls.certResolver=picasoft`.
 +
 +## Ajout d'un service TCP avec TLS
 +
 +Traefik est maintenant capable de se comporter comme un reverse-proxy TCP. Ceci est facilité grâce à l'​extension SNI de TLS, qui donne accès au nom d'​hôte : il est donc possible de partager un port entre deux services TCP en les discriminant grâce au SNI.
 +
 +=> à suivre
  • technique/migration-traefik-v2.txt
  • Dernière modification: 2019/08/23 14:24
  • par qduchemi