Gateway API 基础回顾:核心概念、与传统 Ingress 的对比及架构优势
在深入延迟诊断之前,必须先厘清 Gateway API 的核心抽象层。与 Kubernetes 原生 Ingress 的“扁平化”路由规则不同,Gateway API 通过 GatewayClass、Gateway、HTTPRoute 三层模型,将基础设施提供方、集群运维方和应用开发方的职责解耦。这种分层设计直接影响了延迟链路的可观测性和资源配额的控制粒度。
2.1 核心概念:三层模型
Gateway API 的核心在于将网络配置从“单体资源”拆解为三个独立但关联的 API 对象。每一层都有明确的关注点和生命周期。
关键认知: 三层模型不是简单的“继承”关系,而是通过
parentRef 和 gatewayClassName 字段建立松耦合的引用。这种设计使得基础设施团队可以独立升级网关实现,而应用团队只需关注路由规则。
| API 对象 | 作用域 | 主要职责 | 典型所有者 |
|---|---|---|---|
| GatewayClass | 集群级 | 定义网关实现的“类”,类似 StorageClass。指定控制器名称(如 istio.io/gateway-controller)和参数引用。 |
基础设施提供商 / 平台管理员 |
| Gateway | 命名空间级 | 描述具体的网关实例。声明监听器(Listener)的协议、端口、TLS 配置,并引用一个 GatewayClass。 | 集群运维 / 平台工程师 |
| HTTPRoute | 命名空间级 | 定义 HTTP 流量的路由规则。包含主机名、匹配条件、过滤器(Filter)和后端服务引用(BackendRef)。 | 应用开发 / 服务所有者 |
以下是一个典型的 GatewayClass 声明示例,它定义了集群中可用的网关“类型”:
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: istio-gateway-class
spec:
controllerName: istio.io/gateway-controller
parametersRef:
group: ""
kind: ConfigMap
name: istio-gateway-params
namespace: istio-system
而 Gateway 实例则通过 gatewayClassName 引用上述类,并绑定具体的监听端口:
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: public-gateway
namespace: gateway-infra
spec:
gatewayClassName: istio-gateway-class
listeners:
- name: http
protocol: HTTP
port: 80
allowedRoutes:
namespaces:
from: Selector
selector:
matchLabels:
app-tier: frontend
最后,应用团队通过 HTTPRoute 将流量绑定到 Gateway 的监听器上:
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: user-service-route
namespace: user-app
spec:
parentRefs:
- name: public-gateway
namespace: gateway-infra
hostnames:
- "api.example.com"
rules:
- matches:
- path:
type: PathPrefix
value: /users
backendRefs:
- name: user-svc
port: 8080
2.2 与传统 Ingress 的对比
Kubernetes 原生 Ingress 在 v1 时代解决了“七层路由”的从无到有问题,但在生产环境中暴露出多个痛点。Gateway API 并非简单的“升级版”,而是对网络配置模型的重新设计。
| 对比维度 | 传统 Ingress | Gateway API |
|---|---|---|
| 资源模型 | 单一资源,所有路由规则和监听配置混在一起 | 三层分离:GatewayClass / Gateway / HTTPRoute |
| 职责边界 | 应用开发者通常需要了解 Ingress Controller 的注解 | 通过角色分离,应用开发者只需关心 HTTPRoute |
| 协议支持 | 核心仅支持 HTTP/HTTPS,扩展依赖注解 | 原生支持 HTTP、HTTPS、TCP、UDP、TLS 等 |
| 流量管理 | 权重路由、Header 匹配等需通过特定注解实现 | 原生支持权重、Header、Query Param、过滤器链 |
| 跨命名空间 | 默认不支持,需通过 Ingress Controller 扩展 | 通过 ReferenceGrant 机制原生支持跨命名空间引用 |
| 可扩展性 | 通过注解(Annotation)扩展,缺乏类型安全 | 通过 Policy Attachment 和自定义过滤器扩展 |
| 延迟可观测性 | 依赖 Ingress Controller 自身暴露的指标 | 标准化的状态字段和 Condition,便于集成 |
延迟诊断视角: 传统 Ingress 的“扁平化”配置使得延迟问题的根因定位变得困难——是 Ingress Controller 的配置问题?还是后端服务的性能问题?Gateway API 的三层模型天然提供了“分层诊断”的切入点:可以在 Gateway 层检查监听器状态,在 HTTPRoute 层检查路由匹配效率,在后端引用层检查服务响应时间。
2.3 架构优势:为什么选择 Gateway API
从延迟诊断和资源配额协同的角度,Gateway API 的架构优势体现在以下四个核心方面:
- 角色职责分离(Role-based Configuration):平台团队管理 GatewayClass 和 Gateway 的容量与配额,应用团队只管理 HTTPRoute。这种分离避免了“配置冲突”导致的意外延迟增加。
- 标准化状态与条件(Standardized Status):每个 Gateway API 资源都有
status.conditions字段,提供机器可读的“就绪”状态。延迟诊断时可以直接查询资源状态,而非解析日志。 - 原生支持流量分割与镜像:HTTPRoute 的
backendRefs支持权重路由和流量镜像,无需额外注解。这对于“金丝雀发布”场景下的延迟对比至关重要。 - Policy Attachment 机制:通过
policy资源(如 RateLimitPolicy、RetryPolicy)可以独立于路由规则附加策略,实现“配额与路由解耦”。
迁移注意: 虽然 Gateway API 提供了更清晰的架构,但并非所有 Ingress Controller 都完全实现了 Gateway API 的全部特性。在迁移前,务必确认你的网关实现(如 Istio、Contour、Kong)支持的 Gateway API 版本和功能集。不完整的实现可能导致路由规则不生效,进而引发“静默丢包”式的延迟问题。