April 2023

Traefik — ein Edge-Router für eine Microservice-Architektur

Damian Keller

Geschrieben von

Damian Keller

Kategorie

Software Engineering
Blogeintrag Traefik — ein Edge-Router für eine Microservice-Architektur


Wenn verschiedene containerisierte Services auf einer VM installiert werden sollen, stellt sich rasch die Frage, wie diese Services nach aussen zur Verfügung gestellt werden. Bis anhin hat uns bei evolyze der Reverse-Proxy NGINX sehr gute Dienste erwiesen, allerdings zogen Änderungen an den Services immer auch Anpassungen an der NGINX-Konfiguration mit sich.

Um dies zu vermeiden, kann beispielsweise auch der open-source EdgeRouter Traefik (https://doc.traefik.io/traefik/) eingesetzt werden. Dieser hat sich zum Ziel gesetzt, das Deployment von Microservices zu vereinfachen.

So kann jeder neue Service über einige Labels in service-spezifischen Konfigurations-File(docker-compose) an das Routing des Traefik (inkl. automatische Erneuerung der Lets-Encrypt-HTTPS-Certificate) angeschlossen werden.

Die Dokumentation von Traefik für diesen Falll ist ausgezeichnet und hier zu finden:
https://doc.traefik.io/traefik/user-guides/docker-compose/acme-tls/

Die wichtigsten Elemente sind hier in einem docker-compose.yml-File zusammengefasst:

service
  version: '3'
    services:
      whoami:
        image: traefik/whoami
        labels:
        - "traefik.enable=true"
        - "traefik.http.routers.whoami.rule=Host(`whoami.evolyze.ch`)"
        - "traefik.http.routers.whoami.entrypoints=websecure"
        - "traefik.http.routers.whoami.tls.certresolver=evolyzeresolver"
      reverse-proxy:
        image: traefik:v2.9
        network_mode: "host"
        restart: always
        command:
        - "--api.insecure=true"
        - "--providers.docker=true"
        - "--providers.docker.exposedbydefault=false"
        - "--entrypoints.websecure.address=:443"
        - "--certificatesresolvers.evolyzeresolver.acme.tlschallenge=true"
        - "--certificatesresolvers.evolyzeresolver.acme.email=<you@example.ch>"
        - "--certificatesresolvers.evolyzeresolver.acme.storage=/letsencrypt/acme.json"
        volumes:
        - /var/run/docker.sock:/var/run/docker.sock
        - ./:/etc/traefik
        - ./letsencrypt:/letsencrypt

Dabei kann auch direkt gesteuert werden, dass alle Verbindungen über den websecure-Endpoint verarbeitet werden und somit die Kommunikation HTTPS-verschlüsselt funktioniert.

Wichtig: Die DNS-Einträge für die Zieldomains (z.B. beispiel.evolyze.ch) sollten dabei auf die öffentliche IP des VM-Servers zeigen, damit Traefik die Requests dort weiterbearbeiten kann. Aus Sicherheitsgründen können dann alle ungenutzten Ports in der Firewall geschlossen werden.

Mit diesem Setup konnten schnell verschiedene containerisierte Services an einen Proxy angeschlossen werden, der sich sowohl um das Routing also auch um alle HTTPS-Zertifikate kümmert. Und Traefik eignet sich auch sehr gut, um containerisierte Services in einem Cluster (z.B. Kubernetes) zu managen oder um die Proxy-Konfigurationen direkt automatisiert im Deployment mitzugeben.