2. Gateway API 基础:核心概念与传统 Ingress 对比

在云原生网关演进中,Kubernetes 原生 Ingress 资源因功能边界模糊、扩展性差、多团队协作困难等问题逐渐暴露出局限性。Gateway API 作为下一代网关标准,通过分层抽象和角色分离,为灰度发布、流量回滚等场景提供了更精确的控制面。本节将系统梳理 Gateway API 的三大核心概念,并与传统 Ingress 进行多维度对比。

2.1 三大核心概念

Gateway API 将网关配置拆解为三个独立资源,分别对应基础设施提供者、集群运维者和应用开发者三个角色:

资源 API 版本(稳定) 管理角色 核心职责
GatewayClass gateway.networking.k8s.io/v1 基础设施提供者 定义网关实现类型(如 Nginx、Istio、Contour)及默认参数
Gateway gateway.networking.k8s.io/v1 集群运维者 声明网关实例的监听端口、协议、证书及关联的 GatewayClass
HTTPRoute gateway.networking.k8s.io/v1 应用开发者 定义 HTTP 流量路由规则,包括匹配、转发、重试、超时、灰度权重
角色分离设计要点: GatewayClass 由平台团队或云厂商预置,应用开发者无需感知底层实现;Gateway 实例由集群管理员按需创建,绑定证书和网络策略;HTTPRoute 由业务团队独立编写,通过 label selector 与 Gateway 建立松耦合关联。这种分层避免了传统 Ingress 中“一个 YAML 文件同时包含网络配置和路由规则”的混乱局面。

2.2 核心概念关系图

下图展示了 GatewayClass、Gateway、HTTPRoute 三者之间的引用与绑定关系,以及它们如何共同构成完整的流量接入链路:

Gateway API 核心概念关系图 Gateway API 核心概念关系 GatewayClass 实现类型 + 默认参数 Gateway 监听器 + 证书 + 地址 HTTPRoute 匹配 + 转发 + 灰度 className 引用 parentRefs 绑定 角色对应关系 基础设施提供者 → GatewayClass | 集群运维者 → Gateway | 应用开发者 → HTTPRoute 流量接入流程 ① 平台团队预置 GatewayClass(如 nginx-gateway-class) ② 运维团队创建 Gateway 实例,指定 className 和监听端口 ③ 业务团队创建 HTTPRoute,通过 parentRefs 关联 Gateway ④ 流量从 Gateway 监听器进入,按 HTTPRoute 规则转发至后端 Service

2.3 与传统 Ingress 的全面对比

传统 Ingress 在 v1 版本中仅提供基础的路由和 TLS 终止能力,而 Gateway API 在功能粒度、扩展性和多团队协作方面进行了根本性重构。以下从 8 个关键维度进行对比:

对比维度 传统 Ingress Gateway API
资源模型 单一 Ingress 资源承载路由 + 证书 + 后端 GatewayClass / Gateway / HTTPRoute 三层分离
角色权限 所有配置集中在同一 YAML,难以按角色拆分 基础设施、运维、应用开发者各管一层,RBAC 天然对齐
流量灰度 依赖 annotation 扩展,无原生权重/Header 匹配 HTTPRoute 原生支持权重、Header、QueryParam 灰度规则
协议支持 仅 HTTP/HTTPS,TCP/UDP 需 CRD 或第三方 原生支持 HTTP、HTTPS、TCP、UDP、TLS、gRPC
后端类型 仅 Service,不支持跨命名空间 支持 Service、ServiceImport、自定义后端,支持跨命名空间
扩展机制 annotation 方式,无类型安全,易冲突 Policy Attachment + 自定义 Route 类型,强类型扩展
回滚能力 无原生回滚语义,需手动修改 Ingress 资源 HTTPRoute 支持权重回滚、版本回退、条件回滚策略
多集群 无原生支持,需额外工具 支持多集群 Service 暴露,配合 ServiceImport 实现全局负载
灰度验证关键差异: 传统 Ingress 要实现 10% 流量灰度到 v2 版本,通常需要安装 Nginx Ingress Controller 并编写复杂的 annotation(如 nginx.ingress.kubernetes.io/canary-weight: "10"),且无法在一条规则中同时匹配 Header 和权重。Gateway API 的 HTTPRoute 通过 matches 和 backendRefs 字段即可原生表达,且支持多条 Route 叠加,为流水线中的回滚护栏提供了标准化的控制接口。

2.4 HTTPRoute 灰度规则示例

以下是一个典型的灰度发布 HTTPRoute 配置,展示了 Gateway API 如何原生支持权重分配和条件匹配:

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: app-canary
  namespace: production
spec:
  parentRefs:
  - name: prod-gateway
    namespace: gateway-system
  rules:
  - matches:
    - headers:
      - name: "X-Canary"
        value: "true"
    backendRefs:
    - name: app-v2
      port: 8080
      weight: 100
  - backendRefs:
    - name: app-v1
      port: 8080
      weight: 90
    - name: app-v2
      port: 8080
      weight: 10
回滚护栏设计点: 上述配置中,第一条规则匹配 Header X-Canary: true 的请求全部转发至 v2,用于内部验证;第二条规则将 10% 的常规流量导向 v2。当需要回滚时,只需将 v2 的 weight 改为 0 并删除第一条规则,无需重建整个资源。流水线可通过 kubectl patch 或 GitOps 自动执行此操作,实现秒级回滚。

2.5 从 Ingress 迁移到 Gateway API 的路径

对于已有 Ingress 资源的集群,建议采用渐进式迁移策略:

  • 阶段一(并行运行): 安装 Gateway API CRD 和兼容的控制器(如 Nginx Gateway Fabric),保留现有 Ingress 资源,新建 Gateway 和 HTTPRoute 用于新服务。
  • 阶段二(灰度迁移): 将部分存量服务的 Ingress 规则逐步转换为 HTTPRoute,通过 DNS 权重或 Gateway 监听器切换验证功能正确性。
  • 阶段三(全面切换): 确认 HTTPRoute 稳定后,移除 Ingress 资源,统一使用 Gateway API 管理所有流量,并启用回滚护栏策略。
迁移注意事项: 并非所有 Ingress annotation 都有对应的 Gateway API 原生字段。在迁移前,需检查当前使用的 annotation(如 rewrite-target、ssl-redirect 等)是否已被 Gateway API 的 Policy 或 Filter 机制覆盖。对于无法直接映射的 annotation,可使用 ExtensionRef 或自定义 Filter 进行过渡。