Traefik是云原生场景下广泛使用的反向代理和负载均衡器,与Nginx最大的区别在于原生支持Docker、Kubernetes等服务发现机制,容器启动后自动注册路由,无需手动维护配置文件。结合Let’s Encrypt实现自动HTTPS证书申请与续期,适合微服务和容器化部署场景。
Traefik与传统反向代理的核心差异
Nginx的配置是静态的,每次后端服务变更需要修改nginx.conf并reload。Traefik通过Provider机制监听Docker API、Kubernetes API等,动态感知容器上下线,自动更新路由规则。这种”配置即代码”的模式消除了人工干预环节,减少了因配置遗漏导致的服务中断。
Traefik的核心概念包括:EntryPoints(监听端口)、Routers(路由规则)、Services(后端服务)、Middlewares(中间件)。请求流向为:客户端 → EntryPoint → Router匹配 → Middleware处理 → 转发到Service。
Docker Compose部署Traefik
使用Docker Compose是最快速的部署方式。以下配置实现Traefik本身的启动和管理界面暴露:
# docker-compose.yml
services:
traefik:
image: traefik:v3.1
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
- "--entrypoints.web.http.redirections.entryPoint.scheme=https"
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- traefik_net
networks:
traefik_net:
external: true
exposedbydefault=false表示只有显式声明Traefik标签的容器才会被暴露,避免误暴露内部服务。web入口的HTTP请求自动重定向到websecure(HTTPS),实现全站强制HTTPS。
微服务容器接入Traefik路由
后端服务通过Docker labels声明路由规则,Traefik自动读取并生效。以下是一个API服务的接入示例:
# docker-compose.yml (应用服务)
services:
api-service:
image: myapp:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`api.example.com`)"
- "traefik.http.routers.api.entrypoints=websecure"
- "traefik.http.routers.api.tls=true"
- "traefik.http.routers.api.tls.certresolver=letsencrypt"
- "traefik.http.services.api.loadbalancer.server.port=8080"
- "traefik.http.routers.api.middlewares=rate-limit,retry"
networks:
- traefik_net
web-frontend:
image: frontend:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.web.rule=Host(`www.example.com`)"
- "traefik.http.routers.web.entrypoints=websecure"
- "traefik.http.routers.web.tls=true"
- "traefik.http.routers.web.tls.certresolver=letsencrypt"
- "traefik.http.services.web.loadbalancer.server.port=3000"
networks:
- traefik_net
Host规则匹配域名,server.port指定容器内部端口。容器扩缩容时,Traefik自动感知新容器并加入负载均衡池,无需任何手动操作。
Let’s Encrypt自动HTTPS证书配置
Traefik内置ACME客户端,自动向Let’s Encrypt申请证书并定时续期。需要在Traefik启动参数中配置证书解析器:
command:
- "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
- "--certificatesresolvers.letsencrypt.acme.email=admin@example.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-v02.api.letsencrypt.org/directory"
volumes:
- letsencrypt_data:/letsencrypt
TLS Challenge验证方式不需要额外开放端口,适合大多数场景。生产环境使用caserver指向正式API,测试时使用staging环境避免触发Let’s Encrypt的速率限制。证书自动在到期前30天续期,acme.json文件需设置600权限保护私钥。
中间件链式处理与限流配置
Traefik的中间件支持请求限流、重试、超时、压缩、认证等处理,多个中间件按声明顺序链式执行:
labels:
# 限流:每秒平均100请求,突发200
- "traefik.http.middlewares.rate-limit.ratelimit.average=100"
- "traefik.http.middlewares.rate-limit.ratelimit.burst=200"
# 重试:失败请求重试3次
- "traefik.http.middlewares.retry.retry.attempts=3"
# 请求超时
- "traefik.http.middlewares.api-timeout.forwardingtimeout=30s"
# BasicAuth认证
- "traefik.http.middlewares.api-auth.basicauth.users=admin:$$apr1$$xyz..."
# 路由引用多个中间件
- "traefik.http.routers.api.middlewares=rate-limit,retry,api-timeout,api-auth"
中间件可在多个Router间共享定义,通过名称引用。组合限流和重试中间件能有效应对突发流量和瞬时网络抖动。
路径路由与权重灰度发布
Traefik支持基于Path前缀的路由规则,适合将不同路径转发到不同服务:
labels:
# /api/* 转发到后端API
- "traefik.http.routers.api.rule=Host(`app.example.com`) && PathPrefix(`/api`)"
- "traefik.http.routers.api.service=api-svc"
# 其余路径转发到前端
- "traefik.http.routers.frontend.rule=Host(`app.example.com`)"
- "traefik.http.routers.frontend.service=frontend-svc"
# 灰度发布:90%流量到v1,10%到v2
- "traefik.http.services.api-svc.loadbalancer.server.port=8080"
- "traefik.http.services.api-svc-v2.loadbalancer.server.port=8081"
- "traefik.http.routers.api.service=api-svc"
- "traefik.http.routers.api-v2.rule=Host(`app.example.com`) && PathPrefix(`/api`)"
- "traefik.http.routers.api-v2.service=api-svc-v2"
通过WRR(加权轮询)策略可以实现灰度发布,逐步将流量从v1切换到v2。Traefik的动态路由能力在容器化架构中显著降低了运维复杂度,是云原生服务网格之外轻量级流量管理的有效方案。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/traefik-fan-xiang-dai-li-yu-zi-dong-https-pei-zhi-docker/