Gateway API 基础概念:GatewayClass、Gateway、HTTPRoute、ReferenceGrant

Gateway API 是 Kubernetes 社区推出的下一代入口流量管理标准,旨在替代传统的 Ingress 资源,提供更丰富的路由语义、更清晰的职责分离以及跨命名空间的资源引用能力。在集群升级场景中,Gateway API 的流量切分与无损切换能力正是建立在其核心资源模型之上。本章将逐一剖析四个最基础的概念:GatewayClass、Gateway、HTTPRoute 和 ReferenceGrant。

2.1 资源模型概览

Gateway API 采用分层抽象模型,将基础设施提供者、集群运维人员和应用开发者的职责解耦。下表展示了四个核心资源的分层关系与职责归属:

资源名称 层级 主要职责 典型管理者
GatewayClass 集群级 定义网关实现类型(如:nginx、istio、contour) 基础设施团队 / 平台管理员
Gateway 命名空间级 声明网关实例的监听端口、协议和关联的 GatewayClass 集群运维 / 平台管理员
HTTPRoute 命名空间级 定义 HTTP 流量的路由规则(匹配、转发、重写、流量切分) 应用开发者 / 服务所有者
ReferenceGrant 命名空间级 显式授权跨命名空间资源引用 命名空间管理员
设计理念:Gateway API 通过分层模型实现了关注点分离。基础设施团队只需定义 GatewayClass 和 Gateway,应用团队则专注于 HTTPRoute 的路由逻辑,双方无需互相侵入对方的配置空间。

2.2 GatewayClass —— 网关实现的抽象

GatewayClass 是集群级别的资源,类似于 StorageClass 对存储后端的抽象。它声明了一种可用的网关实现,并指向对应的控制器。一个集群中可以存在多个 GatewayClass,每个 GatewayClass 对应不同的实现或配置模板。

apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: my-nginx-gateway-class
spec:
  controllerName: "nginx.org/gateway-controller"
  parametersRef:
    group: ""
    kind: ConfigMap
    name: nginx-gateway-config
    namespace: nginx-system
  • controllerName:唯一标识控制器的字符串,用于匹配实际运行的网关控制器。
  • parametersRef:可选字段,引用一个 ConfigMap 或自定义资源,用于传递实现特定的配置参数。
  • description:可选的人类可读描述。
注意:GatewayClass 是集群范围的资源,创建后不可修改 spec.controllerName。如需切换实现,应创建新的 GatewayClass 并迁移 Gateway 的引用。

2.3 Gateway —— 网关实例的声明

Gateway 资源代表一个具体的网关实例,它绑定到一个 GatewayClass,并声明监听地址、端口和协议。Gateway 是流量进入集群的入口点,所有路由规则最终都附着在 Gateway 上。

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: my-gateway
  namespace: default
spec:
  gatewayClassName: my-nginx-gateway-class
  listeners:
  - name: http
    protocol: HTTP
    port: 80
    allowedRoutes:
      namespaces:
        from: Selector
        selector:
          matchLabels:
            kubernetes.io/metadata.name: default
  - name: https
    protocol: HTTPS
    port: 443
    tls:
      mode: Terminate
      certificateRefs:
      - name: my-tls-secret
  • gatewayClassName:引用集群中已存在的 GatewayClass。
  • listeners:定义监听端口、协议、TLS 配置以及允许哪些命名空间的路由附着。
  • addresses:可选字段,指定网关绑定的 IP 地址或主机名。
升级场景价值:在集群升级过程中,可以创建两个 Gateway 实例(旧版和新版),分别绑定不同的后端服务版本。通过 HTTPRoute 的流量切分规则,逐步将流量从旧 Gateway 迁移到新 Gateway,实现零停机切换。
GatewayClass 与 Gateway 绑定关系 GatewayClass controllerName: nginx parametersRef: ConfigMap Gateway gatewayClassName: my-nginx listeners: HTTP:80, HTTPS:443 引用 (gatewayClassName) 说明 一个 GatewayClass 可以被多个 Gateway 引用 每个 Gateway 独立声明监听端口和 TLS 配置

2.4 HTTPRoute —— 流量路由规则的核心

HTTPRoute 是 Gateway API 中最常用的路由资源,它定义了如何匹配进入 Gateway 的 HTTP 请求,并将其转发到后端服务。HTTPRoute 支持丰富的匹配条件、过滤器以及流量切分能力,是集群升级中实现无损切换的关键工具。

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: my-app-route
  namespace: default
spec:
  parentRefs:
  - name: my-gateway
    sectionName: http
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /api
    backendRefs:
    - name: app-v1
      port: 8080
      weight: 90
    - name: app-v2
      port: 8080
      weight: 10
  - matches:
    - headers:
      - name: X-Canary
        value: "true"
    backendRefs:
    - name: app-v2
      port: 8080
      weight: 100
  • parentRefs:指定该路由附着到哪个 Gateway 的哪个监听器。
  • matches:定义匹配条件,支持路径、请求头、查询参数、HTTP 方法等。
  • backendRefs:定义后端服务引用,支持权重分配(weight)实现流量切分。
  • filters:可选,支持 URL 重写、请求头修改、重定向等高级功能。
流量切分示例:上述配置将 90% 的流量发送到 app-v1,10% 发送到 app-v2。同时,带有 X-Canary: true 请求头的流量全部路由到 app-v2,可用于金丝雀测试。

2.5 ReferenceGrant —— 跨命名空间引用的安全闸门

Gateway API 默认不允许跨命名空间引用资源(例如:命名空间 A 的 HTTPRoute 引用命名空间 B 的 Service)。ReferenceGrant 资源提供了一种显式的授权机制,允许资源所有者开放特定跨命名空间引用。

apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata:
  name: allow-cross-ns-ref
  namespace: backend-ns
spec:
  from:
  - group: gateway.networking.k8s.io
    kind: HTTPRoute
    namespace: frontend-ns
  to:
  - group: ""
    kind: Service
  • from:指定允许哪些来源资源(group、kind、namespace)发起引用。
  • to:指定允许被引用的目标资源类型(group、kind)。
  • 作用范围:ReferenceGrant 只能授权其所在命名空间内的资源被外部引用。
安全最佳实践:ReferenceGrant 应遵循最小权限原则,只开放必要的命名空间和资源类型。在集群升级场景中,如果新旧服务位于不同命名空间,必须提前创建对应的 ReferenceGrant,否则路由规则将无法生效。
HTTPRoute 跨命名空间引用与 ReferenceGrant 授权 命名空间:frontend-ns HTTPRoute parentRefs: my-gateway backendRefs: app-v2 (backend-ns) 命名空间:backend-ns Service: app-v2 port: 8080 ReferenceGrant from: frontend-ns/HTTPRoute to: Service 引用 Service 授权检查 ReferenceGrant 必须存在于目标资源所在命名空间(backend-ns),显式授权来源命名空间(frontend-ns)的引用

2.6 四个核心资源的协作关系

在集群升级的流量切分场景中,这四个资源按照以下流程协同工作:

  1. 基础设施层:平台管理员创建 GatewayClass,指定网关控制器类型(如 nginx、istio)。
  2. 入口层:运维人员创建 Gateway 实例,绑定 GatewayClass,声明监听端口和 TLS 配置。
  3. 路由层:应用开发者创建 HTTPRoute,附着到 Gateway,定义流量匹配规则和后端权重。
  4. 授权层:如果后端服务位于不同命名空间,目标命名空间管理员创建 ReferenceGrant 授权跨命名空间引用。
升级切分流程示例:假设需要将 app-v1 升级到 app-v2。首先在 backend-ns 创建 app-v2 Service 和 ReferenceGrant,然后在 HTTPRoute 中添加 app-v2 后端并设置初始权重为 5%,逐步增加权重至 100%,最后移除 app-v1 后端。整个过程无需重建 Gateway 或修改监听器配置。