Traefik 简介

Traefik 是一种现代反向代理和负载均衡器,旨在简化和优化微服务的部署和管理。在本教程中,我们将探讨 Traefik 是什么、它的主要功能以及如何将其集成到应用程序基础架构中。

什么是 Traefik
Traefik是由 Containous 开发的开源动态反向代理和负载均衡器。它专门设计用于与Kubernetes、Docker Swarm和Mesos等现代容器编排平台无缝集成。

Traefik 的主要目标是简化反向代理和负载平衡任务的配置和管理,使其成为微服务架构的理想选择。

 主要特点

  • 自动发现:Traefik 通过与服务注册表、容器编排器和云提供商集成来自动发现服务和路由。
  • 动态配置:它根据环境的变化动态调整其配置,而无需重新启动。
  • 中间件:支持各种中间件来操作请求和响应,例如身份验证、速率限制和重试。
  • 负载平衡:提供复杂的负载平衡算法来跨服务分配流量。
  • SSL 终止:Traefik 可以自动管理 SSL 证书,使我们更轻松地使用 HTTPS 保护我们的应用程序。
  • 仪表板:提供内置的 Web UI 来监控和可视化我们的服务和路由器的状态。

Traefik 的工作原理
Traefik 通过监听我们的编排平台或服务发现工具的 API 来运行。然后,它使用此信息自动将流量路由到适当的服务。例如,在 Kubernetes 环境中,我们可以将 Traefik 配置为入口控制器,以管理传入集群内服务的 HTTP 和 HTTPS 流量。

让我们了解一下 Traefik 的简单工作流程:

  1. 服务发现:Traefik 持续监控环境中的新服务或更新服务。
  2. 路由:Traefik 根据发现的服务动态创建或更新路由。
  3. 负载平衡:Traefik 在可用的服务实例之间分配传入的请求。
  4. TLS 终止:如果配置,Traefik 将处理 HTTPS 流量,自动管理 SSL 证书。
  5. 中间件:我们可以在请求和响应到达服务或客户端之前修改它们。

使用 Traefik
Traefik 提供多种安装方法。在本指南中,我们将重点介绍使用Docker安装它。我们将使用以下docker-compose.yml将 Traefik 作为容器运行。我们可以在Docker 存储库中找到 Traefik 的最新镜像:

version: '3'
services:
  reverse-proxy:
    The official v3 Traefik docker image
    image: traefik:v3.1
    Enables the web UI and tells Traefik to listen to docker
    command: --api.insecure=true --providers.docker
    ports:
      The HTTP port
      - "80:80"
      The Web UI (enabled by --api.insecure=true)
      -
"8080:8080"
    volumes:
      So that Traefik can listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock

以下命令将在后台运行 Traefik 容器。在此示例中,Traefik 配置为监听 Docker 事件,并根据正在运行的服务自动更新其路由配置:

docker-compose up -d reverse-proxy

我们打开浏览器,访问http://localhost:8080/api/rawdata来查看 Traefik 的 API 原始数据:


现在我们可以部署新服务了。我们在docker-compose.yml中添加一个名为whoami的新服务。此服务将输出有关部署该服务的机器的信息:

version: '3'
services:
  whoami:
    image: traefik/whoami
    labels:
      - "traefik.http.routers.whoami.rule=Host(whoami.docker.localhost)"

现在让我们运行命令来启动服务:

docker-compose up -d whoami

当 Traefik 检测到新服务时,它会创建相应的路由,允许我们访问它们。让我们使用 curl 尝试一下:

curl -H Host:whoami.docker.localhost http://127.0.0.1

运行上述命令将导致输出包含客户端 IP 地址、服务的内部 IP 和主机名以及标头等详细信息,包括原始主机和协议:

Hostname: 008455958d71
IP: 127.0.0.1
IP: 172.21.0.3
RemoteAddr: 172.21.0.2:43852
GET / HTTP/1.1
Host: whoami.docker.localhost
User-Agent: curl/8.7.1
Accept: /
Accept-Encoding: gzip
X-Forwarded-For: 172.21.0.1
X-Forwarded-Host: whoami.docker.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: 0c1bf06a7c23
X-Real-Ip: 172.21.0.1