2. Gateway API 基础概念回顾:GatewayClass、Gateway、HTTPRoute、ReferenceGrant 等核心资源定义与关系
在深入集群升级的灰度验证场景之前,必须牢固掌握 Gateway API 的四大核心资源。这些资源构成了从基础设施抽象到流量路由策略的完整层级,理解它们之间的依赖关系是后续配置灰度规则的前提。
2.1 核心资源定义
| 资源名称 | 作用域 | 核心职责 | 类比传统概念 |
|---|---|---|---|
| GatewayClass | 集群 | 定义一类负载均衡器的实现模板(如:nginx、istio、contour) | IngressClass / StorageClass |
| Gateway | 命名空间 | 实例化一个具体的负载均衡器,绑定监听地址与端口 | Ingress 控制器实例 |
| HTTPRoute | 命名空间 | 定义 HTTP 流量的匹配规则与后端转发目标 | Ingress 规则 + Service |
| ReferenceGrant | 命名空间 | 显式授权跨命名空间引用(如:Route 引用其他命名空间的 Service) | 无(全新安全模型) |
关键认知: Gateway API 采用“声明式分层”模型。集群管理员定义 GatewayClass,平台团队实例化 Gateway,应用团队编写 HTTPRoute。这种职责分离是灰度策略能够安全下放的基础。
2.2 资源层级关系
下图展示了四个核心资源之间的依赖与绑定关系。箭头方向表示“引用”或“绑定”方向。
2.3 资源定义关键字段
2.3.1 GatewayClass
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: eg
spec:
controllerName: gateway.envoyproxy.io/gatewayclass-controller
parametersRef:
group: gateway.envoyproxy.io
kind: EnvoyProxy
name: custom-config
- controllerName:唯一标识实现该类的控制器,集群中不可重复。
- parametersRef:可选,引用自定义配置参数,用于调整控制器行为。
2.3.2 Gateway
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:
environment: prod
- gatewayClassName:绑定到指定的 GatewayClass。
- listeners:定义监听协议、端口以及允许哪些命名空间的路由绑定。
- allowedRoutes:安全边界控制,可限制为
Same、All或Selector。
2.3.3 HTTPRoute
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: app-v1
namespace: prod
spec:
parentRefs:
- name: prod-gw
namespace: infra
hostnames:
- "app.example.com"
rules:
- matches:
- path:
type: PathPrefix
value: /api
backendRefs:
- name: app-svc-v1
port: 8080
weight: 90
- name: app-svc-v2
port: 8080
weight: 10
- parentRefs:绑定到哪个 Gateway,支持跨命名空间。
- hostnames:域名匹配,支持通配符。
- matches:路径、Header、Query Param 等匹配条件。
- backendRefs:后端服务列表,支持权重分配——这是灰度验证的核心字段。
2.3.4 ReferenceGrant
apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata:
name: allow-prod-to-infra
namespace: infra
spec:
from:
- group: gateway.networking.k8s.io
kind: HTTPRoute
namespace: prod
to:
- group: ""
kind: Service
- from:指定哪些命名空间下的哪些资源可以发起引用。
- to:指定允许被引用的目标资源类型。
- 作用:没有 ReferenceGrant,跨命名空间的 Route→Service 引用会被拒绝,这是 Gateway API 的安全增强设计。
常见陷阱: 很多初学者在跨命名空间配置灰度路由时,只配置了 HTTPRoute 的 parentRefs 指向其他命名空间的 Gateway,却忘记在 Gateway 所在命名空间创建 ReferenceGrant,导致路由无法生效。请务必检查双向授权。
2.4 资源生命周期与灰度验证的关系
在集群升级的灰度验证场景中,这四个资源各自扮演关键角色:
- GatewayClass 决定了底层负载均衡器的版本与能力——升级控制器时需确认兼容性。
- Gateway 作为流量入口,其
listeners配置决定了灰度流量能否被正确接收。 - HTTPRoute 的权重路由、Header 匹配、镜像功能是灰度策略的直接执行者。
- ReferenceGrant 保障了灰度期间跨团队、跨命名空间引用的安全性。
实践要点: 在升级前,建议通过
kubectl get gatewayclass,gateway,httproute,referencegrant -A 确认当前集群中所有资源的分布情况,并检查是否存在未授权的跨命名空间引用。