Skip to content

Traefik

architecture-overview

Traefik 是一个边缘路由器,这意味着它是通往你平台的大门,它拦截和路由每一个传入的请求:它知道所有的逻辑和每一个规则来决定哪个服务处理哪个请求

  • Entrypoints 侦听传入流量(端口,......)
  • Routers: 解析请求 (host, path, headers, SSL, ...)
  • Providers 发现您的基础设施上的服务(他们的 IP,健康......)
  • Services 转发请请求到你的服务 (负载平衡, ...)
  • Middlewares 可以根据请求更新请求或做出决策(身份验证,速率限制,标头......)

Entrypoints

yaml
version: '3'

services:
  reverse-proxy:
    # The official v2 Traefik docker image
    image: traefik:v2.10
    # 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
  docs:
    image: ccr.ccs.tencentyun.com/gh-registry/docs:latest
    container_name: docs
    restart: always
    labels:
      - traefik.http.routers.docs.rule=Host(`114.132.246.26`)

Routers

路由器负责将传入的请求连接到能够处理它们的服务。

接下来我们使用 docker-compose 借助 whoami 镜像启动一个简单的 http 服务,docker-compose.yaml 配置文件如下

yaml
version: '3'

services:
  whoami:
    image: traefik/whoami
    labels:
      - traefik.enable=true
      - traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)
      - traefik.http.routers.whoami.entrypoints=websecure
      - traefik.http.routers.whoami.tls.certresolver=myresolver

whoami 这个 http 服务做了什么事情呢

  1. 暴露了一个 http 服务,主要提供一些 header 以及 ip 信息
  2. 配置了容器的 labels,设置该服务的 Hostwhoami.docker.localhost,给 traefik 提供标记

此时我们可以通过主机名 whoami.docker.localhost 来访问 whoami 服务,我们使用 curl 做测试

bash
$ curl -H Host:whoami.docker.localhost http://127.0.0.1
Hostname: bc3e8f1a5066
IP: 127.0.0.1
IP: 172.21.0.2
RemoteAddr: 172.21.0.1:37852
GET / HTTP/1.1
Host: whoami.docker.localhost
User-Agent: curl/7.29.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 127.0.0.1
X-Forwarded-Host: whoami.docker.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: 8.8.8.8
X-Real-Ip: 127.0.0.1

服务正常访问。此时如果把 Host 配置为自己的域名,则已经可以使用自己的域名来提供服务

HTTPS & TLS

https

yaml
version: '3.3'

services:
  traefik:
    image: 'traefik:v2.10'
    container_name: traefik
    command:
      # - "--log.level=DEBUG"
      - --api.insecure=true
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - '--entrypoints.web.address=:80'
      - '--entrypoints.websecure.address=:443'
      - --certificatesresolvers.myresolver.acme.httpchallenge=true
      - --certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web
      # - "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      - --certificatesresolvers.myresolver.acme.email=854286351@qq.com
      - --certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json
    ports:
      - '80:80'
      - '443:443'
      - '8080:8080'
    volumes:
      - './letsencrypt:/letsencrypt'
      - '/var/run/docker.sock:/var/run/docker.sock:ro'
  1. certificatesresolvers.myresolver.acme.email 命令行参数中将 postmaster@example.com 替换为您自己的电子邮件地址。
  2. 请在 whoami 服务的 traefik.http.routers.whoami.rule 标签中将 whoami.example.com 替换为您自己的域名。
  3. 如果您想测试/调试,可以选择取消以下行的注释:
#- "--log.level=DEBUG"
#- "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"

在您创建上述文件的文件夹中运行

sh
docker-compose up -d

配置文件

在启动时,Traefik 会在以下目录中搜索一个名为 traefik.yml (或 traefik.yamltraefik.toml) 静态配置文件。

  • /etc/traefik/
  • $XDG_CONFIG_HOME/
  • $HOME/.config/
  • . (the working directory).

Traefik 中的配置可以指两种不同的东西

  • 全动态路由配置(简称动态配置)
  • 启动配置(称为静态配置)

动态配置包含定义系统如何处理请求的所有内容。该配置可以更改,并且可以无缝地热加载,不会出现任何请求中断或连接丢失。

动态配置

Traefik 从提供程序获取动态配置:无论是协调器、服务注册表还是普通的旧配置文件。

静态配置

静态配置中的元素建立到提供程序的连接,并定义 Traefik 将侦听的入口点(这些元素不经常更改)。 在 Traefik 中定义静态配置选项有三种不同的、互斥的方法(即你只能同时使用其中一种):

  • 在配置文件中
  • 在命令行参数中
  • 作为环境变量

微服务项目部署