3. Gateway API 概述:起源、核心概念与 Ingress 对比

Gateway API 是 Kubernetes 社区为解决传统 Ingress API 在表达能力、多团队协作、协议扩展和流量治理方面的不足而推出的新一代网关抽象层。本章从起源、核心资源模型以及与 Ingress API 的对比三个维度,帮助学员建立对 Gateway API 的完整认知。

3.1 起源:从 Ingress 到 Gateway API 的演进

Kubernetes 原生 Ingress API(networking.k8s.io/v1)自 1.1 版本引入,提供了基于 HTTP/HTTPS 的七层路由能力。然而,随着云原生网关场景的复杂化,Ingress 的局限性日益凸显:

  • 协议单一:仅支持 HTTP/HTTPS,无法原生处理 TCP、UDP、gRPC、TLS 透传等协议。
  • 职责模糊:Ingress 资源同时承载“网关配置”与“路由规则”,导致多团队协作时配置冲突。
  • 扩展性差:通过 Annotation 实现厂商特定功能,缺乏标准化,导致配置不可移植。
  • 缺少分层抽象:基础设施团队与应用团队共享同一资源,无法实现职责分离。

Gateway API 由 SIG-Network 于 2020 年发起,旨在解决上述问题。其设计目标包括:面向角色(Role-oriented)、可移植(Portable)、表达性强(Expressive)、可扩展(Extensible)。

关键里程碑: Gateway API v1.0(GA)于 2023 年 10 月发布,标志着 API 进入稳定阶段。当前最新版本为 v1.2(2024 年 12 月),新增了 BackendTLSPolicy、GRPCRoute 等核心特性。

3.2 核心概念:三大资源模型

Gateway API 的核心由三个资源构成:GatewayClass、Gateway、HTTPRoute。它们形成了从“基础设施定义”到“流量路由”的完整分层模型。

3.2.1 GatewayClass

GatewayClass 是集群级别的资源,由基础设施管理员定义,用于声明可用的网关实现(如 Istio、Contour、NGINX、HAProxy 等)。它类似于 IngressClass,但语义更丰富。

apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: example-gateway-class
spec:
  controllerName: "istio.io/gateway-controller"
  parametersRef:
    group: "example.com"
    kind: "Config"
    name: "gateway-config"
    namespace: "gateway-system"

3.2.2 Gateway

Gateway 是命名空间级别的资源,由集群运维人员定义,代表一个具体的网关实例。它描述了监听器(Listener)的协议、端口、TLS 配置以及关联的 GatewayClass。

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: my-gateway
  namespace: infra
spec:
  gatewayClassName: example-gateway-class
  listeners:
  - name: http
    protocol: HTTP
    port: 80
    allowedRoutes:
      namespaces:
        from: Selector
        selector:
          matchLabels:
            app: frontend
  - name: https
    protocol: HTTPS
    port: 443
    tls:
      mode: Terminate
      certificateRefs:
      - name: my-tls-cert

3.2.3 HTTPRoute

HTTPRoute 是命名空间级别的资源,由应用开发者定义,用于描述 HTTP 流量的路由规则。它支持路径匹配、Header 匹配、权重分发、过滤器(重定向、重写、请求镜像)等高级特性。

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: my-app-route
  namespace: app-team
spec:
  parentRefs:
  - name: my-gateway
    namespace: infra
  hostnames:
  - "app.example.com"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /api
    backendRefs:
    - name: api-service
      port: 8080
      weight: 90
    - name: api-service-canary
      port: 8080
      weight: 10
  - matches:
    - path:
        type: Exact
        value: /healthz
    backendRefs:
    - name: health-service
      port: 9090
角色分离设计: GatewayClass 由基础设施团队管理,Gateway 由平台团队管理,HTTPRoute 由应用团队管理。这种分层使得不同角色可以在各自的资源范围内独立操作,避免配置冲突。

3.3 核心资源关系图

下图展示了 GatewayClass、Gateway、HTTPRoute 三者之间的关联关系,以及它们与后端 Service 的最终绑定。

Gateway API 核心资源关系图 Gateway API 核心资源关系图 GatewayClass 集群级 · 定义实现 Gateway 命名空间级 · 定义监听器 HTTPRoute 命名空间级 · 定义路由规则 Service 后端工作负载 spec.gatewayClassName parentRefs backendRefs 角色职责分离 基础设施管理员 → GatewayClass | 集群运维人员 → Gateway | 应用开发者 → HTTPRoute 三者通过 parentRefs 和 gatewayClassName 形成引用链,最终将流量路由至后端 Service。

3.4 与 Ingress API 的对比

Gateway API 并非 Ingress 的简单替代,而是一次架构层面的升级。下表从多个维度对比两者的核心差异:

对比维度 Ingress API Gateway API
资源模型 单一资源(Ingress)承载路由与网关配置 三层资源模型:GatewayClass / Gateway / Route
角色分离 无原生角色分离,所有配置集中在同一资源 面向角色设计:基础设施、平台、应用各司其职
协议支持 仅 HTTP/HTTPS HTTP、HTTPS、TLS 透传、TCP、UDP、gRPC(通过 GRPCRoute)
路由匹配 路径前缀、主机名 路径(Exact/Prefix/RegularExpression)、Header、QueryParam、Method
流量治理 无原生支持,依赖 Annotation 权重分发、请求镜像、重定向、重写、自定义过滤器
跨命名空间 不支持(需 IngressClass 配合) 原生支持,通过 allowedRoutes 控制跨命名空间引用
TLS 配置 仅支持 TLS 终止 支持 TLS 终止、TLS 透传(Passthrough)、双向 TLS(mTLS)
扩展性 通过 Annotation 扩展,不可移植 通过 Policy Attachment(如 BackendTLSPolicy)和自定义 Route 类型扩展
状态反馈 无标准状态字段 提供丰富的 Status 字段,包括 Accepted、ResolvedRefs、Condition 等

3.5 从 Ingress 到 Gateway API 的迁移路径

对于已有 Ingress 资源的集群,Gateway API 提供了平滑的迁移策略:

  1. 并行部署:在集群中同时部署 Ingress 控制器和 Gateway API 控制器,新服务使用 Gateway API,旧服务保持 Ingress。
  2. 逐步迁移:将 Ingress 资源中的路由规则逐步转换为 HTTPRoute,并通过 Gateway 资源统一管理监听器。
  3. 统一管理:待所有流量迁移完成后,移除 Ingress 控制器,仅保留 Gateway API 控制器。
注意: 迁移过程中需关注 Ingress 中通过 Annotation 实现的厂商特定功能(如 SSL 重定向、CORS 配置)。Gateway API 提供了标准化的过滤器机制,建议在迁移前评估功能等价性。

3.6 本章小结