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 连接策略。
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 监听器,实现灵活的路由分发。
- 精确匹配(Exact): 优先级最高,完全匹配路径。
- 前缀匹配(PathPrefix): 匹配路径前缀,如
/api/。 - 正则匹配(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
2.7 资源模型对比总结
为了帮助学员快速理解五个核心资源的定位与差异,下表从 作用域、创建者、核心职责 和 依赖关系 四个维度进行对比:
| 资源名称 | 作用域 | 创建者 | 核心职责 | 依赖关系 |
|---|---|---|---|---|
| GatewayClass | 集群 | 基础设施提供商 | 定义网关实现类型 | 被 Gateway 引用 |
| Gateway | 命名空间 | 集群管理员 | 实例化网关、监听器、TLS | 引用 GatewayClass |
| HTTPRoute | 命名空间 | 应用开发者 | 定义路由规则与后端绑定 | 引用 Gateway |
| ReferenceGrant | 命名空间 | 集群管理员 | 跨命名空间引用授权 | 被 HTTPRoute 使用 |
| BackendTLSPolicy | 命名空间 | 集群管理员 | 后端 TLS 连接策略 | 关联 Service |
GatewayClass → Gateway → ReferenceGrant → BackendTLSPolicy → HTTPRoute 的顺序创建资源,确保依赖关系正确建立。