Gateway API资源配额模型:数据传输优化实战 - 第2节
2.1 Gateway API 的起源:从 Ingress 到下一代网关标准
Kubernetes 原生 Ingress 资源自 1.1 版本引入以来,一直是南北向流量接入的事实标准。然而,随着云原生架构向多集群、多协议、精细化流量治理演进,Ingress 的局限性日益凸显。Gateway API 正是在这一背景下,由 SIG-NETWORK 于 2020 年发起,旨在构建一个更强大、更可扩展、面向角色的 API 网关标准。
Ingress 的三大痛点
| 痛点 | 具体表现 | 影响范围 |
|---|---|---|
| 资源模型单一 | 仅 Ingress 一个资源承载路由规则、TLS 配置、后端服务绑定,职责过重 | 配置复杂,难以拆分管理 |
| 角色耦合严重 | 基础设施管理员、应用开发者、安全运维者共用同一资源,权限粒度粗 | 安全风险高,变更影响面大 |
| 扩展性差 | 高级功能依赖 Annotation 或 CRD,不同实现之间无法互操作 | 厂商锁定,迁移成本高 |
Gateway API 从设计之初就明确了三个目标:面向角色(Role-oriented)、可移植(Portable)、富有表现力(Expressive)。它通过分层资源模型,将基础设施、路由策略、后端服务的管理职责解耦,让每个角色只关注自己负责的配置层。
2.2 核心概念:三层资源模型
Gateway API 的核心创新在于将传统 Ingress 的单一资源拆解为三个层次:GatewayClass(基础设施层)、Gateway(接入层)、Route(路由策略层)。这种分层设计使得不同角色的职责边界清晰,配置可组合、可复用。
2.2.1 GatewayClass —— 基础设施抽象
GatewayClass 是集群级别的资源,由基础设施管理员定义,描述了一类网关实现的规格和能力。它类似于 StorageClass 对存储的抽象,定义了网关的控制器类型、参数模板和实现版本。
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-proxy-config
namespace: envoy-gateway-system
| 字段 | 说明 | 管理角色 |
|---|---|---|
controllerName |
唯一标识网关控制器的名称,决定由哪个实现处理该 GatewayClass | 基础设施管理员 |
parametersRef |
可选,引用实现特定的配置参数(如 EnvoyProxy 的自定义资源) | 基础设施管理员 |
description |
人类可读的描述信息,用于文档化 | 基础设施管理员 |
2.2.2 Gateway —— 网络接入点
Gateway 资源代表一个具体的网络接入点,由集群运维人员管理。它定义了监听器(Listener)的协议、端口、TLS 配置,以及关联的 GatewayClass。Gateway 是流量进入集群的入口,可以对应一个负载均衡器、虚拟 IP 或 NodePort。
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: prod-gateway
namespace: infra-gateways
spec:
gatewayClassName: eg
listeners:
- name: https
protocol: HTTPS
port: 443
hostname: "*.example.com"
tls:
mode: Terminate
certificateRefs:
- name: example-com-cert
- name: http
protocol: HTTP
port: 80
hostname: "*.example.com"
| 字段 | 说明 | 管理角色 |
|---|---|---|
gatewayClassName |
引用集群中已定义的 GatewayClass | 集群运维人员 |
listeners |
定义监听地址、端口、协议、TLS 配置、允许的主机名 | 集群运维人员 |
addresses |
可选,指定网关绑定的 IP 地址或主机名 | 集群运维人员 |
2.2.3 Route —— 流量路由策略
Route 资源由应用开发者定义,描述了如何将进入 Gateway 的流量路由到后端服务。Gateway API 定义了多种 Route 类型,覆盖不同的协议和场景:
- HTTPRoute:基于 HTTP 方法、路径、Header、Query 参数的路由,支持权重拆分、镜像、重定向
- HTTPSRoute:基于 SNI 的 TLS 路由,适用于 TLS 透传场景
- TCPRoute:基于端口和源 IP 的四层路由
- UDPRoute:基于端口的 UDP 路由
- GRPCRoute:针对 gRPC 协议优化的路由,支持 gRPC 方法匹配
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: store-route
namespace: store-app
spec:
parentRefs:
- name: prod-gateway
namespace: infra-gateways
sectionName: https
hostnames:
- "store.example.com"
rules:
- matches:
- path:
type: PathPrefix
value: /api
backendRefs:
- name: store-api-svc
port: 8080
weight: 90
- name: store-api-canary-svc
port: 8080
weight: 10
- matches:
- path:
type: PathPrefix
value: /static
backendRefs:
- name: store-static-svc
port: 80
parentRefs 显式关联到 Gateway,且只能关联到同一集群内的 Gateway。跨命名空间引用时,需要确保目标 Gateway 的 allowedRoutes 配置允许该命名空间的 Route 接入。
2.3 与传统 Ingress 的对比
Gateway API 并非简单地替代 Ingress,而是在设计哲学、资源模型、功能覆盖和生态兼容性上进行了全面升级。以下从多个维度进行对比:
| 对比维度 | 传统 Ingress | Gateway API |
|---|---|---|
| 资源模型 | 单一资源,职责耦合 | 三层模型:GatewayClass → Gateway → Route |
| 角色分离 | 所有配置集中在 Ingress 资源,角色模糊 | 基础设施管理员、集群运维、应用开发者各司其职 |
| 协议支持 | 仅 HTTP/HTTPS(标准),TCP/UDP 依赖扩展 | 原生支持 HTTP、HTTPS、TLS、TCP、UDP、gRPC |
| 流量管理 | 基础路由,权重拆分需 Annotation | 原生支持权重拆分、镜像、重定向、Header 修改 |
| 跨命名空间 | 不支持(需同命名空间) | 支持,通过 ReferenceGrant 控制跨命名空间引用 |
| 扩展性 | 通过 Annotation 或 CRD,无统一规范 | Policy Attachment 机制,可扩展且可移植 |
| 生态成熟度 | 广泛使用,但实现碎片化 | v1.0 GA,主流网关均已支持(Envoy、Contour、Istio、Kong) |
2.4 从 Ingress 迁移到 Gateway API 的策略
对于已有 Ingress 资源的集群,迁移到 Gateway API 并非一蹴而就。推荐采用渐进式迁移策略:
- 评估阶段:梳理现有 Ingress 资源,识别使用的 Annotation 和扩展功能,确认 Gateway API 实现是否支持
- 并行部署:在集群中同时部署 Ingress Controller 和 Gateway API 实现,将部分非关键业务迁移到 Gateway API
- 功能验证:对比 Ingress 和 Gateway API 的路由行为,确保流量转发、TLS 终止、权重拆分等功能一致
- 全面切换:确认 Gateway API 稳定运行后,逐步将剩余 Ingress 资源迁移,最终下线 Ingress Controller
ingress2gateway 工具,可以自动将 Ingress 资源转换为 Gateway API 资源,大幅降低迁移成本。但建议对自动生成的配置进行人工审查,特别是涉及 Annotation 转换的部分。