K8s Gateway API与现有Ingress控制器如何实现平滑迁移?

7 阅读4分钟

要实现Gateway API与传统Ingress控制器的平滑迁移,需遵循 “兼容共存、逐步切换、最小化风险” 的原则,核心步骤包括环境准备、配置转换、测试验证、流量灰度切换。以下是具体迁移方案及关键注意事项:

一、平滑迁移的核心方案

1. 环境准备:安装Gateway API及控制器

  • 安装Gateway API CRDs:通过官方脚本安装最新稳定版的Gateway API CRDs(如v1.4.1),确保集群支持GatewayHTTPRoute等资源。

    kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.4.1/standard-install.yaml
    
  • 部署Gateway控制器:选择主流的Gateway API实现(如Envoy GatewayNginx Gateway Fabric),通过Helm或YAML部署。例如,部署Envoy Gateway:

    helm install eg oci://ghcr.io/envoyproxy/gateway-helm \
      --namespace envoy-gateway-system \
      --create-namespace
    

2. 配置转换:从Ingress到Gateway API

使用**ingress2gateway工具**(Kubernetes SIG-NETWORK社区提供)自动转换现有Ingress资源为Gateway API格式(如GatewayHTTPRoute)。该工具支持Nginx、Traefik等主流Ingress控制器的配置转换。

  • 步骤

    1. 导出现有Ingress资源:kubectl get ingress -A -o yaml > ingresses.yaml
    2. 运行转换工具:ingress2gateway --input ingresses.yaml --output gateway-api.yaml
    3. 手动调整:对于ingress2gateway无法处理的自定义注解(如Nginx的nginx.ingress.kubernetes.io/rewrite-target),需转换为Gateway API的标准配置(如HTTPRouteurlRewrite过滤器)。

3. 测试验证:确保配置正确性

  • 部署Gateway API资源:将转换后的gateway-api.yaml应用到集群,验证GatewayHTTPRoute的状态:

    kubectl apply -f gateway-api.yaml
    kubectl get gateways -A  # 检查Gateway是否就绪
    kubectl get httproutes -A  # 检查HTTPRoute是否关联成功
    
  • 流量测试:通过curl或浏览器访问Gateway的外部IP,验证路由规则是否正确(如路径匹配、TLS终止)。例如,若HTTPRoute配置了path: /api,则访问http://<gateway-ip>/api应转发至目标服务。

4. 流量切换:灰度迁移

为避免业务中断,采用灰度切流方式逐步将流量从Ingress控制器切换至Gateway API:

  • 方案1:复用现有SLB:若集群使用云厂商的SLB(如阿里云SLB),可将Gateway API的节点添加至现有SLB的虚拟服务器组,通过调整权重(如Gateway占10%、Ingress占90%)逐步切换流量。
  • 方案2:DNS权重解析:在DNS服务商(如阿里云DNS)中为业务域名添加Gateway API的SLB地址,设置权重(如Gateway占10%),逐步增加权重至100%。

二、迁移过程中的关键注意事项

1. 自定义注解的兼容性处理

传统Ingress依赖注解(如Nginx的nginx.ingress.kubernetes.io/rewrite-target)实现高级功能,而Gateway API通过结构化配置(如HTTPRoutefilters)替代注解。迁移时需注意:

  • 可自动转换的注解ingress2gateway工具可处理大部分常见注解(如rewrite-targeturlRewritetimeouttimeout);
  • 无法自动转换的注解:需手动调整,例如Nginx的nginx.ingress.kubernetes.io/load-balance需转换为Gateway API的backendRefs权重配置。

2. TLS配置的迁移

Ingress的TLS配置(如tls.secretName)需转换为Gateway API的Gateway资源的listeners.tls配置。例如:

  • Ingress的TLS配置:

    spec:
      tls:
      - secretName: example-com-tls
    
  • 转换为Gateway API的Gateway配置:

    spec:
      listeners:
      - name: https
        protocol: HTTPS
        port: 443
        tls:
          mode: Terminate
          certificateRefs:
          - kind: Secret
            name: example-com-tls
    

3. 跨命名空间路由的处理

Gateway API默认禁止跨命名空间路由,需通过ReferenceGrant资源授权。例如,若HTTPRouteapp命名空间,需Gatewaygateway命名空间,则需创建:

apiVersion: gateway.networking.k8s.io/v1alpha2
kind: ReferenceGrant
metadata:
  name: allow-cross-namespace
  namespace: gateway  # Gateway所在命名空间
spec:
  from:
  - group: gateway.networking.k8s.io
    kind: HTTPRoute
    namespace: app  # HTTPRoute所在命名空间
  to:
  - group: ""
    kind: Service

4. 监控与回滚

  • 监控:迁移过程中需监控Gateway API的指标(如请求量、错误率),可使用Prometheus+Grafana或云厂商的监控服务(如阿里云ARMS);
  • 回滚:若发现问题,可通过调整SLB权重或DNS解析快速回滚至Ingress控制器,确保业务连续性。

三、总结

Gateway API与传统Ingress的平滑迁移需遵循 “兼容共存、逐步切换” 的原则,核心步骤包括环境准备、配置转换、测试验证、流量灰度切换。迁移过程中需注意自定义注解的兼容性、TLS配置、跨命名空间路由等关键问题,并通过监控与回滚确保业务稳定性。对于企业用户,建议优先选择云厂商提供的迁移工具(如阿里云MSE Ingress),以降低迁移成本与风险。