2. Gateway API 基础:核心概念与传统 Ingress 对比
在云原生网关演进中,Kubernetes 原生 Ingress 资源因功能边界模糊、扩展性差、多团队协作困难等问题逐渐暴露出局限性。Gateway API 作为下一代网关标准,通过分层抽象和角色分离,为灰度发布、流量回滚等场景提供了更精确的控制面。本节将系统梳理 Gateway API 的三大核心概念,并与传统 Ingress 进行多维度对比。
2.1 三大核心概念
Gateway API 将网关配置拆解为三个独立资源,分别对应基础设施提供者、集群运维者和应用开发者三个角色:
| 资源 | API 版本(稳定) | 管理角色 | 核心职责 |
|---|---|---|---|
| GatewayClass | gateway.networking.k8s.io/v1 | 基础设施提供者 | 定义网关实现类型(如 Nginx、Istio、Contour)及默认参数 |
| Gateway | gateway.networking.k8s.io/v1 | 集群运维者 | 声明网关实例的监听端口、协议、证书及关联的 GatewayClass |
| HTTPRoute | gateway.networking.k8s.io/v1 | 应用开发者 | 定义 HTTP 流量路由规则,包括匹配、转发、重试、超时、灰度权重 |
角色分离设计要点: GatewayClass 由平台团队或云厂商预置,应用开发者无需感知底层实现;Gateway 实例由集群管理员按需创建,绑定证书和网络策略;HTTPRoute 由业务团队独立编写,通过 label selector 与 Gateway 建立松耦合关联。这种分层避免了传统 Ingress 中“一个 YAML 文件同时包含网络配置和路由规则”的混乱局面。
2.2 核心概念关系图
下图展示了 GatewayClass、Gateway、HTTPRoute 三者之间的引用与绑定关系,以及它们如何共同构成完整的流量接入链路:
2.3 与传统 Ingress 的全面对比
传统 Ingress 在 v1 版本中仅提供基础的路由和 TLS 终止能力,而 Gateway API 在功能粒度、扩展性和多团队协作方面进行了根本性重构。以下从 8 个关键维度进行对比:
| 对比维度 | 传统 Ingress | Gateway API |
|---|---|---|
| 资源模型 | 单一 Ingress 资源承载路由 + 证书 + 后端 | GatewayClass / Gateway / HTTPRoute 三层分离 |
| 角色权限 | 所有配置集中在同一 YAML,难以按角色拆分 | 基础设施、运维、应用开发者各管一层,RBAC 天然对齐 |
| 流量灰度 | 依赖 annotation 扩展,无原生权重/Header 匹配 | HTTPRoute 原生支持权重、Header、QueryParam 灰度规则 |
| 协议支持 | 仅 HTTP/HTTPS,TCP/UDP 需 CRD 或第三方 | 原生支持 HTTP、HTTPS、TCP、UDP、TLS、gRPC |
| 后端类型 | 仅 Service,不支持跨命名空间 | 支持 Service、ServiceImport、自定义后端,支持跨命名空间 |
| 扩展机制 | annotation 方式,无类型安全,易冲突 | Policy Attachment + 自定义 Route 类型,强类型扩展 |
| 回滚能力 | 无原生回滚语义,需手动修改 Ingress 资源 | HTTPRoute 支持权重回滚、版本回退、条件回滚策略 |
| 多集群 | 无原生支持,需额外工具 | 支持多集群 Service 暴露,配合 ServiceImport 实现全局负载 |
灰度验证关键差异: 传统 Ingress 要实现 10% 流量灰度到 v2 版本,通常需要安装 Nginx Ingress Controller 并编写复杂的 annotation(如
nginx.ingress.kubernetes.io/canary-weight: "10"),且无法在一条规则中同时匹配 Header 和权重。Gateway API 的 HTTPRoute 通过 matches 和 backendRefs 字段即可原生表达,且支持多条 Route 叠加,为流水线中的回滚护栏提供了标准化的控制接口。
2.4 HTTPRoute 灰度规则示例
以下是一个典型的灰度发布 HTTPRoute 配置,展示了 Gateway API 如何原生支持权重分配和条件匹配:
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: app-canary
namespace: production
spec:
parentRefs:
- name: prod-gateway
namespace: gateway-system
rules:
- matches:
- headers:
- name: "X-Canary"
value: "true"
backendRefs:
- name: app-v2
port: 8080
weight: 100
- backendRefs:
- name: app-v1
port: 8080
weight: 90
- name: app-v2
port: 8080
weight: 10
回滚护栏设计点: 上述配置中,第一条规则匹配 Header
X-Canary: true 的请求全部转发至 v2,用于内部验证;第二条规则将 10% 的常规流量导向 v2。当需要回滚时,只需将 v2 的 weight 改为 0 并删除第一条规则,无需重建整个资源。流水线可通过 kubectl patch 或 GitOps 自动执行此操作,实现秒级回滚。
2.5 从 Ingress 迁移到 Gateway API 的路径
对于已有 Ingress 资源的集群,建议采用渐进式迁移策略:
- 阶段一(并行运行): 安装 Gateway API CRD 和兼容的控制器(如 Nginx Gateway Fabric),保留现有 Ingress 资源,新建 Gateway 和 HTTPRoute 用于新服务。
- 阶段二(灰度迁移): 将部分存量服务的 Ingress 规则逐步转换为 HTTPRoute,通过 DNS 权重或 Gateway 监听器切换验证功能正确性。
- 阶段三(全面切换): 确认 HTTPRoute 稳定后,移除 Ingress 资源,统一使用 Gateway API 管理所有流量,并启用回滚护栏策略。
迁移注意事项: 并非所有 Ingress annotation 都有对应的 Gateway API 原生字段。在迁移前,需检查当前使用的 annotation(如 rewrite-target、ssl-redirect 等)是否已被 Gateway API 的 Policy 或 Filter 机制覆盖。对于无法直接映射的 annotation,可使用
ExtensionRef 或自定义 Filter 进行过渡。