从 Ingress NGINX 迁移到 Gateway API

适用场景

Ingress NGINX 的注解生态复杂,跨团队共享网关时权限边界模糊。Gateway API 用角色分离的 GatewayClass、Gateway、HTTPRoute 表达路由,适合平台团队统一管理入口。

前置条件

步骤

  1. 安装 Gateway API CRD 和所选实现(以 Envoy Gateway 为例):
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml
helm install eg oci://docker.io/envoyproxy/gateway-helm \
  --version v1.2.0 \
  --namespace envoy-gateway-system --create-namespace
  1. 创建 GatewayClass 和 Gateway:
kubectl apply -f - <<'EOF'
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: public
  namespace: demo
spec:
  gatewayClassName: eg
  listeners:
  - name: http
    protocol: HTTP
    port: 80
  - name: https
    protocol: HTTPS
    port: 443
    tls:
      mode: Terminate
      certificateRefs:
      - name: demo-tls
EOF
  1. 把 Ingress 路由翻译成 HTTPRoute:
kubectl apply -f - <<'EOF'
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: demo
  namespace: demo
spec:
  parentRefs:
  - name: public
  hostnames:
  - demo.example.com
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /api
    backendRefs:
    - name: api
      port: 8080
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: web
      port: 80
EOF
  1. 处理 Ingress 注解差异:
  1. 测试新网关地址。用 curl --resolve 或临时 hosts 验证,不要先改 DNS:
curl -k --resolve demo.example.com:443:$GW_IP https://demo.example.com/api/health
  1. 灰度切换:先切一个低风险域名,再逐步扩大。保留旧 Ingress 和 DNS 记录。

验证

回滚

常见坑

相关命令