Blog

Eine grundlegende Einführung in Traefik

Bild von Andrey Velikov
Andrej Welikow
DevOps- und Cloud-Ingenieur
14.06.2023
Lesezeit: 7 Minuten.
Zuletzt aktualisiert am: 04.03.2025

Inhaltsübersicht

Voraussetzungen: Docker-Kenntnisse

1. Was ist Traefik?

Traefik ist eine Open-Source-Lösung, die als Reverse-Proxy und Lastausgleich für Dienste dient. Was sie auszeichnet, ist die Möglichkeit des dynamischen Routings.

2. Warum Traefik verwenden?

Traefik verwendet dynamisches Routing, um Dienste ohne manuelle Eingriffe anzusteuern, was es sehr praktisch macht, wenn Sie eine einfache und schnelle Implementierung einer Lösung für Ihre Microservices benötigen. Im Vergleich zu anderen Reverse-Proxy-Lösungen, bei denen Sie die Konfiguration manuell aktualisieren müssen (was mühsam und zeitaufwendig sein kann), erkennt Traefik diese Änderungen nun automatisch und aktiviert sie.  

3. Wie funktioniert Traefik?

Da wir das Grundkonzept von Traefik erklärt haben, können wir nun damit fortfahren zu verstehen, wie es funktioniert. Zunächst müssen wir uns mit seinen Komponenten und der Konfiguration vertraut machen.

Die automatische Konfigurationserkennung erfolgt mit Hilfe von Anbietern. Die Anbieter können Cloud-Anbieter, Container-Engines und andere Infrastrukturkomponenten sein. Docker, Kubernetes, oder Amazon ECS, um nur einige zu nennen. Traefik arbeitet mit Dutzenden von ihnen zusammen. Zusätzlich zum dynamischen Routing müssen Sie keine Konfigurationsdateien mehr pflegen. Stattdessen scannt Traefik die gesamte Infrastruktur alle 2 Sekunden (standardmäßig, aber dies kann geändert werden) und liest die Informationen, die Sie den Diensten zuordnen. Die Labels im Docker-Provider enthalten solche Informationen, anhand derer Traefik die Anfragen weiterleitet.

Wie funktioniert Traefik?

Installation von Traefik und Basic-Demonstration

Lassen Sie uns demonstrieren, wie Traefik Anfragen dynamisch weiterleitet. Zu diesem Zweck werden wir den Docker-Anbieter verwenden.

Zunächst müssen wir die erforderlichen Container ziehen. (Zum Zeitpunkt des Schreibens ist die neueste Version v2.9)

docker pull traefik

Bevor wir den Container starten, müssen wir noch einige Optionen hinzufügen. Wir werden eine docker-compose-Datei verwenden und alle Optionen beschreiben, die für die Ausführung einer grundlegenden Arbeitskonfiguration von Traefik erforderlich sind.

Zunächst wollen wir ein Netzwerk für Traefik erstellen:

Docker-Netzwerk erstellen traefik-net

Als Nächstes schreiben wir die Kompositionsdatei mit den folgenden Optionen, die in einem Kommentar erläutert werden:

version: '3'

services:
  traefik:
    image: "traefik:v2.9"
    container_name: "traefik"
    ports:
      - "80:80"
      - "8080:8080" # Expose Dashboard
    command:
      - --providers.docker=true # Enables docker as the provider
      - --api.insecure=true # Allows using the api without any ssl certs
      - --api.dashboard=true # Allows dashboard to detect services (dashboard explained below)
      - --providers.docker.network=traefik-net # Traefik will be working in the network we created named “traefik-net”
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - traefik-net

networks:
  traefik-net:
    external: true

Wir sind bereit, den Container zu starten:

docker-compose up -d 

Wir können den laufenden Container mit dem Befehl docker ps überprüfen

CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                                                          NAMES
144e6e1cbcd2   traefik:v2.9   "/entrypoint.sh --pr…"   19 minutes ago   Up 18 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   traefik

Wie Sie wahrscheinlich schon in der Compose-Datei bemerkt haben, haben wir das Dashboard von Traefik bereits veröffentlicht. Wir können es über Port 8080 erreichen:

traefik Armaturenbrett

Ein paar Worte zum Armaturenbrett

Das Dashboard ist eine sehr bequeme und hübsche Möglichkeit, die Statistiken Ihrer Dienste und Routen einzusehen. Wenn ein Dienst von Traefik gescannt wird, erscheint er automatisch auf dem Dashboard. Wenn wir zum Abschnitt HTTP gehen, sehen wir, dass wir bereits 3 Router haben . Laut der offiziellen Dokumentation ist ein Router dafür zuständig, eingehende Anfragen mit den Diensten zu verbinden, die sie bearbeiten können. Der Port 80, der einer der Eingangspunkte ist, ist für die eingehenden Anfragen reserviert.

Router

Die Router , die wir hier sehen, sind die Standardrouter, die die Routen zu den Traefik-Komponenten definieren. 

Hinweis: Wie wir bereits erwähnt haben, kann das Dashboard sehr praktisch sein. Es stellt jedoch eine Sicherheitslücke dar und sollte in einer Umgebung mit Netzwerkzugriff von außen nicht offengelegt werden. Daher sollte es in einer Produktionsumgebung entweder deaktiviert (Port 8080 aus der Compose-Datei entfernen), mit SSL-Zertifikaten und anderen Mitteln ordnungsgemäß geschützt oder nur in einem internen Netzwerk verwendet werden.

Hinzufügen von Diensten zu Traefik

Fügen wir einen Dienst hinzu, an den Traefik die Anfragen weiterleiten wird. Für den alleinigen Zweck dieser Demonstration werden wir einen Nginx-Webserver in Docker verwenden.

Ziehen Sie direkt das Image und starten Sie den nginx-Container:

docker run -d -p 8081:80 -net=traefik-net nginx

Beachten Sie, dass wir den Container in dem zuvor erstellten Docker-Netzwerk starten und Port 8081 für den Webserver freigeben, da Port 80 bereits von Traefik verwendet wird, um alle Anfragen durchzuleiten.

Hinzufügen von Diensten zu Traefik

Nachdem wir sichergestellt haben, dass nginx läuft, können wir überprüfen, wie es im Dashboard erscheint. Und ohne weitere Eingriffe können wir den neuen Host sehen:

Host-Traefik

Nun ist der neue Host kein FQDN und wir können nicht auf diese Weise darauf zugreifen, was bedeutet, dass Traefik im Moment keine Anfragen über ihn leiten kann. Wie wir wissen, scannt Traefik die Dienste und sucht speziell nach Container-Labels. Die Labels dienen als Anweisungen für Traefik.

Fügen wir den Behältern Etiketten hinzu.

Run docker-compose down und bearbeiten Sie die Kompositionsdatei wie folgt:

version: '3'

services:
  traefik:
    image: "traefik:v2.9"
    container_name: "traefik"
    ports:
      - "80:80"
      - "8080:8080" # Expose Dashboard
    command:
      - --providers.docker=true
      - --api.insecure=true
      - --api.dashboard=true
      - --providers.docker.network=traefik-net
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - traefik-net
    labels:
      - "traefik.enable=true" # Enable assigning subdomain to the dashboard
      - "traefik.http.routers.api.rule=Host(`traefik.localhost`)" # Domain for the dashboard

  nginx1:
    image: "nginx:latest"
    container_name: "nginx1"
    ports:
      - "8081:80"
    depends_on:
      - traefik
    networks:
      - traefik-net
    labels:
      - "traefik.http.routers.nginx1.rule=(Host(`nginx.localhost`)
      - "traefik.enable=true" # Enable assigning subdomain to the service
networks:
  traefik-net:
    external: true

traefik.http.routers.nginx1.rule legt den Localhost fest, von dem aus Traefik die Anfrage an den Webserver weiterleitet.

docker-compose up -d

Wir sehen, dass wir jetzt einen richtigen Host haben. Testen wir, ob er funktioniert:

Host-Traefik

Beachten Sie, dass wir jetzt eine Verbindung zum Dashboard über die Domäne traefik.localhost herstellen können, die wir im Label des Containers festgelegt haben. Die nginx.localhost sollte uns auch auf den Webserver-Container umleiten:

Willkommen bei nginx traefik

Konfiguration von mehr als einem Dienst mit einer einzigen Domäne 

Der typische Anwendungsfall ist, dass wir Microservices haben, die eine Domain verwenden. Wir werden zwei benutzerdefinierte Nginx-Images mit benutzerdefinierten Konfigurationen erstellen. Nehmen wir an, dass diese 2 Container unterschiedliche Funktionen haben werden.

Erste Webserver default.conf:

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;


    location  /static {
        alias   /usr/share/nginx/html/static;
        try_files $uri $uri/ @static;
        index index.html;
    }

    location @ static {
      rewrite /static/(.*)$ /static/index.html?/$1 last;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Dockerfile:

FROM nginx 

RUN mkdir -p /usr/share/nginx/html/static
COPY index.html /usr/share/nginx/html/static
RUN chmod -R 755 /usr/share/nginx/html/static
COPY default.conf /etc/nginx/conf.d

Erstellen Sie eine benutzerdefinierte Indexdatei. Der Inhalt meiner Datei ist einfach "STATIC PAGE".

Zweiter Webserver default.conf:

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;


    location  /info {
        alias   /usr/share/nginx/html/info;
        try_files $uri $uri/ @info;
        index index.html;
    }

    location @ info {
      rewrite /info/(.*)$ /info/index.html?/$1 last;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Dockerfile:

FROM nginx 

RUN mkdir -p /usr/share/nginx/html/static
COPY index.html /usr/share/nginx/html/static
RUN chmod -R 755 /usr/share/nginx/html/static
COPY default.conf /etc/nginx/conf.d

Erstellen Sie die zweite Indexdatei mit einem anderen Inhalt.

Erstellen Sie die beiden Images in den jeweiligen Verzeichnissen. Ich werde sie nginx1 und nginx2 nennen.

docker build -t nginx1 .
docker build -t nginx2 .

Aktualisieren Sie die Kompositionsdatei und fügen Sie den neuen Containern die Etiketten mit den richtigen Regeln hinzu.

version: '3'

services:
  traefik:
    image: "traefik:v2.9"
    container_name: "traefik"
    ports:
      - "80:80"
      - "8080:8080" # Expose Dashboard
    command:
      - --providers.docker=true
      - --api.insecure=true
      - --api.dashboard=true
      - --providers.docker.network=traefik-net
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - traefik-net
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api.rule=Host(`traefik.localhost`)"

  nginx1:
    image: "nginx1:latest"
    container_name: "nginx1"
    ports:
      - "8081:80"
    depends_on:
      - traefik
    networks:
      - traefik-net
    labels:
      - "traefik.http.routers.nginx1.rule=(Host(`nginx.localhost`) && PathPrefix(`/static`))"
      - "traefik.enable=true"

  nginx2:
    image: "nginx2:latest"
    container_name: "nginx2"
    ports:
      - "8082:80"
    depends_on:
      - traefik
    networks:
      - traefik-net
    labels:
      - "traefik.http.routers.nginx2.rule=(Host(`nginx.localhost`) && PathPrefix(`/info`))"
      - "traefik.enable=true"

networks:
  traefik-net:
    external: true

Die PathPrefix-Regel entspricht dem Pfad des Anfragepräfixes. 

Starten Sie die Container:

sudo docker-compose up -d

Auf dem Dashboard können wir nun beide Hosts sehen.

traefik

Prüfen wir, ob wir Zugang zu jeder der URLs haben:

Statische Seite Traefik
informationsseite traefik

Traefik leitet die Anfragen entsprechend der URL auf der Grundlage der in den Containern festgelegten Labels erfolgreich um. Auf diese Weise können Sie ein dynamisches und automatisches Routing für Ihre Microservices einrichten. 

Schlussfolgerung

In diesem Leitfaden haben wir gezeigt, dass Traefik mit einer einfachen Konfiguration von großem praktischen Nutzen sein kann. Darüber hinaus sind seine Möglichkeiten keineswegs auf die von uns vorgestellten beschränkt. Traefik bietet viele erweiterte Optionen, wie das Hinzufügen von HTTP-Middleware, zusätzlichen Regeln, SSL-Zertifikaten zu den Diensten und mehr. Es gibt noch viele weitere Fälle, in denen Traefik hilfreich sein kann. Tauchen Sie ein und erforschen Sie neue Fallbeispiele und erfahren Sie mehr darüber, wie Sie Ihre Arbeit mit diesem modernen Reverse Proxy vereinfachen können!

2 Antworten

  1. Sehr schöner Artikel. Können Sie bitte helfen, zu verstehen, wenn wir brauchen, um horizontal zu skalieren traefik dann was sollte der Ansatz sein?

Eine Antwort hinterlassen

Newsletter für Tech-Experten

Signal, kein Rauschen –

direkt in Ihren Posteingang.

Schließen Sie sich mehr als 12.000 Ingenieuren und Führungskräften aus der Wirtschaft an, die Praxisberichte zu SRE, DevOps und Cloud-nativer Zuverlässigkeit erhalten.

Tech-Blogs mit tiefgehenden Einblicken und Fallstudien
Neue Technologien, sorgfältig ausgewählt

Ihre geschäftliche E-Mail-Adresse

Wir gehen respektvoll mit Ihrem Posteingang um. Lesen Sie unsere Datenschutzerklärung.

Mehr Beiträge

AI SRE Agent: Die ersten 20 Minuten eines Vorfalls automatisieren Es ist 3 Uhr morgens. Ein Alarm wird ausgelöst. Sie klappen Ihren Laptop auf, und die nächsten zwanzig Minuten verlaufen wie immer...
Lesen
Bei der Arbeit mit Terraform sollte das Standard-Meta-Argument zum Erstellen von Ressourcen fast immer „for_each“ lauten – insbesondere bei Infrastruktur, die voraussichtlich lange bestehen bleibt und sich weiterentwickelt...
Lesen
Kontakt aufnehmen
ITGix bietet Ihnen fachkundige Beratung und maßgeschneiderte DevOps-Services, um Ihr Unternehmenswachstum zu beschleunigen.
Newsletter für
Technik-Experten
Schließen Sie sich 12.000+ Geschäftsführern und Ingenieuren an, die Blogs, e-Books und Fallstudien Fallstudien über neue Technologie erhalten.