3. Gateway API 架构原理:控制面与数据面分离、声明式 API、面向角色的设计理念

Gateway API 是 Kubernetes 社区下一代入口流量管理的标准,其架构设计围绕三个核心理念展开:控制面与数据面分离、声明式 API 以及 面向角色的设计。这三个理念共同解决了传统 Ingress 在扩展性、可维护性和多团队协作上的痛点。

3.1 控制面与数据面分离

在传统 Ingress 中,控制逻辑与数据转发逻辑往往耦合在同一个控制器中。Gateway API 通过明确的资源分层,将“谁来配置”与“谁来转发”彻底解耦。

  • 控制面:由 GatewayClass 和 Gateway 资源组成,负责定义入口网关的拓扑结构、监听端口、TLS 证书等基础设施配置。控制面组件(如 Gateway Controller)监听这些资源,并驱动底层数据面组件生效。
  • 数据面:由 HTTPRoute、TCPRoute 等路由资源组成,负责定义流量转发规则、后端服务选择、重定向、重写等业务逻辑。数据面组件(如 Envoy、HAProxy 实例)实际处理客户端请求。
关键收益:基础设施团队可以独立管理 Gateway 的生命周期,而应用团队只需关注 Route 资源的声明,无需关心底层网关的部署细节。
控制面与数据面分离架构图 控制面与数据面分离架构 控制面 (Control Plane) GatewayClass Gateway Gateway Controller 数据面 (Data Plane) HTTPRoute / TCPRoute Backend (Service/Pod) Envoy / HAProxy 实例 控制面负责配置下发,数据面负责流量转发;两者通过 Kubernetes API 进行声明式交互。

3.2 声明式 API

Gateway API 遵循 Kubernetes 声明式模型。用户通过 YAML 或 JSON 描述期望的网关状态,控制器负责将实际状态收敛到期望状态。这种设计带来了以下优势:

  • 可审计性:所有配置变更都记录在 Kubernetes API Server 中,形成完整的变更历史。
  • 自愈能力:当数据面组件异常时,控制器会自动重新下发配置,确保流量规则持续生效。
  • 版本化管理:支持通过 kubectl apply 进行增量更新,避免手动修改配置文件带来的风险。

以下是一个典型的声明式 Gateway API 配置示例:

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: my-gateway
  namespace: infra
spec:
  gatewayClassName: my-gateway-class
  listeners:
  - name: http
    protocol: HTTP
    port: 80
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: my-app-route
  namespace: apps
spec:
  parentRefs:
  - name: my-gateway
    namespace: infra
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /api
    backendRefs:
    - name: my-service
      port: 8080
实践建议:将 Gateway 资源放在基础设施命名空间(如 infra),将 Route 资源放在应用命名空间(如 apps),利用 Kubernetes RBAC 实现跨团队的安全隔离。

3.3 面向角色的设计理念

Gateway API 将资源模型与组织角色对齐,每个角色只关注自己职责范围内的资源,降低了多团队协作的复杂度。

角色 职责 管理的资源 典型操作
基础设施提供者 管理网关的底层实现(如云负载均衡器、Ingress Controller) GatewayClass 定义网关实现类型、部署策略
集群运维者 管理网关的拓扑结构、监听端口、TLS 证书 Gateway 创建/更新/删除 Gateway 实例
应用开发者 定义流量路由规则、后端服务选择 HTTPRoute、TCPRoute、TLSRoute 声明路由规则、配置重定向/重写

这种角色分离避免了传统 Ingress 中“一个 YAML 文件需要多个团队审批”的瓶颈。每个角色在自己的资源范围内独立工作,通过 parentRefs 字段建立跨资源的引用关系。

面向角色的资源关系图 面向角色的资源关系 基础设施提供者 GatewayClass 定义网关实现类型 集群运维者 Gateway 管理监听端口/TLS 应用开发者 HTTPRoute 定义路由规则 每个角色只管理自己职责范围内的资源,通过 parentRefs 建立跨角色引用,实现安全协作。

3.4 三种理念的协同效应

控制面与数据面分离、声明式 API、面向角色的设计并非孤立存在,它们共同构成了 Gateway API 的架构基石:

  • 分离带来灵活性:控制面与数据面分离使得基础设施团队可以独立升级网关实现,而不影响应用团队的路由规则。
  • 声明式保证一致性:声明式 API 确保所有角色的配置都通过统一的 Kubernetes API 进行管理,避免了配置漂移。
  • 角色对齐降低复杂度:面向角色的设计让每个团队只关注自己熟悉的资源,减少了跨团队沟通成本。
常见误区:不要将 Gateway API 视为 Ingress 的简单升级。它的架构设计更适合多团队、多租户、多集群的复杂场景。如果只是单团队管理少量服务,传统 Ingress 可能更轻量。