共计 2845 个字符,预计需要花费 8 分钟才能阅读完成。
背景痛点
在 Kubernetes 集群中,入口网关的选择至关重要。传统方式如裸奔 Nginx 虽然直观,但在 K8s 环境下会面临诸多挑战:

- 配置维护成本高:每次服务变更都需要手动修改 Nginx 配置并 reload
- 动态服务发现缺失:无法自动感知 K8s Service/Pod 的扩缩容
- 功能扩展困难:需要自行实现证书管理、流量分割等高级功能
相比之下,Traefik 作为云原生边缘路由器具有显著优势:
- 自动服务发现:实时监控 K8s API 获取服务变化
- 声明式配置:通过 CRD 定义路由规则,与 GitOps 工作流完美契合
- 内置中间件:开箱即用的重试、限流、熔断等能力
核心概念
Traefik 的核心架构遵循三层模型(可通过 mermaid 图解说明):
graph LR
A[Router] --> B[Middleware]
B --> C[Service]
- Router:定义流量匹配规则(host/path/headers 等)
- Middleware:处理请求 / 响应的中间件链(如认证、限流)
- Service:实际处理请求的后端服务(K8s Service)
实战演示
Helm 安装 Traefik
以下 values.yaml 包含关键配置说明:
# values.yaml
deployment:
replicas: 2 # 高可用部署
ports:
web:
redirectTo: websecure # HTTP 自动跳转 HTTPS
websecure:
tls:
enabled: true
providers:
kubernetesCRD:
enabled: true # 必须开启 CRD 支持
additionalArguments:
- --entryPoints.web.http.redirections.entryPoint.to=:443
- --certificatesresolvers.le.acme.email=your@email.com
- --certificatesresolvers.le.acme.storage=/data/acme.json
- --certificatesresolvers.le.acme.httpChallenge.entryPoint=web
安装命令:
helm upgrade --install traefik traefik/traefik -n kube-system -f values.yaml
IngressRoute 配置示例
实现基于路径的路由分发:
# ingressroute.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: app-routes
spec:
entryPoints:
- websecure
routes:
- match: PathPrefix(`/api`)
kind: Rule
services:
- name: api-service
port: 8000
middlewares:
- name: rate-limit
- match: PathPrefix(`/static`)
kind: Rule
services:
- name: frontend-service
port: 80
tls:
certResolver: le # 使用 Let's Encrypt 自动证书
自动证书配置
创建 ClusterIssuer 资源:
# clusterissuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: your@email.com
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod-account-key
solvers:
- http01:
ingress:
class: traefik
高阶技巧
API 限流实现
创建 RateLimit 中间件:
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: rate-limit
spec:
rateLimit:
average: 100 # 每秒请求数
burst: 50 # 突发流量阈值
Dashboard 基础认证
- 生成密码文件:
htpasswd -c ./auth admin
- 创建 Secret 和 Middleware:
apiVersion: v1
kind: Secret
metadata:
name: traefik-dashboard-auth
type: kubernetes.io/basic-auth
data:
password: <base64 编码密码 >
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: auth-dashboard
spec:
basicAuth:
secret: traefik-dashboard-auth
避坑指南
ACME 证书申请问题
常见 HTTP01 挑战失败原因:
- 防火墙阻止了
.well-known/acme-challenge/路径访问 - Traefik 版本与 cert-manager 不兼容
- 证书解析器 (le) 配置未全局生效
解决方案:
- 使用 kubectl describe challenge 查看详细错误
- 确保 ingressClass 与 traefik 的 –providers.kubernetesingress.ingressclass 参数一致
路由规则丢失
当 Traefik Pod 重启时,内存中的动态配置可能丢失。解决方法:
- 启用持久化存储(通过 –providers.file.directory 参数)
- 将关键配置通过 ConfigMap 挂载
性能调优
生产环境推荐参数:
additionalArguments:
- --serversTransport.maxIdleConnsPerHost=10
- --entryPoints.websecure.http.transport.respondingTimeouts.idleTimeout=90s
- --api.insecure=false # 务必关闭不安全 API
传统 Ingress vs IngressRoute
| 特性 | Ingress | IngressRoute |
|---|---|---|
| 配置灵活性 | 低 | 高(支持复杂路由) |
| TLS 管理 | 需手动配置 | 支持自动证书 |
| 中间件支持 | 无 | 内置支持 |
| 可观测性 | 基础 | 集成 Dashboard |
下一步学习
- 通过 Header/Cookie 实现 Canary 发布
- 集成 OpenTelemetry 实现分布式追踪
- 配置 TCP 路由支持数据库暴露
- 研究 Traefik Pilot 的云监控功能
建议实操路线:从单服务路由开始,逐步添加中间件,最后实现全站 HTTPS 与监控集成。遇到问题时多查阅 Traefik 官方文档的 Middlewares 章节,其中包含每个参数的详细说明。
正文完
发表至: 云原生技术
近三天内
