Hotdry.
systems-engineering

Traefik 云原生代理:动态多协议路由与 K8s 服务发现零停机负载均衡

Traefik 在 Kubernetes 中通过 CRD 实现 HTTP/TCP/UDP/gRPC 动态多协议路由,支持服务发现与零停机负载均衡的关键工程参数。

在云原生时代,Kubernetes 集群中服务动态伸缩频繁,传统静态代理难以应对。Traefik 作为云原生边缘路由器,通过监听 K8s API 实现自动服务发现与热更新配置,支持 HTTP/TCP/UDP/gRPC 多协议路由,确保零停机负载均衡。本文聚焦 Traefik 在 K8s 中的动态多协议代理实践,给出可落地配置参数与监控清单。

Traefik 动态配置核心机制

Traefik 的静态配置定义入口点(EntryPoints)和提供者(Providers),动态配置则通过 K8s CRD(如 IngressRoute)实时生成路由。启用 K8s CRD Provider:

# traefik.yaml (静态配置)
providers:
  kubernetesCRD:
    enabled: true
entryPoints:
  web:
    address: ":80"
  websecure:
    address: ":443"

Traefik 监听 K8s API,当 Pod/Service 变化时,秒级热更新路由,无需重启 Pod。官方文档指出:“Traefik listens to your service registry/orchestrator API and instantly generates the routes。” 这避免了 Nginx 等需 reload 的中断风险。

多协议路由配置实践

Traefik 原生支持 L7 HTTP/gRPC 与 L4 TCP/UDP,统一通过 CRD 配置。

1. HTTP 路由(含 gRPC-Web)

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: http-app
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`api.example.com`) && PathPrefix(`/v1/`)
      kind: Rule
      services:
        - name: http-svc
          port: 80
  tls:
    secretName: tls-secret

gRPC 通过 HTTP/2 自动支持,添加 grpcweb 中间件处理浏览器调用。

2. TCP 路由(如 MySQL 代理)

apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
  name: mysql-tcp
spec:
  entryPoints:
    - mysql-ep  # 自定义 3306 入口
  routes:
    - match: HostSNI(`db.example.com`)
      services:
        - name: mysql-svc
          port: 3306

定义入口:entryPoints.mysql-ep.address: ":3306"

3. UDP 路由(如 DNS)

apiVersion: traefik.io/v1alpha1
kind: IngressRouteUDP
metadata:
  name: dns-udp
spec:
  entryPoints:
    - dns-ep  # 53/UDP
  routes:
    - services:
        - name: dns-svc
          port: 53

4. gRPC 专用路由

gRPC 用 TCP Router + TLS Passthrough:

apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
spec:
  routes:
    - match: HostSNI(`grpc.example.com`)
      services:
        - name: grpc-svc
          port: 50051
  tls:
    passthrough: true  # 直通后端 TLS

这些配置支持服务发现:Traefik 自动跟踪 Endpoint 变化,实现健康路由。

K8s 服务发现与零停机负载均衡

Traefik 通过 kubernetesCRDkubernetesIngress Provider 监听 Service/Endpoint,实现服务发现。负载均衡算法包括:

  • WRR (Weighted Round Robin):默认,加权轮询。
  • DRR (Dynamic Round Robin):动态调整故障节点权重。

配置负载均衡参数(ServersTransport):

apiVersion: traefik.io/v1alpha1
kind: ServersTransport
metadata:
  name: lb-transport
spec:
  serverName: backend.example.com
  disableHTTP2: false  # 启用 HTTP/2/gRPC
  responseForwarding:
    flushInterval: 100ms  # 流式响应优化
  loadBalancer:
    serversTransport:
      healthCheck: true
      healthCheckPath: /healthz
      healthCheckInterval: 30s
      healthCheckTimeout: 3s
  retryAttempts: 3
  retryUpDelay: 100ms

零停机关键:no restarts! 配置变更热加载,结合 ReadinessProbe 确保优雅切换。Circuit Breaker 默认阈值:连续失败 20%,延迟 >1s。

落地清单:

  1. 部署:Helm helm install traefik traefik/traefik --values values.yaml
  2. RBAC:ClusterRole 绑定 traefik.io:web,traefik.io:udp
  3. 参数调优
    参数 推荐值 作用
    idleConnTimeout 180s 长连接保持
    respondingTimeouts.readTimeout 3600s gRPC 长流超时
    maxIdleConnsPerHost 200 连接池
    circuitBreaker.expression Latency>1000ms && ErrorRatio>30% 熔断
  4. 回滚:使用 priority 字段渐进替换旧路由。

监控与风险控制

暴露 Metrics:

--metrics.prometheus=true
--metrics.prometheus.entrypoint=traefik-metrics

Prometheus 采集:traefik_entrypoint_requests_total{status_code=~"5xx"} 监控错误率。

风险:

  • 内存:>10k 路由监控 RSS <2GB。
  • 配置冲突:使用 rule 优先级避免。

Grafana Dashboard:路由健康、LB 延迟 P99 <50ms。

Traefik 通过动态多协议代理,完美适配 K8s 零停机场景。实践证明,结合上述参数,可将部署中断降至 0。

资料来源

查看归档