3. Gateway API 基础:资源模型与传统 Ingress 对比

Gateway API 是 Kubernetes 社区推出的下一代入口流量管理标准,旨在解决传统 Ingress 在表达能力、角色划分和扩展性上的不足。本章聚焦其核心资源模型——GatewayClass、Gateway、HTTPRoute,并通过与传统 Ingress 的对比,帮助学员建立清晰的架构认知。

3.1 三大核心资源模型

Gateway API 将流量治理拆解为三个独立且可组合的资源层,每一层对应不同的关注点与角色。

资源名称 作用域 核心职责 典型管理者
GatewayClass 集群级 定义网关的实现类型(如:nginx、istio、contour) 平台管理员 / 基础设施团队
Gateway 命名空间级 声明网关实例的监听端口、协议、证书及关联的 GatewayClass 平台运维 / 网络管理员
HTTPRoute 命名空间级 定义 HTTP 流量的路由规则(路径匹配、Header 改写、后端转发) 应用开发者 / 业务团队
角色解耦设计: 传统 Ingress 将所有配置集中在一个资源中,导致平台团队与应用团队职责不清。Gateway API 通过三层模型实现了关注点分离,平台团队管控 GatewayClass 和 Gateway,应用团队仅需操作 HTTPRoute,互不干扰。

3.2 资源模型关系图

下图展示了 GatewayClass、Gateway、HTTPRoute 之间的层级关联与数据流方向:

Gateway API 三层资源模型关系图 Gateway API 三层资源模型关系 GatewayClass 集群级 · 定义实现类型 Gateway 命名空间级 · 声明监听端口 HTTPRoute 命名空间级 · 定义路由规则 引用 绑定 说明: 一个 GatewayClass 可被多个 Gateway 引用;一个 Gateway 可绑定多个 HTTPRoute; HTTPRoute 通过 parentRefs 字段指定要绑定的 Gateway,实现多租户路由隔离。

3.3 核心资源详解

3.3.1 GatewayClass

GatewayClass 是集群的入口点,类似于 StorageClass 之于存储。它声明了网关控制器的实现名称和参数。平台管理员只需安装一次 GatewayClass,后续所有 Gateway 实例均可引用。

apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: nginx-gateway-class
spec:
  controllerName: gateway.envoyproxy.io/gatewayclass-controller
  parametersRef:
    group: ""
    kind: ConfigMap
    name: nginx-gateway-config
    namespace: gateway-system

3.3.2 Gateway

Gateway 代表一个具体的网关实例,负责监听指定的端口和协议。它通过 gatewayClassName 字段关联 GatewayClass,并通过 listeners 数组声明监听规则。

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: prod-gateway
  namespace: default
spec:
  gatewayClassName: nginx-gateway-class
  listeners:
  - name: https
    protocol: HTTPS
    port: 443
    hostname: "*.example.com"
    tls:
      mode: Terminate
      certificateRefs:
      - name: example-tls

3.3.3 HTTPRoute

HTTPRoute 是应用团队最常操作的资源,它定义了 HTTP 流量的匹配条件和后端转发目标。支持路径前缀匹配、精确匹配、Header 匹配、权重分流等高级特性。

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: app-route
  namespace: default
spec:
  parentRefs:
  - name: prod-gateway
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /api
    backendRefs:
    - name: api-service
      port: 8080
      weight: 90
    - name: api-service-canary
      port: 8080
      weight: 10

3.4 与传统 Ingress 的对比

传统 Ingress 资源在 Kubernetes 早期解决了外部流量接入问题,但随着微服务规模和治理需求的增长,其局限性日益明显。下表从多个维度进行对比:

对比维度 传统 Ingress Gateway API
资源模型 单一资源,所有配置耦合 三层解耦:GatewayClass / Gateway / HTTPRoute
角色分离 平台与应用共用同一资源,权限难控制 平台管 Gateway,应用管 HTTPRoute,天然隔离
协议支持 仅 HTTP/HTTPS,扩展需注解 原生支持 HTTP、HTTPS、TCP、UDP、TLS 直通
路由匹配 仅 Host + Path 前缀 支持 Path 前缀/精确/正则、Header、QueryParam、Method
流量分发 仅简单轮询 支持权重分流、镜像、重定向、自定义过滤器
跨命名空间 不支持,需手动复制规则 HTTPRoute 可引用其他命名空间的 Service(需 ReferenceGrant)
扩展性 依赖注解,无标准扩展点 提供 Policy 资源、自定义过滤器、BackendTLSPolicy 等标准扩展
回滚能力 无原生回滚,需手动恢复旧 Ingress 结合 HTTPRoute 版本管理,支持声明式回滚(本课程核心主题)
关键结论: Gateway API 并非简单替代 Ingress,而是将入口治理从“单资源配置”升级为“面向角色的声明式架构”。对于平台门户联动和回滚护栏设计,Gateway API 的三层模型提供了天然的策略注入点和版本控制边界。

3.5 传统 Ingress 的痛点图示

下图直观对比了传统 Ingress 的“扁平耦合”架构与 Gateway API 的“分层解耦”架构:

传统 Ingress vs Gateway API 架构对比 传统 Ingress vs Gateway API 架构对比 传统 Ingress(扁平耦合) Ingress 资源 Host + Path + 注解 + 后端 平台团队 & 应用团队共用 权限模糊 · 配置冲突风险高 回滚需手动恢复 · 无版本管理 Gateway API(分层解耦) GatewayClass(集群级) Gateway(命名空间级) HTTPRoute(命名空间级) 角色分离 · 策略注入 版本管理 · 声明式回滚

3.6 迁移建议与避坑指南

  • 不要一次性替换所有 Ingress: Gateway API 支持与 Ingress 共存,建议从非核心业务开始灰度迁移。
  • 注意 GatewayClass 的 controllerName 唯一性: 集群中不能存在两个相同 controllerName 的 GatewayClass,否则 Gateway 无法确定使用哪个实现。
  • HTTPRoute 的 parentRefs 必须指向已存在的 Gateway: 如果 Gateway 尚未就绪,HTTPRoute 将处于 Accepted=False 状态,流量不会生效。
  • 跨命名空间引用需配合 ReferenceGrant: 默认 HTTPRoute 只能引用同命名空间的 Service,跨命名空间必须显式授权。
常见陷阱: 部分 Gateway 实现(如旧版 Contour)对 HTTPRoute 的 path 匹配类型支持不完整。迁移前务必查阅实现文档,确认 PathPrefix 和 Exact 是否都受支持,避免生产环境路由失效。