Ingress-NGINX 迁移至 Gateway API:五个关键意外行为
概述
随着 Kubernetes 社区宣布将于 2026 年 3 月退役 ingress-nginx,迁移到更现代、标准化的 gateway-api 成为众多运维团队和 SRE 的首要任务。然而,ingress-nginx 长期广泛使用,其内部实现中存在许多非标准的默认行为和“副作用”。许多生产集群可能已经依赖于这些未文档化的行为,而在迁移过程中,如果只是简单地进行语法转换而不考虑这些特性,极易引发难以预料的服务中断。本文档梳理了五个常见的 ingress-nginx 意外行为,旨在帮助团队进行有意识的评估与规划,实现安全、平滑的迁移。
核心概念
- Ingress-NGINX: 由 Kubernetes 社区维护的 Ingress 控制器实现,使用 NGINX 作为数据平面。它通过一系列注解提供超出 Ingress API 标准的功能,例如路径重写、正则匹配等。其行为往往由这些注解隐式控制。
- Gateway API: Kubernetes 官方推出的下一代流量管理 API 标准。它旨在解决 Ingress API 的局限性,提供更丰富、更具表现力的模型来配置服务网格和负载均衡器。其设计更显式、标准化,减少了实现间的差异和隐式行为。
- 关键区别: Ingress-NGINX 倾向于“宽容”和“自动化”,会自动处理一些常见情况(如尾部斜杠重定向)。而 Gateway API 则遵循“显式优于隐式”原则,要求用户明确配置每一个期望的行为,从而提供更高的可预测性和控制力。
实践
以下是在将 Ingress-NGINX 迁移至 Gateway API 时,必须注意的五个关键行为及其应对策略:
1. 正则匹配是前缀匹配且大小写不敏感
行为:当在 Ingress 资源中启用正则匹配(nginx.ingress.kubernetes.io/use-regex: "true")时,ingress-nginx 的路径匹配并非标准的全正则匹配。它默认将正则表达式视为大小写不敏感的前缀。例如,正则 /[A-Z]{3} 会匹配任何以三个字母(无论大小写)开头的路径,如 /abc、/XYZ,而不仅仅是精确匹配 /ABC。
迁移风险:如果客户端或应用实际上依赖于这种宽松的前缀匹配,而迁移时简单地转换为 Gateway API 的 RegularExpression 类型,由于 Envoy 等主流实现默认进行大小写敏感的完整匹配,可能会导致原有匹配的请求返回 404。
Gateway API 实践:
- 保留行为:显式使用
RegularExpression类型,并调整正则模式以体现前缀和大小写不敏感的特性。path: type: RegularExpression value: "/[a-zA-Z]{3}.*" # 或使用 (?i) 标志,如 "(?i)/[a-z]{3}.*" - 纠正行为:如果希望精确匹配,应使用
Exact或Prefix类型,并修正正则逻辑。
2. use-regex 注解影响主机的所有 Ingress 路径
行为:nginx.ingress.kubernetes.io/use-regex: "true" 注解的作用范围不仅仅是添加它的单个 Ingress 资源。它会导致 Ingress-NGINX 控制器将同一主机(Host)下所有 Ingress 资源的所有路径都视为正则表达式模式进行匹配。因此,一个标注了此注解的 Ingress 会影响该主机下其他 Ingress 的路径匹配行为。
迁移风险:在迁移时,如果只关注了单个 Ingress 的注解,而忽略了其对主机下其他路由的影响,会导致那些本意为精确或前缀匹配的路由,意外地以正则(大小写不敏感前缀)方式匹配,引发流量错误路由或遗漏。
Gateway API 实践:
- 逐条路由规则检查:Gateway API 中的路径匹配类型(
Exact,Prefix,RegularExpression)仅作用于其所在的HTTPRoute的单条规则。不存在“全局正则开关”。 - 迁移时全面审查:在迁移前,必须检查主机下所有相关的 Ingress 资源,理解其在
use-regex开启下的实际匹配行为,并将其准确地转换为 Gateway API 的显式路径匹配类型。
3. rewrite-target 注解隐式启用正则匹配
行为:nginx.ingress.kubernetes.io/rewrite-target 注解的存在,除了定义路径重写规则外,还会隐式地为该主机启用正则匹配模式,其效果等同于同时设置了 use-regex: "true"。这是一个非常常见的意外行为来源。
迁移风险:用户可能仅关注于重写逻辑的迁移,而未意识到路径匹配类型因该注解而改变。直接使用 Exact 或 Prefix 类型创建 Gateway API 路由,会因为行为不匹配(从隐式正则变为显式精确/前缀)而导致路由失败。
Gateway API 实践:
- 分离关注点:在 Gateway API 中,路径匹配和路径重写(
URLRewrite过滤器)是完全独立的概念。 - 迁移策略:
- 分析原 Ingress 在
rewrite-target作用下的实际路径匹配行为(通常是大小写不敏感前缀)。 - 在 Gateway API 的
HTTPRoute中,使用RegularExpression类型并相应调整模式,或在确认意图后改用Exact/Prefix并修正路径值。 - 单独配置
URLRewrite过滤器来处理路径重写逻辑。
- 分析原 Ingress 在
4. 缺少尾部斜杠的请求会被自动重定向
行为:对于路径类型为 Exact 或 Prefix 的 Ingress 规则,如果定义的路径有尾部斜杠(如 /my-path/),而请求路径没有(如 /my-path),Ingress-NGINX 会自动发送一个 301 Moved Permanently 重定向,将请求重定向到带尾部斜杠的版本。
迁移风险:如果客户端或下游服务依赖于这个自动重定向(例如,前端应用或 API 客户端总是请求不带斜杠的版本),迁移到 Gateway API 后,这个默认行为将消失,请求会直接返回 404,导致功能中断。
Gateway API 实践:
- 显式配置重定向:如果需要保持此行为,必须在 Gateway API 中使用
RequestRedirect过滤器显式配置。filters: - type: RequestRedirect requestRedirect: statusCode: 301 path: type: ReplaceFullPath replaceFullPath: /my-path/ # 添加尾部斜杠 - 修正应用调用:更好的长期方案是修正客户端,使其直接请求正确的路径(带或不带尾部斜杠),并在路由规则中明确处理。
5. Ingress-NGINX 会对 URL 进行规范化处理
行为:在匹配路由规则之前,Ingress-NGINX 会根据 RFC 3986 对请求的 URL 路径进行规范化。例如,移除路径中的 . 段(/a/./b -> /a/b)、解析 .. 段(/a/../b -> /b)、合并连续的斜杠(/a///b -> /a/b)。规范化后的路径再用于规则匹配。
迁移风险:后端应用可能依赖于 Ingress-NGINX 提供的规范化服务,即发送未经规范化的 URL 也能正确路由。虽然许多 Gateway API 实现(如 Envoy)默认也开启了部分规范化(如处理 . 和 ..),但具体行为可能有细微差别。迁移后,一些边缘情况的请求可能会失败。
Gateway API 实践:
- 查阅实现文档:不同 Gateway API 实现的默认规范化行为可能不同,务必查阅所选实现的文档(如 Istio, Envoy Gateway, Kgateway)。
- 统一规范化策略:确保新架构中的规范化策略与之前一致,或在应用层处理 URL 规范化,减少对网关层的隐式依赖。
SRE 要点
- 与可靠性的关联:上述每一个“意外行为”都是潜在的单点故障源。迁移过程中的疏忽会直接导致流量丢失或路由错误,引发严重的生产事故。SRE 必须将这些行为视为迁移验证清单的关键项。
- 最佳实践:
- 全面审计:迁移前,彻底审查现有 Ingress 资源及其使用的注解,特别是
use-regex和rewrite-target,理解其对流量的实际影响。 - 测试驱动迁移:为每个关键路由编写集成或端到端测试用例,覆盖正则匹配、路径重写、重定向等场景。在新 Gateway API 环境中验证这些用例。
- 分阶段切换:采用蓝绿部署或金丝雀发布,逐步将流量从 Ingress-NGINX 切换到 Gateway API,并监控错误率(5xx)和路由异常。
- 利用工具:考虑使用官方的 Ingress2Gateway 工具作为起点,但必须结合人工审查和调整。
- 全面审计:迁移前,彻底审查现有 Ingress 资源及其使用的注解,特别是
- 常见反模式:
- 逐行翻译:机械地将 Ingress YAML 转换为 HTTPRoute,而不分析其背后的行为逻辑。
- 忽视注解副作用:假设一个注解只影响其所在的资源,不理解其全局或隐式影响。
- 缺乏生产验证:在 staging 环境测试通过后,未在生产流量模式下进行验证就完成切换。
- 相关指标与 SLO:
- SLI: 迁移期间应重点关注
路由请求错误率(例如,因 404 导致的请求失败百分比)和路径匹配准确性(通过采样日志检查请求路径与匹配的后端服务)。 - SLO: 可能需要为迁移过渡期设定临时的、更宽松的错误预算,并在迁移完成后恢复严格的 SLO。
- 可观测性:确保 Gateway API 实现提供了详细的访问日志和指标,能够追踪请求的匹配规则和最终路由结果,这对排查迁移后的问题至关重要。
- SLI: 迁移期间应重点关注