2. 核心概念回顾:Gateway API 资源模型
在进入多版本路由切换演练之前,必须统一理解 Gateway API 的四个核心资源。它们构成了从“基础设施定义”到“流量路由策略”的完整分层模型,也是后续所有升级与切换操作的操作对象。
2.1 四层资源模型总览
Gateway API 将网络配置拆解为 基础设施提供方 和 服务使用方 两个角色,通过以下四种资源实现职责分离:
| 资源名称 | 作用域 | 核心职责 | 典型管理者 |
|---|---|---|---|
| GatewayClass | 集群级 | 定义网关的实现类型(如:nginx、istio、contour) | 集群管理员 / 平台团队 |
| Gateway | 命名空间级 | 声明一个网关实例的监听端口、协议、证书 | 基础设施团队 |
| HTTPRoute | 命名空间级 | 定义 HTTP 流量的匹配规则与后端转发目标 | 应用开发 / 服务所有者 |
| ReferenceGrant | 命名空间级 | 允许跨命名空间引用资源(如 HTTPRoute 引用其他命名空间的 Service) | 命名空间管理员 |
关键认知: 这四种资源并非平级关系。GatewayClass 定义“能做什么”,Gateway 定义“在哪里做”,HTTPRoute 定义“怎么做”,ReferenceGrant 解决“跨边界怎么做”。升级时,不同 API 版本的变更往往集中在前三者。
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。
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 命令验证资源清单的版本兼容性。