2. 核心概念回顾:Gateway API 资源模型

在进入多版本路由切换演练之前,必须统一理解 Gateway API 的四个核心资源。它们构成了从“基础设施定义”到“流量路由策略”的完整分层模型,也是后续所有升级与切换操作的操作对象。

2.1 四层资源模型总览

Gateway API 将网络配置拆解为 基础设施提供方 和 服务使用方 两个角色,通过以下四种资源实现职责分离:

资源名称 作用域 核心职责 典型管理者
GatewayClass 集群级 定义网关的实现类型(如:nginx、istio、contour) 集群管理员 / 平台团队
Gateway 命名空间级 声明一个网关实例的监听端口、协议、证书 基础设施团队
HTTPRoute 命名空间级 定义 HTTP 流量的匹配规则与后端转发目标 应用开发 / 服务所有者
ReferenceGrant 命名空间级 允许跨命名空间引用资源(如 HTTPRoute 引用其他命名空间的 Service) 命名空间管理员
关键认知: 这四种资源并非平级关系。GatewayClass 定义“能做什么”,Gateway 定义“在哪里做”,HTTPRoute 定义“怎么做”,ReferenceGrant 解决“跨边界怎么做”。升级时,不同 API 版本的变更往往集中在前三者。
Gateway API 四层资源模型关系 GatewayClass 集群级 · 定义网关实现类型 Gateway 命名空间级 · 声明监听端口与协议 HTTPRoute 命名空间级 · 匹配规则与后端转发 ReferenceGrant 跨命名空间引用授权 基础设施提供方 (集群管理员 / 平台团队) 服务使用方 (应用开发 / 服务所有者)

2.2 各资源详解

2.2.1 GatewayClass

GatewayClass 是集群范围的入口点,类似于 StorageClass 对存储的角色。它声明了可用的网关控制器实现。一个集群可以有多个 GatewayClass,但每个 Gateway 只能关联一个。

apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: eg
spec:
  controllerName: gateway.envoyproxy.io/gatewayclass-controller

2.2.2 Gateway

Gateway 资源代表一个具体的网络入口点。它通过 gatewayClassName 引用 GatewayClass,并定义监听器(listeners)的协议、端口、TLS 配置。

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: prod-gw
  namespace: infra
spec:
  gatewayClassName: eg
  listeners:
  - name: http
    protocol: HTTP
    port: 80
    allowedRoutes:
      namespaces:
        from: Selector
        selector:
          matchLabels:
            kubernetes.io/metadata.name: apps

2.2.3 HTTPRoute

HTTPRoute 是应用团队最常操作的资源。它定义主机名、路径匹配、Header 匹配规则,以及将流量转发到哪个后端 Service。一个 HTTPRoute 可以关联多个 Gateway。

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: store-route
  namespace: apps
spec:
  parentRefs:
  - name: prod-gw
    namespace: infra
  hostnames:
  - "store.example.com"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /api
    backendRefs:
    - name: store-svc
      port: 8080

2.2.4 ReferenceGrant

当 HTTPRoute 需要引用其他命名空间的 Service,或者 Gateway 需要引用其他命名空间的 Secret 时,必须由目标命名空间的管理员创建 ReferenceGrant 来显式授权。

apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata:
  name: allow-apps-to-infra
  namespace: infra
spec:
  from:
  - group: gateway.networking.k8s.io
    kind: HTTPRoute
    namespace: apps
  to:
  - group: ""
    kind: Service
升级注意: ReferenceGrant 在 v1alpha2 到 v1beta1 的演进中,字段结构有调整。升级后如果发现跨命名空间引用失效,请优先检查 ReferenceGrant 的 API 版本和 spec.from/spec.to 字段格式是否匹配新版本规范。

2.3 资源之间的绑定关系

理解以下绑定规则,是后续演练中判断“升级后路由是否生效”的基础:

  • Gateway → GatewayClass: 通过 spec.gatewayClassName 绑定,一个 Gateway 只能绑定一个 GatewayClass。
  • HTTPRoute → Gateway: 通过 spec.parentRefs 绑定,一个 HTTPRoute 可以绑定多个 Gateway。
  • HTTPRoute → Service: 通过 spec.rules[].backendRefs 绑定,默认同命名空间,跨命名空间需要 ReferenceGrant。
  • Gateway → Secret: 通过 spec.listeners[].tls.certificateRefs 绑定,跨命名空间同样需要 ReferenceGrant。
资源绑定与引用关系 GatewayClass Gateway HTTPRoute Service Secret gatewayClassName parentRefs backendRefs certificateRefs 跨命名空间引用需要 ReferenceGrant 显式授权 例如:apps 命名空间的 HTTPRoute 引用 infra 命名空间的 Service,需在 infra 命名空间创建 ReferenceGrant

2.4 多版本共存时的关键差异

在集群升级过程中,Gateway API 的多个版本(v1alpha2、v1beta1、v1)可能同时存在于集群中。以下是三个主要版本在核心资源上的差异对比:

资源 v1alpha2 v1beta1 v1
GatewayClass spec.controller 字段 spec.controllerName 字段(重命名) 与 v1beta1 一致,稳定 GA
Gateway spec.listeners[].routes 字段 spec.listeners[].allowedRoutes 字段(重命名) 与 v1beta1 一致,稳定 GA
HTTPRoute spec.rules[].filters 类型较少 新增 RequestRedirect、URLRewrite 等过滤器 新增 SessionPersistence 等高级特性
ReferenceGrant 原名 ReferencePolicy 重命名为 ReferenceGrant,字段结构微调 与 v1beta1 一致
演练前置提示: 本课程后续的升级演练场景,将模拟从 v1beta1 升级到 v1 版本。你需要重点关注 HTTPRoute 中过滤器字段的兼容性,以及 ReferenceGrant 的命名变更。升级前请使用 kubectl convert 命令验证资源清单的版本兼容性。