从 Ingress NGINX 迁移到 Traefik

适用场景

希望使用 Traefik 的自动服务发现、中间件链、Gateway API 或更简单的证书管理。迁移难点在注解语义、重写规则、限流和灰度配置。

前置条件

步骤

  1. 导出并梳理现有 Ingress:
kubectl get ingress -A -o yaml > ingress-all.yaml
grep -nE 'nginx.ingress.kubernetes.io|ingressClassName|host:|path:' ingress-all.yaml
  1. 安装 Traefik:
helm repo add traefik https://traefik.github.io/charts
helm install traefik traefik/traefik \
  --namespace traefik --create-namespace \
  --set ingressClass.enabled=true \
  --set ingressClass.name=traefik
kubectl -n traefik get svc
  1. 创建 IngressRoute:
kubectl apply -f - <<'EOF'
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: demo
  namespace: demo
spec:
  entryPoints: [websecure]
  routes:
  - match: Host(`demo.example.com`) && PathPrefix(`/api`)
    kind: Rule
    services:
    - name: api
      port: 8080
    middlewares:
    - name: strip-api
EOF
  1. 配置重写和限流中间件:
kubectl apply -f - <<'EOF'
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: strip-api
  namespace: demo
spec:
  stripPrefix:
    prefixes: ["/api"]
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: ratelimit
  namespace: demo
spec:
  rateLimit:
    average: 100
    burst: 50
EOF
  1. 配置 TLS:
kubectl -n demo create secret tls demo-tls --cert=fullchain.pem --key=privkey.pem
  1. 测试新入口:
curl -k --resolve demo.example.com:443:$TRAEFIK_IP https://demo.example.com/api/health

验证

回滚

常见坑

相关命令