2. 核心概念:Gateway API 资源模型与 Ingress 对比

Gateway API 是 Kubernetes 社区下一代入口网关标准,其核心设计理念是角色分离与声明式路由。与传统的 Ingress 资源相比,Gateway API 将网络配置拆解为三个独立的资源层:GatewayClass、Gateway 和 HTTPRoute。这种分层模型让基础设施管理员、集群运维人员和应用开发者各司其职,避免权限越界和配置冲突。

2.1 三层资源模型详解

核心原则:Gateway API 通过资源分层实现关注点分离。每一层只关注自己职责范围内的配置,下层资源由上层资源引用并绑定。

2.1.1 GatewayClass — 基础设施抽象

GatewayClass 是集群范围的资源,由基础设施提供商(如云厂商、硬件设备商)或集群管理员定义。它描述了一类网关的实现方式,类似于 StorageClass 对存储后端的抽象。

  • 作用:定义网关的控制器名称、参数引用(如负载均衡器规格、网络插件配置)。
  • 作用域:集群级别,不可跨命名空间。
  • 典型字段:spec.controllerName(控制器标识)、spec.parametersRef(可选参数引用)。
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: my-lb-gateway-class
spec:
  controllerName: "example.com/my-lb-controller"
  parametersRef:
    group: "example.com"
    kind: "LBParams"
    name: "my-lb-config"

2.1.2 Gateway — 网关实例声明

Gateway 是命名空间级别的资源,由集群运维人员或平台团队创建。它代表一个具体的网关实例(如负载均衡器、API 网关),并绑定到某个 GatewayClass。

  • 作用:定义监听器(Listener)的协议、端口、TLS 配置,以及允许哪些命名空间的路由绑定到该网关。
  • 作用域:命名空间级别,可跨命名空间引用路由。
  • 关键字段:spec.gatewayClassName、spec.listeners(协议、端口、主机名、TLS)、spec.addresses(可选固定 IP)。
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: my-gateway
  namespace: infra
spec:
  gatewayClassName: my-lb-gateway-class
  listeners:
  - name: http
    protocol: HTTP
    port: 80
    allowedRoutes:
      namespaces:
        from: Selector
        selector:
          matchLabels:
            app-tier: frontend
  - name: https
    protocol: HTTPS
    port: 443
    tls:
      mode: Terminate
      certificateRefs:
      - name: my-tls-cert

2.1.3 HTTPRoute — 应用路由规则

HTTPRoute 是命名空间级别的资源,由应用开发者或服务所有者编写。它定义了 HTTP 流量的匹配条件、转发目标、重定向、重写等行为,并绑定到指定的 Gateway。

  • 作用:声明式定义流量路由规则,支持路径匹配、Header 匹配、权重分发、镜像流量等高级特性。
  • 作用域:命名空间级别,通过 spec.parentRefs 绑定到 Gateway。
  • 关键字段:spec.parentRefs(绑定目标 Gateway)、spec.hostnames、spec.rules(匹配条件 + 后端服务)。
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: my-app-route
  namespace: app
spec:
  parentRefs:
  - name: my-gateway
    namespace: infra
  hostnames:
  - "myapp.example.com"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /api/v1
    backendRefs:
    - name: api-service-v1
      port: 8080
      weight: 90
    - name: api-service-v2
      port: 8080
      weight: 10

2.2 三层资源协作关系

下图展示了 GatewayClass、Gateway、HTTPRoute 之间的引用与绑定关系,以及各层对应的角色职责。

Gateway API 三层资源模型协作关系 Gateway API 三层资源模型协作关系 GatewayClass 集群范围 · 基础设施抽象 角色:基础设施提供商 Gateway 命名空间范围 · 网关实例 角色:集群运维人员 HTTPRoute 命名空间范围 · 路由规则 角色:应用开发者 引用 绑定 流量路径 客户端 → Gateway(监听器) → HTTPRoute(匹配规则) → 后端 Service 角色职责矩阵 基础设施提供商 定义 GatewayClass 集群运维人员 管理 Gateway 实例 应用开发者 编写 HTTPRoute 规则

2.3 与传统 Ingress 的对比

传统 Ingress 资源将所有配置(监听器、路由规则、TLS 证书)塞进一个资源对象中,导致以下问题:

  • 角色耦合:集群管理员和应用开发者的配置混在一起,权限难以隔离。
  • 扩展性差:Ingress 规范只支持基础的路由匹配,高级特性(如流量拆分、Header 修改、重定向)依赖注解,不同实现注解不兼容。
  • 跨命名空间困难:Ingress 默认只能引用同命名空间的后端 Service,跨命名空间需要额外配置。

下表从多个维度对比 Gateway API 与传统 Ingress 的差异:

对比维度 传统 Ingress Gateway API
资源模型 单一资源,所有配置耦合 三层分离:GatewayClass / Gateway / HTTPRoute
角色分离 无,管理员与开发者共用同一资源 清晰分离:基础设施 / 集群运维 / 应用开发者
路由匹配能力 仅支持路径和主机名匹配 支持路径、Header、Query Param、Method 等精确匹配
流量管理 依赖注解,实现不统一 原生支持权重分发、镜像流量、重定向、重写
跨命名空间 受限,需额外配置 原生支持,通过 allowedRoutes 控制
TLS 配置 仅支持简单的证书引用 支持 TLS 终止、透传、双向认证
扩展性 通过 CRD 和注解扩展,碎片化严重 原生支持 Policy Attachment、BackendTLSPolicy 等扩展点
向后兼容 — 提供 Ingress 到 HTTPRoute 的迁移路径

2.4 为什么 Gateway API 更适合流量回滚护栏

在流量回滚场景中,我们需要精细控制流量切分的粒度、速率和条件。Gateway API 的 HTTPRoute 原生支持以下能力,这些能力是传统 Ingress 难以实现的:

  • 权重分发:通过 backendRefs[].weight 实现蓝绿部署和金丝雀发布,回滚时只需调整权重比例。
  • 基于 Header 的匹配:可以针对特定用户、测试流量或内部请求进行路由,实现灰度验证。
  • 镜像流量:将实时流量复制到新版本,用于观察而不影响线上用户。
  • 策略绑定:通过 PolicyAttachment 机制,可以附加限流、重试、熔断等策略,形成完整的回滚护栏。
实践建议:在迁移到 Gateway API 时,建议先从 HTTPRoute 替换 Ingress 开始,保留原有的 GatewayClass 和 Gateway 由平台团队统一管理。这样应用开发者可以快速获得流量拆分能力,而基础设施层保持不变。

2.5 资源模型与回滚护栏的映射

下图展示了 Gateway API 三层资源如何映射到流量回滚护栏架构中的不同组件:

Gateway API 资源模型映射到流量回滚护栏 Gateway API 资源模型 → 流量回滚护栏映射 GatewayClass Gateway HTTPRoute 负载均衡器规格 监听器 + TLS 配置 流量拆分 + 回滚规则 回滚护栏关键能力 HTTPRoute 支持权重调整、Header 匹配、镜像流量 结合 PolicyAttachment 实现限流、熔断、重试策略