Kubernetes Gateway API 替换 Ingress 时要核对哪些路由
来源:17golang原创
时间:2026-09-15 03:57:50 311浏览 收藏
Kubernetes Gateway API 替换 Ingress 时,最该核对的不是资源名称,而是每条请求最终会命中哪个 Listener、HTTPRoute 和 Service。Ingress 把入口和路由规则压在一个对象里;Gateway API 则把它拆成 GatewayClass、Gateway、HTTPRoute 等资源。迁移前应先逐条盘点域名、路径、后端端口、TLS 和注解,再检查新实现是否保留了原来的访问结果。
先建立“旧 host/path/backend → 新 listener/HTTPRoute/backendRefs”的映射表,再迁移。只要 hostname 没有交集、Route 没有成功附着,或注解行为没有替代方案,配置即使能通过 YAML 解析,也不代表请求会到达原来的 Service。
官方资料入口:https://kubernetes.io/docs/concepts/services-networking/gateway/
- 先核对入口和 Listener,再核对 HTTPRoute 的 hostname、path 与 backendRefs。
- Ingress 的 Prefix 大体对应 HTTPRoute 的 PathPrefix,但 ImplementationSpecific 不能直接照搬。
- 跨命名空间引用、TLS 证书和控制器注解都要单独验证,最后用状态条件和灰度请求验收。
先把每条 Ingress 规则拆成三列
迁移清单的第一列写原 Ingress 的 host 与 path,第二列写它实际依赖的入口和控制器,第三列写 Service 名称、端口以及是否经过重写、跳转、鉴权或限流。这样能把“看起来只是换 API”的工作,变成一组可验证的请求契约。
| Ingress 关注点 | Gateway API 对应位置 | 迁移时要确认 |
|---|---|---|
| class / 入口地址 | GatewayClass、Gateway | 控制器、外部 IP、端口和 Listener 是否由同一个团队维护 |
| host、TLS 域名 | Listener.hostname、HTTPRoute.hostnames、Listener TLS | 两处 hostname 是否相交,证书引用是否可读 |
| path、pathType | HTTPRoute.rules.matches.path | Exact、PathPrefix 和正则/实现特性是否等价 |
| service、port | HTTPRoute.backendRefs | Service 端口、协议、命名空间和权重是否一致 |

GatewayClass、Gateway 与 HTTPRoute 要先对上层级
Ingress 控制器通常隐含提供 HTTP/HTTPS 入口;Gateway API 要显式创建 Gateway,并在 Listener 中声明协议、端口、hostname 和允许附着的 Route 类型。GatewayClass 决定由哪个控制器管理 Gateway,Gateway 代表实际承接流量的入口,HTTPRoute.parentRefs 决定路由要挂到哪个 Gateway 或 Listener。
先确认这条链路:GatewayClass 的控制器存在且被接受,Gateway 的 Listener 已进入可编程状态,HTTPRoute 的 parentRefs 指向正确对象。Gateway 默认只接受同命名空间的 Route;如果旧 Ingress 由多个命名空间共同维护,必须重新设计 allowedRoutes,而不是只复制原来的 host。
最容易漏的是 hostname、path 和默认行为
Gateway Listener 与 HTTPRoute 都可能写 hostname。两者没有交集时,Route 不会被接受;通配符也有边界,例如 *.example.com 不等于裸域名 example.com。把原来散落在多份 Ingress 中的域名合并成一条 Route 时,还要检查不同 Route 之间是否出现重叠,避免请求被更具体的规则抢先匹配。
路径也不能只看字符串。Gateway API 的 Exact 是大小写敏感的精确匹配,PathPrefix 按路径元素匹配,/api 会匹配 /api/v2,但不会匹配 /apiv2。Ingress 的 Prefix 通常可以对应 PathPrefix;ImplementationSpecific 则必须查所选控制器的实现说明。还要专门测试 /、带尾斜杠路径、未匹配路径,以及原 Ingress 的默认后端行为。

跨命名空间、TLS 和注解不能按名称硬搬
如果 HTTPRoute 要引用另一个命名空间的 Service,backendRefs.namespace 之外还需要在被引用资源所在命名空间创建 ReferenceGrant。没有授权时,Route 的 ResolvedRefs 应显示为失败,不能把这类问题当作后端暂时不健康。Gateway 引用其他命名空间的 Secret 也适用同样的显式授权思路。
TLS 迁移要核对 Listener 的 HTTPS 协议、终止模式、证书 Secret、SNI 域名和 HTTP 到 HTTPS 的跳转。原 Ingress 注解中的 URL 重写、请求头修改、灰度权重、鉴权、限流或 body 大小限制,不一定都有相同的核心字段;应逐条标记为 Gateway API 核心能力、扩展能力或控制器私有策略,并在选型文档里记录缺口。
用状态条件和灰度流量完成迁移验收
新对象部署后,先看 GatewayClass、Gateway 和 HTTPRoute 的状态条件,再发真实的 Host、路径、协议和异常请求。至少覆盖每个域名的首页、最具体路径、未匹配路径、HTTP/HTTPS、证书错误、后端不存在和跨命名空间引用失败场景。只有当日志中的 upstream、状态码和延迟与旧入口基线相符,才适合切换 DNS、LoadBalancer 地址或上游反向代理。
迁移最好保持一段时间的双轨运行:旧 Ingress 保留回退能力,新 Gateway 使用独立入口接收灰度流量。回退开关应明确写进发布流程,尤其是证书续期、重写规则和鉴权策略未完成时,不要因为 Gateway 对象显示 Programmed=True 就认定业务路由完全等价。
常见问题
Gateway API 能把 Ingress YAML 直接改名吗?
不能。Gateway API 是 Ingress 的后继 API,但资源模型、入口归属和 Route 附着方式不同,需要一次转换并重新验证实现特性。
HTTPRoute 的 hostnames 一定要写吗?
不一定。省略时可由路由规则匹配更广的流量,但仍受 Listener 的 hostname 和附着条件限制;生产迁移通常应明确写出业务域名。
为什么 Route 已创建却没有流量?
优先检查 parentRefs、Listener 的 allowedRoutes、hostname 是否相交,以及后端引用的 ResolvedRefs。跨命名空间时再检查 ReferenceGrant。
真正的迁移完成标准,是同一组请求在新旧入口上得到一致的路由、TLS 和错误处理结果,而不是新资源已经成功提交。把这份逐条清单保留下来,后续更换 Gateway 控制器时仍可复用。
-
214 收藏
-
Golang · Go教程 | 3个月前 | 性能优化 · kubernetes · Go教程 · 生产实践 · Go1.25 · golang Go Kubernetes 性能优化 GOMAXPROCS473 收藏
-
Golang · Go教程 | 1个月前 | 容器 · go · 性能 · kubernetes · 运行时 · Kubernetes GOMAXPROCS cgroup Go 1.25 容器 CPU 限额438 收藏
-
318 收藏
-
353 收藏
-
400 收藏
-
344 收藏
-
272 收藏
-
430 收藏
-
493 收藏
-
446 收藏
-
226 收藏
-
241 收藏
-
146 收藏
-
科技周边 · 业界新闻 | 13小时前 | 云原生 · 调度器 · kubernetes · 资源调节 · Kubernetes v1.37 调度器抢占 InPlacePodVerticalScaling Pod resize122 收藏
-
科技周边 · 业界新闻 | 15小时前 | kubernetes · Gateway API · TCPRoute · 云原生网络 · 入口迁移 · Gateway API v1.6 TCPRoute v1迁移 Gateway入口规则评估219 收藏
-
科技周边 · 业界新闻 | 16小时前 | 云原生 · kubernetes · job · successPolicy · Kubernetes v1.37 Job successPolicy Indexed Job succeededIndexes succeededCount271 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习