第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。你只要写个域名,它就自动:
- 向 Let's Encrypt/ZeroSSL 申请证书(ACME 协议)
- 完成 HTTP-01 或 TLS-ALPN-01 或 DNS-01 验证
- 自动续期、自动 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/HAProxy | Envoy | Traefik | Caddy |
|---|---|---|---|---|
| 配置哲学 | 静态显式 | 动态(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 挂载 |
| 路由 404 | rule 域名/路径不匹配 | 看 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 转向正向代理世界——企业出网、缓存与审计的经典主力。