从 Ingress NGINX Controller 迁移到 Traefik
如何以零停机时间从 Ingress NGINX Controller 迁移到 Traefik
Ingress NGINX Controller 退役公告
Kubernetes Ingress NGINX Controller 项目已宣布将于 2026 年 3 月 退役。到该日期后:
- 不再有新版本或更新
- 不再有安全补丁
- 不再有错误修复
更多信息,请参阅 Kubernetes 官方博客公告。
你将达成的目标
完成此迁移后,你现有的 Ingress 资源将在 Traefik 中工作,无需任何修改。Traefik Kubernetes Ingress NGINX Provider 会自动将 NGINX annotations 翻译为 Traefik 配置:
你现有的 Ingress(无需更改)
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp
annotations:
# 这些 NGINX annotations 由 Traefik 自动翻译
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "https://example.com"
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "route"
spec:
ingressClassName: nginx # ← Traefik 将监听此 ingressClass
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp
port:
number: 80迁移步骤
第 1 步:评估当前使用情况
- 列出所有使用 NGINX annotations 的 Ingress
- 识别非标准 NGINX annotations(可能在 Traefik 中不支持)
- 识别使用 NGINX 特定功能(如
snippet、server-snippet)的 Ingress
第 2 步:测试环境验证
bash
# 1. 在测试集群中安装 Traefik with Ingress NGINX Provider enabled
helm install traefik traefik/traefik \
--set providers.kubernetesIngressNGINX.enabled=true
# 2. 部署一个测试 Ingress
kubectl apply -f my-test-ingress.yaml
# 3. 验证 Traefik 行为是否与 NGINX 一致
curl -H "Host: myapp.example.com" http://traefik-ip/
# 4. 测试关键功能
# - TLS 终止
# - 路径路由
# - 限流
# - 认证第 3 步:生产环境并排运行
bash
# 1. 在与 NGINX 不同的 ingressClass 上安装 Traefik
# 2. 在生产流量的一小部分测试 Traefik
# 3. 监控关键指标第 4 步:完全切换
bash
# 1. 关闭 NGINX Ingress Controller
# 2. 保持 Traefik 运行
# 3. 验证所有路由正常工作第 5 步:后续优化(可选)
迁移到 Traefik 自己的 CRD 或 Gateway API:
yaml
# CRD 方式
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: myapp
spec:
entryPoints:
- websecure
routes:
- match: Host(`myapp.example.com`)
kind: Rule
services:
- name: myapp
port: 80
tls:
certResolver: letsencryptyaml
# Gateway API 方式
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: myapp
spec:
parentRefs:
- name: traefik-gateway
hostnames:
- "myapp.example.com"
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: myapp
port: 80支持的 NGINX Annotations
支持的 annotations 包括但不限于:
| Annotation | 描述 |
|---|---|
nginx.ingress.kubernetes.io/rewrite-target | URL 重写目标 |
nginx.ingress.kubernetes.io/ssl-redirect | 重定向到 HTTPS |
nginx.ingress.kubernetes.io/force-ssl-redirect | 强制重定向到 HTTPS |
nginx.ingress.kubernetes.io/backend-protocol | 后端协议 |
nginx.ingress.kubernetes.io/cors-* | CORS 相关 |
nginx.ingress.kubernetes.io/limit-* | 限流相关 |
nginx.ingress.kubernetes.io/auth-* | 认证相关 |
nginx.ingress.kubernetes.io/canary-* | 金丝雀发布 |
nginx.ingress.kubernetes.io/upstream-* | 上游配置 |
不支持的 annotations(如 snippet)需要手动迁移到 Traefik 中间件。
常见问题
Q:是否需要更改 Ingress 资源?
A:不需要。Traefik 监听现有的 Ingress 资源,annotations 由 Traefik 自动翻译。
Q:是否需要更改服务?
A:不需要。服务保持不变,Traefik 仍然将流量路由到相同的服务。
Q:如何处理 NGINX 特定的功能(如 snippet)?
A:这些功能需要手动迁移到 Traefik 中间件。建议先在测试环境评估。
Q:迁移后是否需要回滚?
A:保留原 NGINX Ingress Controller 一段时间是好的,万一出现问题可以快速回滚。
在生产环境使用 Traefik OSS?
如果你在工作中使用 Traefik,可以考虑为其添加企业级 API 网关能力或获取 Traefik OSS 的商业支持。