第16章 Traefik / Caddy:自动服务发现与自动 HTTPS

学习目标

  • 理解"自动化优先"这类现代代理的卖点:零配置发现、自动证书
  • 掌握 Traefik 从 Docker/K8s 标签自动发现路由的机制(容器加标签即上线)
  • 掌握 Caddy 默认自动 HTTPS 的便利与原理
  • 想清楚它们与 Nginx/HAProxy/Envoy 的取舍:便利 vs 极致控制

前置知识


原理

一类新代理:把"自动化"当第一目标

Nginx/HAProxy/Envoy 强在控制力,但都要你显式写后端。在容器时代,实例频繁增减,"手写后端"很痛。Traefik 和 Caddy 代表另一种哲学:

能自动就别让人配。 后端从容器编排里自动发现,证书从 Let's Encrypt 自动申请续期,配置能省则省。

代价是放弃一部分极致控制和性能调优空间,换取开发者体验。它们特别适合动态容器环境和中小团队/个人站点。

Traefik:容器标签即路由

Traefik 的核心是 Provider(提供者)——它主动连接你的基础设施(Docker、Kubernetes、Consul、文件),实时发现服务并自动生成路由。

         Provider 自动发现
  ┌─────────────────────────────────────────────┐
  │ Docker / K8s / Consul ──监听变化──▶ Traefik   │
  │  容器带标签 traefik.http.routers.x.rule=...   │
  │           ↓ 自动生成                          │
  │ EntryPoints → Routers → Middlewares → Services│
  │  (监听端口)   (匹配规则)   (中间件链)   (后端)  │
  └─────────────────────────────────────────────┘

Traefik 的四个概念:

  • EntryPoints:监听入口(如 :80、:443)
  • Routers:匹配规则(Host()、PathPrefix() 等)→ 指向 Service
  • Middlewares:中间件链(认证、限流、改写、重试),类似 Envoy 的 filter
  • Services:后端(自动从 Provider 发现实例)

杀手锏:在 Docker 里,给容器贴几个标签就自动有了路由,无需改 Traefik 配置、无需 reload:

labels:
  - "traefik.http.routers.myapp.rule=Host(`app.example.com`)"
  - "traefik.http.services.myapp.loadbalancer.server.port=8080"

容器一起,Traefik 立刻发现并开始代理;容器一停,路由自动撤销。这种"动态发现"在精神上类似 Envoy 的 xDS(第15章),但面向应用开发者而非平台。

Caddy:默认自动 HTTPS

Caddy 的最大卖点:开箱即用的自动 HTTPS。你只要写个域名,它就自动:

  1. 向 Let's Encrypt/ZeroSSL 申请证书(ACME 协议)
  2. 完成 HTTP-01 或 TLS-ALPN-01 或 DNS-01 验证
  3. 自动续期、自动 OCSP stapling、自动 HTTP→HTTPS 跳转

配置极简(Caddyfile):

app.example.com {
    reverse_proxy localhost:8080
}

两行——一个带自动 HTTPS 的反向代理就好了。证书申请、续期、跳转全自动,这是 Nginx 要配一堆 + certbot 才能达到的效果。

ACME 自动证书的原理与前提

Traefik 和 Caddy 的自动 HTTPS 都基于 ACME 协议(第05章 的证书话题,详见 k8sLab · cert-manager/ACME)。关键前提:

  • HTTP-01 验证:需要 80 端口可被 Let's Encrypt 访问(公网可达、DNS 指向本机)
  • DNS-01 验证:需要 DNS provider API 权限(适合内网/泛域名)
  • 限流:Let's Encrypt 有签发频率限制,反复重启申请会被限流(用 staging 环境调试)

横向取舍

维度Nginx/HAProxyEnvoyTraefikCaddy
配置哲学静态显式动态(xDS)、平台向自动发现、应用向极简、自动 HTTPS
自动 HTTPS需 certbot需控制面✅ 内置✅ 默认开
服务发现手写/模块xDS✅ Provider基础
极致性能/控制✅ 最强✅ 强中中
上手难度中高低最低
最适合通用/高性能Mesh/平台动态容器环境个人/小团队/自动证书

一句话选型:要极致控制用 Nginx/HAProxy;要平台级动态用 Envoy;容器里图省事用 Traefik;个人站点要自动 HTTPS 用 Caddy。


️ 实现 / 命令

实验一:Traefik + Docker 标签自动路由

# docker-compose.yml
services:
  traefik:
    image: traefik:v3.0
    command:
      - "--providers.docker=true"               # 开启 Docker 自动发现
      - "--entrypoints.web.address=:80"
      - "--api.dashboard=true"
    ports: ["80:80", "8080:8080"]               # 8080 = dashboard
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro

  whoami:
    image: traefik/whoami
    labels:
      - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
      - "traefik.http.services.whoami.loadbalancer.server.port=80"
docker compose up -d
curl -H "Host: whoami.localhost" http://localhost/   # 自动路由到 whoami,无需改 Traefik 配置
# 再 scale:docker compose up -d --scale whoami=3 → Traefik 自动负载均衡到 3 个

实验二:Caddy 两行实现自动 HTTPS 反代

# /etc/caddy/Caddyfile
app.example.com {
    reverse_proxy localhost:8080
}
caddy run --config /etc/caddy/Caddyfile
# 首次访问 https://app.example.com 时,Caddy 已自动申请好证书
curl -sI https://app.example.com | head -1     # HTTP/2 200,证书由 Let's Encrypt 自动签发

实验三:Caddy 调试用 staging(避免被 Let's Encrypt 限流)

{
    # 全局选项:用 Let's Encrypt staging 环境调试(证书不受信但不限流)
    acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
}
app.example.com {
    reverse_proxy localhost:8080
}

排错

现象根因解决
Traefik 没发现容器标签写错 / 没挂 docker.sock核对 traefik.http.routers.* 标签、socket 挂载
路由 404rule 域名/路径不匹配看 dashboard 里 router 状态
自动 HTTPS 申请失败80 端口不可达 / DNS 没指向用 DNS-01,或确保公网可达 80
反复重启证书申请被限流Let's Encrypt 频率限制用 staging 调试,证书会持久化别删
Caddy 内网域名无法 HTTP-01内网不可达公网验证配 DNS-01 provider 或内部 CA
性能/精细控制不够这类代理本就偏自动化极致需求换 Nginx/Envoy

本章小结

  • Traefik/Caddy 代表"自动化优先"哲学:自动发现后端、自动申请 HTTPS,用便利换部分控制力。
  • Traefik 靠 Provider 从 Docker/K8s 标签自动发现路由,容器加标签即上线,精神上类 xDS 但面向应用开发者。
  • Caddy 默认自动 HTTPS(ACME),两行配置就是带证书的反向代理;调试用 staging 防限流。
  • 选型:极致控制 Nginx/HAProxy、平台动态 Envoy、容器省事 Traefik、个人自动证书 Caddy。

至此云原生反向代理四件套(Nginx/HAProxy/Envoy/Traefik-Caddy)讲完。下一章 第17章 Squid 转向正向代理世界——企业出网、缓存与审计的经典主力。