全书目录

第五十三篇:Traefik 完全指南 —— 动态路由航道塔台宇宙

第五十三篇:Traefik 完全指南 —— 动态路由航道塔台宇宙

19 分钟 8,543 字 第 934 / 962 个阅读单元

#一、先把 Traefik 想成一座“会自己看航班表”的塔台

如果把你的系统想成一座机场:

  • EntryPoint 是跑道和无线电频段,比如 :80:443
  • Router 是塔台的航道判定规则,决定“这架飞机该去哪里”
  • Middleware 是安检、边检、改签柜台、限流闸机
  • Service 是最终停机位和摆渡系统,负责把流量送到真正后端
  • Provider 是雷达和航班情报源,告诉塔台“现在有哪些服务、规则、证书、目标”
  • TLS 是加密航道和证书验真体系

Traefik 的厉害之处,不是“它也能反向代理”,而是它像一个动态塔台:后端服务一出现、消失、扩缩容、换端口、换标签,它会自动重算航道,而且通常不需要重启。


#二、反向代理、API Gateway、Ingress,到底是什么关系

这三个词最容易混。

1. 反向代理:塔台的最小职责

反向代理做的核心事很简单:客户端把请求交给它,它再代你转发给后端。

你访问的是:

text
https://app.example.com

真正处理请求的可能是:

text
http://app-v2:8080

客户端不知道后端是谁、在哪、几个实例。它只知道塔台地址。

2. API Gateway:塔台升级成“国际口岸总调度”

API Gateway 不只转发,还会做这些事:

  • 鉴权
  • 限流
  • 路径改写
  • Header 注入
  • 灰度发布
  • 审计与观测
  • 多 API 统一入口

所以,API Gateway 往往建立在反向代理之上。
反向代理像“放行”,API Gateway 更像“放行 + 安检 + 签证 + 流控 + 监控”。

3. Ingress:Kubernetes 世界里的“机场入口规则标准”

Ingress 不是某个具体产品,而是 Kubernetes 里的一套入口规则 API。
Traefik、NGINX、Kong 都可以当 Ingress Controller,负责把 Ingress 规则翻译成真正的数据面行为。

所以三者关系可以这样记:

text
反向代理 = 基础转发能力
API Gateway = 基础转发 + 策略治理
Ingress = Kubernetes 里的入口声明接口

Traefik Proxy 本身兼具:

  • 反向代理
  • Ingress Controller
  • 一部分 API Gateway 能力

但如果你要更完整的 API 生命周期管理、组织级治理、消费方管理,通常会继续看更重的网关产品或 Traefik 的更上层产品。


#三、Traefik 的核心心智:静态是机场基建,动态是当天航班表

Traefik 官方文档把配置分成两类,这个区分必须吃透。

1. 安装配置 / 静态配置

这类配置定义塔台“先天结构”:

  • 开哪些入口端口
  • 启用哪些 providers
  • 日志、dashboard、metrics
  • 证书解析器 certificatesResolvers

这些通常改了要重启。

2. 路由配置 / 动态配置

这类配置定义“今天的航班怎么飞”:

  • routers
  • middlewares
  • services
  • TLS certificates
  • TLS options

这类配置是 Traefik 的灵魂。它会热更新,通常不中断请求。

ASCII 图先记住:

text
                +----------------------+
                |  静态配置 / 基建层   |
                | entryPoints          |
                | providers            |
                | logs / dashboard     |
                | certResolvers        |
                +----------+-----------+
                           |
                           v
                +----------------------+
                |  动态配置 / 航班层   |
                | routers              |
                | middlewares          |
                | services             |
                | tls certs/options    |
                +----------+-----------+
                           |
                           v
客户端 ---> EntryPoint ---> Router ---> Middleware链 ---> Service ---> 后端实例

一句话总结:
静态配置告诉 Traefik“你是谁、听哪里、看谁”;动态配置告诉 Traefik“流量怎么走”。


#四、Providers:Traefik 为什么能“自己发现服务”

Traefik 的自动化,核心在 providers

你可以把 provider 理解成塔台接入的情报系统。
官方文档里,provider 大致有这些路数:

  • Label-based:比如 Docker labels
  • Annotation-based:比如 Kubernetes Ingress annotations
  • File-based:本地文件
  • Kubernetes CRD / Gateway API:K8s 对象本身就是规则源

ASCII 图:

text
Docker Labels -----------\\
Kubernetes Ingress -------\\
Kubernetes CRD -----------+--> Providers --> Traefik 动态配置树 --> 热更新
Gateway API -------------/
File Provider -----------/

为什么这很重要?

传统 Nginx 式思路常常是:

  1. 你改配置文件
  2. 你 reload
  3. 它再生效

Traefik 的思路是:

  1. 你改容器 label / K8s 对象 / 动态文件
  2. provider 感知变化
  3. Traefik 直接刷新路由树

这就是“动态路由塔台”的真正含义。


#五、Routers / Middlewares / Services:Traefik 最重要的三段式

这一段必须背下来,因为几乎所有 Traefik 配置都能化成这三段。

text
请求进来
  |
  v
[Router: 你是谁,要去哪里]
  |
  v
[Middleware: 过哪些关卡]
  |
  v
[Service: 最终转发到哪些后端]

1. Router:判定航班归属

Router 负责匹配规则,例如:

  • Host
  • Path / PathPrefix
  • Headers
  • Methods
  • SNI
  • EntryPoints

例如:

yaml
rule: Host(`api.example.com`) && PathPrefix(`/v1`)

意思是:
只要主机名是 api.example.com,且路径以 /v1 开头,就走这条航线。

注意一个非常容易踩坑的点:
多个路由重叠时,Traefik 默认按规则长度算优先级;复杂场景要显式配 priority

2. Middleware:中途关卡

Middleware 不是后端服务,而是请求经过塔台时附加的动作。常见有:

  • RedirectScheme:HTTP 跳 HTTPS
  • StripPrefix:去掉路径前缀
  • AddPrefix:补路径
  • Headers:加安全头
  • BasicAuth / ForwardAuth
  • RateLimit
  • Compress
  • IPAllowList
  • Chain

这类东西的本质不是“业务逻辑”,而是“入口治理逻辑”。

3. Service:真正后端目标

Service 负责定义请求最终送到哪里。
它可以是:

  • 一个容器的某个端口
  • 多个后端实例的负载均衡
  • 带健康检查
  • 带 sticky session
  • 带 weighted / mirroring
  • 带后端 TLS 传输配置

关键提醒:
Traefik 里的 Service 是“流量目标抽象”,不等于 Kubernetes Service 这个对象本身。


#六、Provider Namespace:为什么你会看到 @file@docker@kubernetescrd

这点很多人第一次接触会懵。

如果一个 middleware 是在 file provider 里定义的,而 router 是在 Docker labels 里声明的,那么 router 想引用它时,要写:

text
secure-chain@file

这叫跨 provider 引用。

所以:

  • foo@file 表示这个资源来自 file provider
  • auth@docker 表示来自 docker provider
  • secure-headers@kubernetescrd 表示来自 kubernetes CRD provider

把它理解成机场里的“来源系统编号”就行。
塔台不只要知道“叫啥”,还要知道“这条规则是哪个情报系统发来的”。


#七、TLS:先验票,再看航班号

Traefik 的 TLS 心智,有一个特别重要的顺序:

证书选择先发生,HTTP 路由规则后发生。

也就是:

  1. 客户端发起 TLS 握手
  2. Traefik 根据 SNI 选择证书
  3. TLS 建立后,才开始判断 Host()PathPrefix() 等 HTTP router 规则

所以你必须记住:

  • Host() 匹配的是 HTTP 层
  • 证书选择看的是 TLS 握手时的 SNI
  • 它们不是同一个阶段

ASCII 图:

text
客户端
  |
  |  TLS ClientHello + SNI=api.example.com
  v
Traefik 先选证书
  |
  |  TLS 握手完成
  v
再进入 HTTP Router 规则匹配
  |
  v
转发到 Service

常见 TLS 方式

  • 手动证书:自己挂 certFile / keyFile
  • ACME / Let's Encrypt:自动签发和续期
  • Kubernetes Secret:K8s 场景常见

一个实战判断

  • Docker / VM 场景,Traefik 自带 ACME 很舒服
  • Kubernetes IngressRoute 场景,可以用内建 Let's Encrypt
  • Kubernetes Gateway API 场景,官方文档明确建议你更偏向 cert-manager 这类证书控制器

HTTP/3 小提醒

Traefik 支持 HTTP/3,但它走 UDP,而且必须有 TLS。
所以你不能只想着“443 端口开了就够了”,还要知道 HTTP/3 对底层端口与协议有额外约束。


#八、Docker 场景:Traefik 最顺手的主战场之一

如果你在 Docker 或 Docker Compose 里跑多服务,Traefik 非常像“插电即用的自动塔台”。

1. 静态配置:定义塔台基建

yaml
entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
  websecure:
    address: ":443"

providers:
  docker:
    exposedByDefault: false
  file:
    filename: /etc/traefik/dynamic.yml
    watch: true

certificatesResolvers:
  le:
    acme:
      email: ops@example.com
      storage: /letsencrypt/acme.json
      httpChallenge:
        entryPoint: web

api:
  dashboard: true

这份配置的含义:

  • webwebsecure 是两条跑道
  • Docker provider 负责监听容器变化
  • File provider 负责存放可复用的中间件和 TLS 选项
  • le 是自动签证官,负责 ACME 证书

2. 动态配置:定义可复用关卡

yaml
http:
  middlewares:
    secure-chain:
      chain:
        middlewares:
          - secure-headers
          - gzip
    secure-headers:
      headers:
        stsSeconds: 31536000
        stsIncludeSubdomains: true
        stsPreload: true
        contentTypeNosniff: true
        frameDeny: true
    gzip:
      compress: {}

tls:
  options:
    modern:
      minVersion: VersionTLS12
      sniStrict: true

3. 业务容器:只贴标签,不手写总配置

yaml
services:
  traefik:
    image: traefik:v3.6
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.yml:/etc/traefik/traefik.yml:ro
      - ./dynamic.yml:/etc/traefik/dynamic.yml:ro
      - ./letsencrypt:/letsencrypt

  app:
    image: traefik/whoami
    labels:
      - traefik.enable=true
      - traefik.http.routers.app.rule=Host(`app.example.com`)
      - traefik.http.routers.app.entrypoints=websecure
      - traefik.http.routers.app.middlewares=secure-chain@file
      - traefik.http.routers.app.tls=true
      - traefik.http.routers.app.tls.certresolver=le
      - traefik.http.routers.app.tls.options=modern@file
      - traefik.http.services.app.loadbalancer.server.port=80

这就是 Traefik 在 Docker 里最迷人的地方:
应用团队只要给服务贴“航班标签”,塔台就自己出航线图。


#九、Kubernetes 场景:Ingress、IngressRoute、Gateway API 怎么选

在 Kubernetes 里,Traefik 有三种常见打法。

1. 用 Ingress:兼容优先

适合:

  • 团队已经大量使用原生 Ingress
  • 想少引入 Traefik 私有概念
  • 先跑起来

心智是:
Traefik 作为 Ingress Controller,监听 Ingress 资源,翻译成 routers/services/middlewares。

2. 用 IngressRoute / Middleware / TraefikService:Traefik 原生能力优先

适合:

  • 要用 Traefik 更细的能力
  • 想少写 annotation
  • 需要更清晰的 Traefik 原生路由表达

例如:

yaml
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: secure-headers
  namespace: app
spec:
  headers:
    stsSeconds: 31536000
    contentTypeNosniff: true
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: app
  namespace: app
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`app.example.com`) && PathPrefix(`/api`)
      kind: Rule
      middlewares:
        - name: secure-headers
      services:
        - name: app-svc
          port: 80
  tls:
    secretName: app-tls

这个模型非常直白:
IngressRoute 就是在 Kubernetes 里直接声明 Traefik 的 Router。

3. 用 Gateway API:面向未来的标准化路线

Gateway API 是比 Ingress 更现代的 Kubernetes 入口 API。
Traefik 官方文档当前说明其 Gateway provider 支持 Gateway API Standard 通道,并支持部分扩展与实验路由类型。

最核心的结构是:

text
GatewayClass -> Gateway -> HTTPRoute/TCPRoute/TLSRoute -> BackendRefs

最小例子:

yaml
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: edge
  namespace: traefik
spec:
  gatewayClassName: traefik
  listeners:
    - name: web
      port: 80
      protocol: HTTP
    - name: websecure
      port: 443
      protocol: HTTPS
      tls:
        certificateRefs:
          - name: app-tls
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: secure-headers
  namespace: app
spec:
  headers:
    stsSeconds: 31536000
    contentTypeNosniff: true
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: app-route
  namespace: app
spec:
  parentRefs:
    - name: edge
      namespace: traefik
  hostnames:
    - app.example.com
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /
      filters:
        - type: ExtensionRef
          extensionRef:
            group: traefik.io
            kind: Middleware
            name: secure-headers
      backendRefs:
        - name: app-svc
          port: 80

这里的重点是:

  • Gateway 定义“机场入口”
  • HTTPRoute 定义“具体航路”
  • ExtensionRef 让 Gateway API 直接挂 Traefik Middleware
  • HTTPS 监听器的证书通常来自 Secret
  • 在 Gateway API 路线下,证书自动化更常见的搭配是 cert-manager

我的实战建议

  • 要兼容生态,先 Ingress
  • 要用 Traefik 原生能力,选 IngressRoute
  • 要面向标准化和长期演进,选 Gateway API

#十、Traefik 与 Nginx / Kong / Envoy,到底怎么区分

这一段不要死记产品名,要记“气质”。

维度 Traefik Nginx Kong Envoy
核心气质 动态发现型入口塔台 经典配置型反向代理/服务器 API Gateway 优先 可编程数据平面
强项 Docker/K8s 动态路由、上手快 稳、广、经典、静态能力强 插件生态、策略治理、API 管理 xDS、精细流控、服务网格底座
配置来源 Providers 配置文件为主,控制器生成配置 Services/Routes/Plugins/控制面 xDS/Listener/Route/Cluster
Kubernetes 心智 Ingress + CRD + Gateway API NGINX Ingress / Gateway Fabric KIC / Gateway API Envoy Gateway / Service Mesh
学习曲线 低到中 低到中
适合谁 DevOps / 微服务团队 传统站点与稳定反代 API 平台团队 平台工程与大规模网格团队

1. Traefik vs Nginx

如果说 Nginx 像“经验老到的机场总机房”,Traefik 更像“云原生自动塔台”。

  • Nginx 非常强,但很多时候你是先写配置,再 reload
  • Traefik 更强调“从环境自动发现配置”
  • 在 Docker/K8s 这种变化快的场景,Traefik 往往更省心
  • 在静态站点、复杂手写 Nginx 指令体系、历史存量很大时,Nginx 常更顺手

2. Traefik vs Kong

Kong 从基因上更像 API Gateway。

  • Kong 的核心实体就是 ServicesRoutesPlugins
  • 插件治理、消费方、控制面思路更强
  • Traefik 更轻、更贴近入口代理与 Ingress
  • 如果你主要问题是“服务自动暴露、动态路由、TLS、简单治理”,Traefik 很顺
  • 如果你主要问题是“API 产品化治理、租户、消费者、插件政策体系”,Kong 往往更对味

3. Traefik vs Envoy

Envoy 是超级强的数据平面。

  • Envoy 的抽象更底层:Listener、Filter、Route、Cluster、xDS
  • 可塑性极强,但复杂度也更高
  • Traefik 更像“把 80% 常见入口问题做成更友好的工程产品”
  • Envoy 更像“你想造航母级网络控制系统时的发动机”

一句话:

text
Traefik = 云原生入口塔台
Nginx   = 经典全能反向代理老将
Kong    = API Gateway 治理专家
Envoy   = 高扩展代理内核与数据平面

#十一、最容易踩的误区

误区 1:Traefik 只是 Nginx 的另一个替代品

不对。
Traefik 最大特色不是“也会转发”,而是“动态发现 + 热更新 + 云原生 provider 模型”。

误区 2:Service 就是 Kubernetes Service

不对。
Traefik Service 是路由目标抽象;Kubernetes Service 只是它可能引用的一种后端来源。

误区 3:Host() 决定证书选择

不对。
TLS 证书选择先看 SNI,HTTP Router 规则后执行。

误区 4:用了 Gateway API,就能和 IngressRoute 完全一模一样

不对。
Gateway API 是标准接口,Traefik 原生 CRD 是 Traefik 特性直出。两者交集很大,但并不完全等价。

误区 5:中间件随便挂,顺序无所谓

不对。
Middleware 是有顺序的。
比如先 StripPrefixForwardAuth,和先鉴权再改路径,语义可能完全不同。

误区 6:ACME 配了就万事大吉

不对。
证书申请依赖域名解析、挑战方式、入口端口、持久化存储。
特别是本地开发域名、K8s 多副本、高可用场景,都要单独想清楚。


#十二、什么场景适合 Traefik,什么场景不适合

适合

  • Docker Compose 多服务入口统一
  • Kubernetes 南北向流量入口
  • 微服务数量经常变化
  • 希望“应用注册即暴露”
  • 需要 HTTPS、限流、鉴权、Header 治理这些入口能力
  • 团队想减少手写大段代理配置

不太适合

  • 只有一个很稳定的单体站点,需求极简单
  • 团队已经深度沉淀在 Nginx 配置体系里,迁移收益不大
  • 你要的是完整 API 管理平台,而不是入口代理
  • 你在做 service mesh / 超复杂 L7/L4 策略编排,需要 Envoy 级别底层能力
  • 你需要极强的多租户消费方治理、插件平台、平台级控制面,Kong 可能更贴题

#十三、一张总图把 Traefik 宇宙串起来

text
                    +----------------------------------+
                    |          静态配置层              |
                    | entryPoints / providers / ACME   |
                    +----------------+-----------------+
                                     |
                                     v
     +-------------+   +-------------+-------------+   +-------------+
     |   Docker    |   |   Kubernetes Ingress/CRD  |   |    File     |
     |   labels    |   |   Gateway API / Secret    |   |   dynamic   |
     +------+------+   +-------------+-------------+   +------+------+
            \\                        |                          /
             \\                       |                         /
              \\                      |                        /
               v                     v                       v
                  +--------------------------------------+
                  |            Providers 汇总层          |
                  +------------------+-------------------+
                                     |
                                     v
                  +--------------------------------------+
                  | Router: Host/Path/Header/SNI 匹配    |
                  +------------------+-------------------+
                                     |
                                     v
                  +--------------------------------------+
                  | Middleware: auth/ratelimit/headers   |
                  | redirect/stripPrefix/compress        |
                  +------------------+-------------------+
                                     |
                                     v
                  +--------------------------------------+
                  | Service: LB/healthcheck/sticky       |
                  +------------------+-------------------+
                                     |
                     +---------------+---------------+
                     |                               |
                     v                               v
                app-v1:8080                      app-v2:8080

#十四、总结

学 Traefik,最重要的不是背参数,而是建立这个稳定心智:

  • 它是一座动态塔台,不是一份静态转发清单
  • Providers 决定它怎么“知道世界发生了变化”
  • Routers 决定请求归哪条航线
  • Middlewares 决定路上过哪些关卡
  • Services 决定最终落到哪些后端
  • TLS 先验票,再进入 HTTP 路由
  • Docker 场景它像自动编队系统
  • Kubernetes 场景它既能做 Ingress,也能走 CRD 和 Gateway API
  • 和 Nginx、Kong、Envoy 的差别,本质是工程哲学不同,不只是功能清单不同

如果你把 Traefik 看成“会自动读取环境情报、实时重排航道的云原生塔台”,后面的配置就不会乱。

#官方来源链接清单