Skip to content

从 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 特定功能(如 snippetserver-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: letsencrypt
yaml
# 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-targetURL 重写目标
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 的商业支持。

基于 MIT 协议发布