2. Gateway API 核心概念:资源模型详解

Gateway API 是 Kubernetes 社区推出的下一代入口流量管理标准,其核心设计理念是通过 面向角色 的资源模型,将基础设施管理员、集群运维人员、应用开发者三个角色的职责清晰分离。本章将深入剖析 Gateway API 的五大核心资源:GatewayClass、Gateway、HTTPRoute、ReferenceGrant 和 BackendTLSPolicy,理解它们各自的职责、相互关系以及在实际云原生网关架构中的协作方式。

2.1 资源模型总览与角色分层

Gateway API 的资源模型遵循“声明式、分层、可组合”的原则。与 Ingress 的单一路由扁平模型不同,Gateway API 将网络配置拆解为多个独立资源,每个资源对应特定的运维角色和关注点。

核心角色与资源映射:
  • 基础设施提供商: 定义 GatewayClass,描述网关的实现类型(如:Nginx、Envoy、Contour)。
  • 集群管理员: 实例化 Gateway,配置监听端口、TLS 证书,并关联到特定的 GatewayClass。
  • 应用开发者: 创建 HTTPRoute,定义流量路由规则(域名、路径匹配、后端服务)。
  • 跨命名空间安全管控: 使用 ReferenceGrant 显式授权跨命名空间引用。
  • 后端安全加固: 使用 BackendTLSPolicy 定义网关到后端服务的 TLS 连接策略。
Gateway API 核心资源模型与角色分层架构图 Gateway API 核心资源模型与角色分层 角色:基础设施提供商 GatewayClass 定义网关实现类型 角色:集群管理员 Gateway 实例化网关、监听器、TLS 角色:应用开发者 HTTPRoute 路由规则、后端服务绑定 跨角色安全资源 ReferenceGrant 跨命名空间引用授权 BackendTLSPolicy 网关到后端服务的 TLS 策略

2.2 GatewayClass:网关实现的定义

GatewayClass 是集群级别的资源,由基础设施提供商或集群管理员创建。它定义了网关的“类型”或“实现”,类似于 Ingress 中的 IngressClass。一个集群中可以存在多个 GatewayClass,例如:一个用于 Nginx 实现,另一个用于 Envoy 实现。

字段 类型 说明
spec.controllerName string 控制器名称,格式为 domain/controller,用于标识具体的网关控制器实现。
spec.parametersRef object 可选,引用一个包含控制器特定配置的参数对象(如 ConfigMap)。
spec.description string 可选,人类可读的描述信息。
最佳实践: 建议为每个网关实现创建一个独立的 GatewayClass,并通过 parametersRef 引用全局默认配置,避免在每个 Gateway 中重复定义。
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: eg
spec:
  controllerName: gateway.envoyproxy.io/gatewayclass-controller
  description: "Envoy Gateway 实现"

2.3 Gateway:网关实例与监听器

Gateway 资源代表一个具体的网关实例,由集群管理员在特定命名空间中创建。它定义了网关的监听器(Listener)、协议、端口、TLS 配置以及关联的 GatewayClass。一个 Gateway 可以包含多个监听器,每个监听器可以绑定不同的 TLS 证书和路由规则。

字段 类型 说明
spec.gatewayClassName string 引用的 GatewayClass 名称。
spec.listeners []Listener 监听器列表,每个监听器定义端口、协议、主机名、TLS 等。
spec.addresses []Address 可选,指定网关的静态 IP 地址或主机名。
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: prod-gateway
  namespace: infra
spec:
  gatewayClassName: eg
  listeners:
  - name: https
    protocol: HTTPS
    port: 443
    hostname: "*.example.com"
    tls:
      mode: Terminate
      certificateRefs:
      - name: example-tls
  - name: http
    protocol: HTTP
    port: 80
    hostname: "*.example.com"

2.4 HTTPRoute:路由规则与后端绑定

HTTPRoute 是应用开发者最常接触的资源,它定义了 HTTP 流量的路由规则,包括主机名匹配、路径匹配、请求头修改、后端服务转发等。一个 HTTPRoute 可以关联到多个 Gateway 监听器,实现灵活的路由分发。

路由匹配优先级:
  1. 精确匹配(Exact): 优先级最高,完全匹配路径。
  2. 前缀匹配(PathPrefix): 匹配路径前缀,如 /api/。
  3. 正则匹配(RegularExpression): 优先级最低,使用正则表达式匹配。
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: api-route
  namespace: apps
spec:
  parentRefs:
  - name: prod-gateway
    namespace: infra
  hostnames:
  - "api.example.com"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /v1/
    backendRefs:
    - name: v1-service
      port: 8080
  - matches:
    - path:
        type: PathPrefix
        value: /v2/
    backendRefs:
    - name: v2-service
      port: 8080

2.5 ReferenceGrant:跨命名空间安全授权

在 Gateway API 中,默认情况下资源只能引用同一命名空间内的其他资源。当 HTTPRoute 需要引用其他命名空间中的 Gateway 或 Service 时,必须通过 ReferenceGrant 显式授权。这一机制有效防止了跨命名空间的未授权访问。

字段 类型 说明
spec.from []From 指定允许发起引用的来源命名空间和资源组/种类。
spec.to []To 指定允许被引用的目标资源组/种类和名称。
apiVersion: gateway.networking.k8s.io/v1
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 必须创建在目标资源所在的命名空间中。例如,如果 HTTPRoute 在 apps 命名空间,要引用 infra 命名空间中的 Service,则 ReferenceGrant 必须创建在 infra 命名空间中。

2.6 BackendTLSPolicy:后端 TLS 连接策略

BackendTLSPolicy 是 Gateway API 中用于定义网关与后端服务之间 TLS 连接策略的资源。它解决了从网关到后端服务的“最后一公里”加密问题,确保流量在集群内部传输时也是加密的。该资源通常由集群管理员或安全团队管理。

字段 类型 说明
spec.targetRef object 引用目标后端 Service 资源。
spec.tls object TLS 配置,包括 CA 证书、SNI 名称、证书吊销列表等。
spec.tls.caCertRefs []LocalObjectReference 引用包含 CA 证书的 ConfigMap 或 Secret。
spec.tls.hostname string 用于 TLS SNI 的主机名。
apiVersion: gateway.networking.k8s.io/v1
kind: BackendTLSPolicy
metadata:
  name: backend-tls-policy
  namespace: apps
spec:
  targetRef:
    group: ""
    kind: Service
    name: secure-backend
  tls:
    hostname: backend.internal.example.com
    caCertRefs:
    - name: backend-ca
      group: ""
      kind: ConfigMap
Gateway API 资源协作流程 Gateway API 资源协作流程 客户端请求 Gateway HTTPRoute BackendTLSPolicy 后端 Service ReferenceGrant 说明: 1. 客户端请求到达 Gateway,Gateway 根据监听器匹配 HTTPRoute。 2. HTTPRoute 通过 BackendTLSPolicy 获取后端 TLS 配置,建立加密连接。

2.7 资源模型对比总结

为了帮助学员快速理解五个核心资源的定位与差异,下表从 作用域、创建者、核心职责 和 依赖关系 四个维度进行对比:

资源名称 作用域 创建者 核心职责 依赖关系
GatewayClass 集群 基础设施提供商 定义网关实现类型 被 Gateway 引用
Gateway 命名空间 集群管理员 实例化网关、监听器、TLS 引用 GatewayClass
HTTPRoute 命名空间 应用开发者 定义路由规则与后端绑定 引用 Gateway
ReferenceGrant 命名空间 集群管理员 跨命名空间引用授权 被 HTTPRoute 使用
BackendTLSPolicy 命名空间 集群管理员 后端 TLS 连接策略 关联 Service
学习建议: 在实际部署中,建议按照 GatewayClass → Gateway → ReferenceGrant → BackendTLSPolicy → HTTPRoute 的顺序创建资源,确保依赖关系正确建立。