要实现Gateway API与传统Ingress控制器的平滑迁移 ,需遵循 "兼容共存、逐步切换、最小化风险" 的原则,核心步骤包括环境准备、配置转换、测试验证、流量灰度切换。以下是具体迁移方案及关键注意事项:
一、平滑迁移的核心方案
1. 环境准备:安装Gateway API及控制器
-
安装Gateway API CRDs :通过官方脚本安装最新稳定版的Gateway API CRDs(如
v1.4.1),确保集群支持Gateway、HTTPRoute等资源。bashkubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.4.1/standard-install.yaml -
部署Gateway控制器 :选择主流的Gateway API实现(如Envoy Gateway 、Nginx Gateway Fabric),通过Helm或YAML部署。例如,部署Envoy Gateway:
arduinohelm 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格式(如Gateway、HTTPRoute)。该工具支持Nginx、Traefik等主流Ingress控制器的配置转换。
-
步骤:
- 导出现有Ingress资源:
kubectl get ingress -A -o yaml > ingresses.yaml; - 运行转换工具:
ingress2gateway --input ingresses.yaml --output gateway-api.yaml; - 手动调整:对于
ingress2gateway无法处理的自定义注解 (如Nginx的nginx.ingress.kubernetes.io/rewrite-target),需转换为Gateway API的标准配置(如HTTPRoute的urlRewrite过滤器)。
- 导出现有Ingress资源:
3. 测试验证:确保配置正确性
-
部署Gateway API资源 :将转换后的
gateway-api.yaml应用到集群,验证Gateway和HTTPRoute的状态:csharpkubectl 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通过结构化配置 (如HTTPRoute的filters)替代注解。迁移时需注意:
- 可自动转换的注解 :
ingress2gateway工具可处理大部分常见注解(如rewrite-target→urlRewrite、timeout→timeout); - 无法自动转换的注解 :需手动调整,例如Nginx的
nginx.ingress.kubernetes.io/load-balance需转换为Gateway API的backendRefs权重配置。
2. TLS配置的迁移
Ingress的TLS配置(如tls.secretName)需转换为Gateway API的Gateway资源的listeners.tls配置。例如:
-
Ingress的TLS配置:
yamlspec: tls: - secretName: example-com-tls -
转换为Gateway API的
Gateway配置:yamlspec: listeners: - name: https protocol: HTTPS port: 443 tls: mode: Terminate certificateRefs: - kind: Secret name: example-com-tls
3. 跨命名空间路由的处理
Gateway API默认禁止跨命名空间路由 ,需通过ReferenceGrant资源授权。例如,若HTTPRoute在app命名空间,需Gateway在gateway命名空间,则需创建:
yaml
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),以降低迁移成本与风险。