Hotdry.
systems-engineering

Traefik 云原生边缘代理:Docker/K8s 标签发现、Let's Encrypt 自动 TLS 与限流认证中间件

Traefik 通过 Docker labels 和 Kubernetes CRDs 实现动态服务发现,支持 Let's Encrypt 自动 TLS,以及 rate-limiting 和 BasicAuth 中间件,提供边缘代理生产参数配置与监控要点。

Traefik 作为云原生边缘代理的核心优势在于其动态服务发现能力,能够实时监听 Docker 或 Kubernetes 等平台的 API 或 labels,无需手动配置路由规则或重启服务。在微服务环境中,服务实例频繁扩缩容时,传统代理如 Nginx 需要 reload 配置,可能导致短暂中断,而 Traefik 通过 Provider 机制自动生成路由,确保零停机更新。

对于 Docker 环境,启用 providers.docker=true,并挂载 /var/run/docker.sock,即可监听容器事件。服务只需添加 labels 如 "traefik.http.routers.myapp.rule=Host (app.example.com)"和"traefik.http.services.myapp.loadbalancer.server.port=8080",Traefik 即自动创建路由和服务负载均衡。实际测试显示,容器启动后不到 1 秒内路由生效,支持 WRR 加权轮询和健康检查(healthcheck.path=/health, interval=10s)。对于 Kubernetes,使用 IngressRoute CRD 或标准 Ingress,Traefik 作为 Ingress Controller 通过 labelSelector(如 traffic-type=external)过滤资源,实现多命名空间监控。参数建议:providers.kubernetescrd.ingressclass=traefik,namespaces=["default","production"],throttleDuration=10s 以控制 API 轮询频率。

自动 TLS 是 Traefik 的另一亮点,通过集成 Let's Encrypt ACME 协议实现零配置证书管理。在静态配置中定义 certificatesResolvers.letsencrypt.acme.email=admin@example.com、storage=acme.json、httpChallenge.entryPoint=web(或 tlsChallenge),路由标签添加 "traefik.http.routers.myapp.tls.certresolver=letsencrypt"。系统自动申请、验证域名、续期证书(提前 30 天),支持通配符 *.example.com。生产参数:使用 staging caServer 测试避免 rate limit(50 certs/hour),keyType=RSA4096,certificatesDuration=2160h。结合 entryPoints.web.http.redirections.entryPoint.to=websecure、scheme=https,实现 HTTP 到 HTTPS 强制重定向。

中间件系统允许链式组合流量治理功能,特别适合边缘代理场景。Rate-limiting 中间件配置 "traefik.http.middlewares.ratelimit.ratelimit.average=100"(req/s)、burst=200、period=1s,支持 IP 来源提取(extractors.client.ip=true)。BasicAuth 示例:"traefik.http.middlewares.auth.basicauth.users=test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/"(htpasswd 生成),路由引用 "traefik.http.routers.myapp.middlewares=ratelimit,auth"。其他常用:IPWhiteList(sourceRange=192.168.1.0/24)、headers(sslRedirect=true, stsSeconds=31536000)。落地清单:1. Docker labels 链:routers.rule + services.port + tls.certresolver + middlewares=rate,auth;2. K8s Middleware CRD:apiVersion=traefik.io/v1alpha1, kind=Middleware, spec.ratelimit.average=50;3. 组合链不超过 5 个,避免延迟;4. 回滚:providers.file.directory=/backup 热加载静态 YAML。

生产监控要点:启用 api.dashboard=true(保护 middlewares=auth),metrics.prometheus=true(端口 8082),暴露 traefik_entrypoint_requests_total、traefik_service_request_duration_seconds。日志:accesslog.filePath=/var/log/access.log, format=json。风险控制:Docker socket 挂载 :ro 只读,网络隔离 traefik-net;大规模(>1w 路由)调优 --serversTransport.insecureSkipVerify=false,避免 OOM 设置内存限 1GB。回滚策略:默认 fallback 到 file provider,保留上个配置 5min。

参数调优清单:

  • Docker: watch=true, constraints="Label(env,prod)", refreshSeconds=15
  • K8s: allowExternalNameServices=true, allowEmptyServices=false
  • TLS: domains[0].main=example.com, sans=*.example.com
  • RateLimit: average=200, burst=400, sources=["client"]
  • Auth: forwardauth.address=http://oauth:4180 (外部 OIDC)

Traefik GitHub 仓库指出,它支持 Docker/Swarm/Kubernetes 等 providers,并通过 labels 自动化路由。1 官方文档强调,证书存储需持久化 acme.json 以避 rate limits。2

查看归档