ArcLibrary

Traefik

为容器化时代而生的反向代理 —— 自动发现 Docker / K8s 服务。

TraefikK8s容器
核心 · Key Idea

一句话:Traefik 通过 Provider(Docker / K8s / Consul) 自动发现服务,无需重启 / 无需手写后端列表。新容器一启动它就接进流量;停掉就立刻摘除。容器时代的事实标准之一。

是什么#

# docker-compose.yml 片段
services:
  traefik:
    image: traefik:v3
    command:
      - --api.insecure=true
      - --providers.docker
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.le.acme.tlschallenge=true
      - --certificatesresolvers.le.acme.email=you@example.com
    ports: ["80:80", "443:443", "8080:8080"]
    volumes: ["/var/run/docker.sock:/var/run/docker.sock:ro"]
 
  app:
    image: my-app
    labels:
      - traefik.enable=true
      - traefik.http.routers.app.rule=Host(`api.example.com`)
      - traefik.http.routers.app.tls.certresolver=le

部署 app 时只贴 label,路由 / TLS 自动生效。

打个比方#

打个比方 · Analogy

nginx / HAProxy 像手动设置导航:每加一站都要进配置文件改地址。
Traefik 像自动发现的智能导航:你随时上车下车,它实时识别新加的站点,自动规划路线。

关键概念#

EntryPoint入口点
监听端口,比如 web=80, websecure=443。
Router路由器
匹配规则(Host / Path / Method)→ 指向 Service。
Service服务
一组后端实例,自动从 provider 发现。
Middleware中间件
压缩、重写、限流、鉴权等可叠加的处理链。
Provider服务发现源
Docker、K8s Ingress、CRD、Consul、文件 ……
Dashboard管理面
默认 :8080 内置图形化路由可视化(生产记得鉴权或关闭)。

怎么工作#

新加 / 停 / 升级容器时 Traefik 在毫秒内更新内部路由表。

实操要点#

  • K8s Ingress 替代品:用 Traefik IngressRoute CRD 比原生 Ingress 表达力强(中间件链、TCP/UDP 路由)。
  • TLS 一键 ACME:HTTP / TLS-ALPN / DNS challenge 都支持。多域名时建议 DNS challenge。
  • 生产暴露 dashboard:必须加 BasicAuth 或 IP 白名单,否则等于裸奔。
  • 滚动发布:Traefik 自动跟 Docker / K8s 状态切流量,无需特殊配置。
  • TCP / UDP 路由tcp.routers.xxx.rule=HostSNI(...) 也能反代数据库 / SSH 等。
  • 可观测性:内置 Prometheus / OpenTelemetry exporter,开起来即可。

易混点#

Traefik
K8s 原生体验、CRD、动态。
Go 实现,扩展插件以 wasm 为主。
nginx Ingress
nginx 内核,老牌稳定。
动态配置弱,需要 reload。

延伸阅读#