
如果你最近在维护 Kubernetes 集群可能已经注意到一个趋势社区里关于 Ingress Nginx 的讨论正在悄悄转向 Gateway API。很多人第一次看到这个变化时第一反应是“是不是又要学一套新东西”第二反应是“我现有的 Ingress 配置还能用吗”其实这个转变背后并不是简单的技术迭代而是 Kubernetes 网络模型从“够用”到“好用”的一次关键升级。Ingress Nginx 确实不会一夜之间消失但如果你已经开始遇到多团队共享集群、需要做蓝绿发布、或者被各种 Annotation 搞得头大那么了解 Gateway API 就不是一个可选动作而是一个迟早要面对的工程决策。我最近在帮一个中型团队做集群网络升级时就亲身体验了从 Ingress Nginx 迁移到 Gateway API 的完整过程。最大的感受是Gateway API 真正解决的并不是“路由能不能通”的问题而是“路由规则怎么才能清晰、可维护、可扩展”的问题。下面我就结合这次实战把迁移的关键判断、具体步骤和长期价值一次性讲清楚。1. 先搞清楚Ingress Nginx 不是“不能用”而是“不够用”在决定是否迁移之前我们需要先客观理解 Ingress Nginx 的现状。很多人看到“停止维护”这个词会紧张但实际情况是Ingress Nginx 目前仍然处于维护模式只是功能开发已经冻结。这意味着安全补丁和关键 Bug 修复还会继续但不会再增加新特性。这个状态其实反映了一个更底层的事实Kubernetes 社区已经将网络创新的重心完全转移到了 Gateway API 上。如果你当前的业务场景满足以下特征那么继续使用 Ingress Nginx 短期内是完全可行的只有 HTTP/HTTPS 流量需要路由路由规则相对固定很少需要动态调整不需要复杂的流量切分如金丝雀发布、蓝绿部署集群规模较小没有多团队共享路由配置的需求但一旦你的场景开始涉及以下任何一点Ingress Nginx 的局限性就会变得明显1.1 Annotation 堆砌成了配置的“技术债”Ingress Nginx 通过 Annotation 扩展功能的设计在早期确实灵活但随着业务复杂度的提升很容易变成这样apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/ssl-redirect: true nginx.ingress.kubernetes.io/force-ssl-redirect: true nginx.ingress.kubernetes.io/proxy-connect-timeout: 30 nginx.ingress.kubernetes.io/proxy-read-timeout: 180 # ... 更多 Annotation这种配置方式有三个潜在问题可移植性差这些 Annotation 是 Nginx 特有的如果将来想换其他 Ingress Controller配置几乎要重写可读性低重要的路由逻辑分散在 Annotation 和 Spec 之间新人上手成本高验证困难Kubernetes API Server 无法验证 Annotation 的正确性只能在运行时才发现配置错误1.2 高级流量管理需要“打补丁”比如要实现金丝雀发布在 Ingress Nginx 中需要这样配置apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: canary-demo annotations: nginx.ingress.kubernetes.io/canary: true nginx.ingress.kubernetes.io/canary-weight: 20这种方式虽然能工作但存在几个问题需要创建两个独立的 Ingress 资源一个正式版一个金丝雀版权重调整需要修改 Annotation 并重新应用配置缺乏更细粒度的控制如基于 Header 的流量切分需要更多复杂配置1.3 多协议支持有限Ingress 标准最初是为 HTTP 设计的虽然通过一些扩展可以支持 TCP/UDP但配置方式不够直观# 需要修改 ConfigMap 来配置 TCP 转发 apiVersion: v1 kind: ConfigMap metadata: name: tcp-services data: 9000: default/example-service:9000这种配置脱离了标准的 Ingress 资源定义增加了维护复杂度。2. Gateway API 的核心价值把网络配置从“黑盒”变成“白盒”Gateway API 的设计哲学与 Ingress 有本质区别。它不是简单地在现有模型上增加功能而是重新思考了在 Kubernetes 中管理流量的正确抽象层级。2.1 角色分离让合适的人做合适的事这是 Gateway API 最核心的改进。在传统 Ingress 中基础设施团队和应用开发团队往往需要操作同一个 Ingress 资源导致权限边界模糊。Gateway API 通过三种核心资源明确了职责划分# GatewayClass基础设施团队定义可用的网关类型 apiVersion: gateway.networking.k8s.io/v1 kind: GatewayClass metadata: name: company-gateway spec: controllerName: example.com/gateway-controller description: Standard company gateway with TLS termination --- # Gateway集群管理员创建具体的网关实例 apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: production-gateway spec: gatewayClassName: company-gateway listeners: - name: https port: 443 protocol: HTTPS hostname: *.example.com tls: mode: Terminate certificateRefs: - name: wildcard-cert --- # HTTPRoute应用开发者定义自己的路由规则 apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: app-route spec: parentRefs: - name: production-gateway hostnames: - app.example.com rules: - matches: - path: value: /api backendRefs: - name: api-service port: 8080这种分离带来的实际好处是基础设施团队可以控制网关的全局策略如 TLS 版本、安全头等集群管理员可以管理网关实例的规模和可用性应用开发者可以自主管理自己的路由规则无需申请网关修改权限2.2 声明式流量管理配置即意图Gateway API 将常见的流量管理模式直接内建到 API 中而不是通过扩展实现。比如金丝雀发布apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: canary-route spec: parentRefs: - name: production-gateway hostnames: - app.example.com rules: - matches: - headers: - name: canary value: true filters: - type: RequestHeaderModifier requestHeaderModifier: set: - name: X-Traffic-Type value: canary backendRefs: - name: canary-service port: 8080 weight: 20 - backendRefs: - name: primary-service port: 8080 weight: 80这种配置方式更加直观权重配置是路由规则的一部分不需要额外的 Annotation可以基于 Header、Cookie 等条件进行精细化的流量控制配置结构清晰易于理解和维护2.3 多协议原生支持Gateway API 从设计之初就考虑了多协议支持不同协议有对应的 Route 资源# TCPRoute apiVersion: gateway.networking.k8s.io/v1 kind: TCPRoute metadata: name: tcp-app spec: parentRefs: - name: production-gateway rules: - backendRefs: - name: tcp-service port: 9000 # GRPCRoute apiVersion: gateway.networking.k8s.io/v1 kind: GRPCRoute metadata: name: grpc-app spec: parentRefs: - name: production-gateway rules: - matches: - method: service: echo.EchoService method: Echo backendRefs: - name: grpc-service port: 50051这种统一的设计让不同协议的配置方式保持一致降低了学习成本。3. 迁移实战从 Ingress Nginx 到 NGINX Gateway Fabric了解了 Gateway API 的设计优势后我们来看具体的迁移步骤。我选择的是 NGINX 官方推出的 NGINX Gateway Fabric这是目前最成熟的 Gateway API 实现之一。3.1 环境准备和安装首先确保你的 Kubernetes 集群版本在 1.23 以上这是 Gateway API CRD 的最低要求。# 安装 Gateway API CRD kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/standard-install.yaml # 安装 NGINX Gateway Fabric kubectl apply -f https://github.com/nginxinc/nginx-gateway-fabric/releases/download/v1.0.0/nginx-gateway-fabric.yaml安装完成后验证组件状态kubectl get pods -n nginx-gateway # 应该看到 nginx-gateway-fabric 的 Pod 运行中 kubectl get gatewayclass # 应该看到 nginx 的 GatewayClass3.2 迁移策略渐进式而不是一刀切迁移的关键是要确保业务连续性。我推荐采用渐进式迁移策略阶段一并行运行保持现有的 Ingress Nginx 继续服务生产流量在新的命名空间中部署 Gateway API 资源进行测试通过测试域名验证 Gateway API 的功能阶段二流量切分配置 DNS将部分测试流量指向 Gateway API监控指标确认 Gateway API 的表现符合预期逐步增加流量比例同时保持快速回滚能力阶段三完全迁移100% 流量切换到 Gateway API保留 Ingress Nginx 配置一段时间作为备份确认稳定后清理旧资源3.3 配置转换示例下面是一个具体的 Ingress 配置到 Gateway API 的转换示例原来的 Ingress 配置apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-app annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 nginx.ingress.kubernetes.io/ssl-redirect: true spec: tls: - hosts: - app.example.com secretName: tls-secret rules: - host: app.example.com http: paths: - path: /api(/|$)(.*) pathType: Prefix backend: service: name: api-service port: number: 8080 - path: / pathType: Prefix backend: service: name: web-service port: number: 80转换后的 Gateway API 配置# Gateway 资源基础设施团队管理 apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: company-gateway spec: gatewayClassName: nginx listeners: - name: https port: 443 protocol: HTTPS hostname: app.example.com tls: mode: Terminate certificateRefs: - name: tls-secret --- # HTTPRoute 资源应用团队管理 apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: web-app-route spec: parentRefs: - name: company-gateway hostnames: - app.example.com rules: - matches: - path: type: PathPrefix value: /api filters: - type: URLRewrite urlRewrite: path: type: ReplacePrefixMatch replacePrefixMatch: / backendRefs: - name: api-service port: 8080 - matches: - path: type: PathPrefix value: / backendRefs: - name: web-service port: 80可以看到Gateway API 的配置更加结构化TLS 配置集中在 Gateway 资源中便于统一管理路径重写使用明确的 Filter 类型而不是神秘的 rewrite-target 语法配置更加自描述新人更容易理解3.4 高级功能迁移对于复杂的 Ingress 配置迁移时需要特别注意基于 Header 的路由# Ingress 方式通过 Annotation nginx.ingress.kubernetes.io/canary-by-header: X-Canary nginx.ingress.kubernetes.io/canary-by-header-value: true # Gateway API 方式原生支持 rules: - matches: - headers: - name: X-Canary value: true backendRefs: - name: canary-service port: 8080超时配置# Ingress 方式通过 Annotation nginx.ingress.kubernetes.io/proxy-connect-timeout: 30s nginx.ingress.kubernetes.io/proxy-read-timeout: 180s # Gateway API 方式通过 Policy 附件 apiVersion: gateway.networking.k8s.io/v1alpha2 kind: TimeoutPolicy metadata: name: api-timeout spec: targetRef: group: gateway.networking.k8s.io kind: HTTPRoute name: web-app-route connectTimeout: 30s requestTimeout: 180s4. 迁移后的运维考量新能力带来新责任迁移到 Gateway API 后运维模式也会发生一些变化。这些变化大部分是正向的但需要提前做好准备。4.1 监控和可观测性NGINX Gateway Fabric 提供了丰富的指标可以通过 ServiceMonitor 集成到 Prometheus 中apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: nginx-gateway-monitor spec: selector: matchLabels: app: nginx-gateway-fabric endpoints: - port: metrics interval: 30s关键监控指标包括网关请求量和错误率后端服务的响应时间和错误率TLS 连接状态缓存命中率4.2 安全策略Gateway API 支持通过 Policy 附件实现细粒度的安全控制apiVersion: gateway.networking.k8s.io/v1alpha2 kind: ClientIPPolicy metadata: name: api-whitelist spec: targetRef: group: gateway.networking.k8s.io kind: HTTPRoute name: web-app-route clientIPs: sources: - 192.168.0.0/244.3 性能调优根据流量模式调整网关的资源配置apiVersion: apps/v1 kind: Deployment metadata: name: nginx-gateway-fabric spec: template: spec: containers: - name: nginx resources: requests: memory: 512Mi cpu: 500m limits: memory: 1Gi cpu: 1000m args: - --max-connections10000 - --worker-processes44.4 故障排查指南迁移后遇到问题时可以按以下顺序排查检查 GatewayClass 状态kubectl get gatewayclass kubectl describe gatewayclass nginx检查 Gateway 状态kubectl get gateway kubectl describe gateway company-gateway检查 HTTPRoute 状态kubectl get httproutes kubectl describe httproutes web-app-route查看 NGINX Gateway Fabric 日志kubectl logs -n nginx-gateway deployment/nginx-gateway-fabric验证网络连通性# 从集群内测试后端服务 kubectl run test-pod --imagebusybox --rm -it -- sh wget http://api-service:8080/health5. 长期价值为什么说这次迁移值得投入回到最初的问题为什么要从稳定可用的 Ingress Nginx 迁移到相对复杂的 Gateway API答案不在于短期功能差异而在于长期的可维护性和扩展性。5.1 标准化带来的生态优势Gateway API 是 Kubernetes 社区主导的标准这意味着不同厂商的实现可以互换避免供应商锁定工具链如 CI/CD、监控、安全扫描会逐步统一支持社区最佳实践和故障排查经验更容易共享5.2 面向未来的架构准备随着服务网格Service Mesh的普及东西向流量管理变得越来越重要。Gateway API 的设计天然支持与服务网格集成为未来的架构演进预留了空间。5.3 团队协作效率提升角色分离的设计让不同团队可以专注于自己擅长的领域基础设施团队可以专注于网关的稳定性、性能和安全性应用团队可以自主管理路由规则加快迭代速度SRE 团队可以基于标准化的指标建立统一的监控体系5.4 迁移决策框架如果你还在犹豫是否要迁移可以用这个框架来评估评估维度建议继续使用 Ingress Nginx建议迁移到 Gateway API团队规模小团队 10人中大型团队或多团队协作业务复杂度简单 HTTP 路由需要高级流量管理、多协议支持变更频率路由配置很少变更需要频繁调整路由规则技能储备团队熟悉 Ingress 但不熟悉新标准团队愿意学习新技术标准长期规划近期无架构演进计划计划引入服务网格等新技术从我实际迁移的经验来看最大的阻力往往不是技术复杂度而是改变现有工作流的心理成本。但一旦完成迁移配置的清晰度和可维护性提升是实实在在的。迁移到 Gateway API 不是一个简单的技术替换而是一次架构理念的升级。它让你从“让流量通”进化到“让流量管理变得清晰、可控、可扩展”。如果你现在的集群已经开始出现配置复杂、团队协作效率低下、或者高级功能需求无法满足的情况那么这次迁移投入的时间在未来会以更低的维护成本和更高的开发效率回报给你。最关键的是开始行动先在一个非关键业务上尝试积累经验建立信心然后逐步推广到整个集群。这样既控制了风险又能让团队平滑地过渡到新的网络管理模式。