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 资源层级关系

下图展示了四个核心资源之间的依赖与绑定关系。箭头方向表示“引用”或“绑定”方向。

Gateway API 核心资源关系图 Gateway API 核心资源层级关系 GatewayClass 集群级:定义实现类型 Gateway 命名空间级:实例化监听器 HTTPRoute 命名空间级:路由规则 ReferenceGrant 命名空间级:跨命名空间授权 后端 Service 目标工作负载 spec.gatewayClassName parentRefs 跨 ns 引用需授权 backendRefs 允许引用 说明:实线为直接引用,虚线为跨命名空间场景下的授权引用

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 资源生命周期与灰度验证的关系

在集群升级的灰度验证场景中,这四个资源各自扮演关键角色:

  1. GatewayClass 决定了底层负载均衡器的版本与能力——升级控制器时需确认兼容性。
  2. Gateway 作为流量入口,其 listeners 配置决定了灰度流量能否被正确接收。
  3. HTTPRoute 的权重路由、Header 匹配、镜像功能是灰度策略的直接执行者。
  4. ReferenceGrant 保障了灰度期间跨团队、跨命名空间引用的安全性。
实践要点: 在升级前,建议通过 kubectl get gatewayclass,gateway,httproute,referencegrant -A 确认当前集群中所有资源的分布情况,并检查是否存在未授权的跨命名空间引用。