Gateway API资源配额模型:数据传输优化实战 - 第2节

2.1 Gateway API 的起源:从 Ingress 到下一代网关标准

Kubernetes 原生 Ingress 资源自 1.1 版本引入以来,一直是南北向流量接入的事实标准。然而,随着云原生架构向多集群、多协议、精细化流量治理演进,Ingress 的局限性日益凸显。Gateway API 正是在这一背景下,由 SIG-NETWORK 于 2020 年发起,旨在构建一个更强大、更可扩展、面向角色的 API 网关标准。

核心驱动力:Ingress 仅定义了 HTTP(S) 路由的单一资源,缺乏对 TCP/UDP、TLS 终止、流量拆分、Header 修改等高级特性的原生支持,且不同 Ingress Controller 通过 Annotation 扩展导致生态碎片化严重。

Ingress 的三大痛点

痛点 具体表现 影响范围
资源模型单一 仅 Ingress 一个资源承载路由规则、TLS 配置、后端服务绑定,职责过重 配置复杂,难以拆分管理
角色耦合严重 基础设施管理员、应用开发者、安全运维者共用同一资源,权限粒度粗 安全风险高,变更影响面大
扩展性差 高级功能依赖 Annotation 或 CRD,不同实现之间无法互操作 厂商锁定,迁移成本高

Gateway API 从设计之初就明确了三个目标:面向角色(Role-oriented)、可移植(Portable)、富有表现力(Expressive)。它通过分层资源模型,将基础设施、路由策略、后端服务的管理职责解耦,让每个角色只关注自己负责的配置层。

Gateway API 起源:从 Ingress 到下一代网关标准 Kubernetes Ingress 单一资源 · Annotation 扩展 角色耦合 · 协议受限 社区共识期 SIG-NETWORK 主导 2020 年 v1alpha1 Gateway API 分层资源 · 角色解耦 多协议 · 可移植 关键里程碑 • 2020.06:Gateway API v1alpha1 发布,提出 GatewayClass/Gateway/Route 三层模型 • 2021.10:v1beta1 版本,引入 HTTPRoute 和 TLSRoute,社区实现超过 10 个 • 2023.06:v1.0 GA 发布,标志着 Gateway API 生产就绪

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 人类可读的描述信息,用于文档化 基础设施管理员
最佳实践:每个集群通常只定义 1-2 个 GatewayClass(如:一个用于内部流量,一个用于外部流量),避免过多 GatewayClass 导致管理混乱。GatewayClass 一旦创建,不建议频繁修改。

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
注意:Route 资源必须通过 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)
Gateway API 三层资源模型与角色映射 GatewayClass 基础设施抽象 基础设施管理员 Gateway 网络接入点 集群运维人员 Route 流量路由策略 应用开发者 💡 每个角色只管理自己负责的资源层:基础设施管理员定义 GatewayClass,集群运维人员部署 Gateway,应用开发者编写 Route 规则

2.4 从 Ingress 迁移到 Gateway API 的策略

对于已有 Ingress 资源的集群,迁移到 Gateway API 并非一蹴而就。推荐采用渐进式迁移策略:

  1. 评估阶段:梳理现有 Ingress 资源,识别使用的 Annotation 和扩展功能,确认 Gateway API 实现是否支持
  2. 并行部署:在集群中同时部署 Ingress Controller 和 Gateway API 实现,将部分非关键业务迁移到 Gateway API
  3. 功能验证:对比 Ingress 和 Gateway API 的路由行为,确保流量转发、TLS 终止、权重拆分等功能一致
  4. 全面切换:确认 Gateway API 稳定运行后,逐步将剩余 Ingress 资源迁移,最终下线 Ingress Controller
迁移工具:社区提供了 ingress2gateway 工具,可以自动将 Ingress 资源转换为 Gateway API 资源,大幅降低迁移成本。但建议对自动生成的配置进行人工审查,特别是涉及 Annotation 转换的部分。