在云原生时代,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 通过 kubernetesCRD 或 kubernetesIngress 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。
落地清单:
- 部署:Helm
helm install traefik traefik/traefik --values values.yaml。 - RBAC:ClusterRole 绑定
traefik.io:web,traefik.io:udp。 - 参数调优:
参数 推荐值 作用 idleConnTimeout180s 长连接保持 respondingTimeouts.readTimeout3600s gRPC 长流超时 maxIdleConnsPerHost200 连接池 circuitBreaker.expressionLatency>1000ms && ErrorRatio>30%熔断 - 回滚:使用
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。
资料来源:
- Traefik GitHub: https://github.com/traefik/traefik
- 官方文档: https://doc.traefik.io/traefik/providers/kubernetes-crd/
- HN 讨论: https://news.ycombinator.com/ (Traefik 相关线程)