欢迎光临

Kubernetes Gateway API深度实战:从Ingress迁移到新一代流量路由,构建云原生API网关

为什么Kubernetes需要Gateway API

在云原生架构快速演进的2026年,Kubernetes Ingress资源已经服役超过8年,其设计局限性日益凸显。Ingress的核心问题在于:它将HTTP路由规则、TLS终止、负载均衡策略全部耦合在一个资源对象中,导致多团队协作时权限边界模糊、配置冲突频发。当你需要同时管理多个Ingress Controller(如Nginx、Traefik、Istio)时,每个Controller通过Annotations注入专属配置的方式更是让可移植性荡然无存。

Gateway API的出现不是简单的Ingress v2,而是从角色模型、API语义到扩展机制的一次彻底重构。它引入了GatewayClass → Gateway → HTTPRoute的三层抽象,分别映射基础设施管理员、集群运维和应用开发者的职责边界,让多租户环境下的流量管理真正变得可治理。

Kubernetes集群网络架构

Gateway API核心架构解析

三层角色模型

Gateway API的设计哲学是角色分离(Role-oriented),通过三种资源类型明确划分不同角色的职责:

  • GatewayClass:由基础设施提供商定义,声明底层实现的类型(如istio、contour、nginx)。类似于StorageClass,它让集群管理员可以预配置多种网关实现供不同场景选用。
  • Gateway:由集群运维人员创建,声明所需的基础设施容量和监听配置(协议、端口、TLS模式)。一个Gateway绑定一个GatewayClass,可以定义多个Listener。
  • HTTPRoute/GRPCRoute/TCPRoute/UDPRoute/TLSRoute:由应用开发者创建,定义具体的路由规则。Route通过
    1
    parentRefs

    字段绑定到Gateway的特定Listener,实现了应用层路由与基础设施的解耦。

这种分层设计的直接好处是:应用开发者无需关心网关的基础设施细节,运维人员无需关心每个应用的路由规则,而基础设施提供商只需维护GatewayClass的可用性。三者通过RBAC实现真正的权限隔离。

路由绑定模型

与Ingress的隐式绑定不同,Gateway API采用显式绑定机制。Route资源通过

1
parentRefs

声明自己要附着到哪个Gateway上,Gateway的Listener通过

1
allowedRoutes

控制哪些Namespace的哪些Route类型可以绑定。这是一个双向选择的过程:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: production-gateway
  namespace: infra
spec:
  gatewayClassName: istio
  listeners:
  - name: http
    port: 80
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: Selector
        selector:
          matchLabels:
            shared-gateway-access: "true"
  - name: https
    port: 443
    protocol: HTTPS
    tls:
      mode: Terminate
      certificateRefs:
      - kind: Secret
        name: wildcard-tls
    allowedRoutes:
      namespaces:
        from: All

上面的配置中,HTTP Listener只允许带有

1
shared-gateway-access: "true"

标签的Namespace中的Route绑定,而HTTPS Listener对所有Namespace开放。这种精细化的访问控制在Ingress时代几乎不可能实现。

云原生API网关架构

从Ingress迁移到Gateway API实战

Ingress到HTTPRoute的映射规则

迁移的核心是将Ingress规则一对一转换为HTTPRoute。以下是一个典型的Ingress配置及其Gateway API等价写法:

Ingress原配置:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "20"
spec:
  tls:
  - hosts:
    - api.example.com
    secretName: api-tls
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /v1/users(/|$)(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: user-service-v1
            port:
              number: 8080

Gateway API等价配置:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: user-service-route
  namespace: app-team
spec:
  parentRefs:
  - name: production-gateway
    namespace: infra
    sectionName: https
  hostnames:
  - "api.example.com"
  rules:
  - matches:
    - path:
        type: RegularExpression
        value: "/v1/users(/|$)(.*)"
    filters:
    - type: RequestRewrite
      requestRewrite:
        path:
          type: ReplaceRegexMatch
          replace: "/$2"
    backendRefs:
    - name: user-service-v1
      port: 8080
      weight: 80
    - name: user-service-v2
      port: 8080
      weight: 20

关键变化点:

  • Annotations全部消失,灰度发布通过
    1
    weight

    字段原生支持

  • 路径重写从Nginx专属注解变为标准化的
    1
    RequestRewrite

    过滤器

  • 路由规则不再绑定特定的Ingress Controller实现
  • Service和Route可以在不同Namespace,通过parentRefs跨Namespace引用

灰度发布的原生支持

Ingress时代的灰度发布依赖各类Controller的专有Annotations(如Nginx的canary注解、Istio的VirtualService),方案不统一且难以跨Controller迁移。Gateway API通过

1
weight

字段直接在HTTPRoute层面支持流量分配,无需任何扩展:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: payment-canary
spec:
  parentRefs:
  - name: production-gateway
    namespace: infra
  rules:
  - backendRefs:
    - name: payment-service
      port: 8080
      weight: 90
    - name: payment-service-v2
      port: 8080
      weight: 10
  - matches:
    - headers:
      - type: Exact
        name: X-Canary
        value: "true"
    backendRefs:
    - name: payment-service-v2
      port: 8080

上面的配置实现了两种灰度策略:基于权重的全量灰度(90/10流量分配)和基于Header的定向灰度(携带

1
X-Canary: true

的请求全部路由到v2)。这两种策略可以在同一条Route规则中组合使用,灵活性远超Ingress的Annotation方案。

灰度发布流量管理

高级流量治理模式

请求过滤与转换

Gateway API的Filter机制是它相比Ingress最强大的能力扩展。Filter支持以下类型:

Filter类型 功能 典型场景
RequestHeaderModifier 添加/删除/修改请求头 注入认证头、跨服务追踪ID
ResponseHeaderModifier 添加/删除/修改响应头 CORS策略、安全头注入
RequestMirror 将请求镜像到后端 影子测试、故障排查
RequestRedirect 重定向请求 HTTP→HTTPS、域名迁移
RequestRewrite 重写路径/主机名 API版本迁移、路径规范化
ExtensionRef 自定义扩展过滤器 限流、认证、WAF等

一个实际的生产级配置示例,展示多种Filter的组合使用:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: api-gateway-route
spec:
  parentRefs:
  - name: production-gateway
    namespace: infra
  hostnames:
  - "api.example.com"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: "/api/v2"
    filters:
    - type: RequestHeaderModifier
      requestHeaderModifier:
        add:
        - name: X-Forwarded-Proto
          value: "https"
        set:
        - name: X-Request-ID
          value: "{{uuid}}"
    - type: RequestMirror
      requestMirror:
        backendRef:
          name: shadow-service
          port: 8080
    backendRefs:
    - name: api-v2-service
      port: 8080
  - matches:
    - path:
        type: PathPrefix
        value: "/api/v1"
    filters:
    - type: RequestRedirect
      requestRedirect:
        scheme: https
        hostname: new-api.example.com
        statusCode: 301
    backendRefs:
    - name: api-v1-service
      port: 8080

跨Namespace路由与多团队协作

在大型组织中,不同团队通常管理不同的微服务,而这些服务共享同一个入口网关。Gateway API通过ReferenceGrant资源实现了安全的跨Namespace引用:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata:
  name: allow-app-team-to-infra-gateway
  namespace: infra
spec:
  from:
  - group: gateway.networking.k8s.io
    kind: HTTPRoute
    namespace: app-team
  to:
  - group: gateway.networking.k8s.io
    kind: Gateway
    name: production-gateway

ReferenceGrant的工作方式类似于网络防火墙的白名单规则:只有显式授权的跨Namespace引用才被允许。这解决了Ingress时代所有团队必须在同一Namespace操作、或者需要ClusterRole权限的治理困境。每个团队在自己的Namespace中管理Route,通过ReferenceGrant安全地绑定到共享Gateway上。

多团队协作网关架构

Gateway API实现方案选型

Gateway API是标准接口,底层实现可以自由选择。2026年主流的几种实现方案对比:

实现方案 GatewayClass名称 优势 适用场景
Envoy Gateway envoy-proxy 官方参考实现,Envoy生态完整 通用API网关、微服务
Istio istio 服务网格集成,mTLS自动 服务网格场景、零信任网络
Contour contour 轻量级,部署简单 中小规模Kubernetes集群
Traefik traefik 自动发现,配置热更新 CI/CD密集型环境
Nginx Gateway Fabric nginx Nginx性能和生态 Nginx存量迁移场景
Kong kong 插件生态丰富,企业级 需要丰富插件的企业

选型建议:新项目优先选择Envoy Gateway(CNCF官方参考实现,生态最完整);如果已经使用Istio服务网格,直接用Istio的Gateway实现可以获得mTLS和可观测性的一体化收益;从Nginx Ingress迁移的团队可以先用Nginx Gateway Fabric做平滑过渡。

生产环境最佳实践

Gateway高可用部署

Gateway的基础设施层需要确保高可用。以Envoy Gateway为例,推荐以下部署模式:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: production-envoy
spec:
  controllerName: gateway.envoyproxy.io/gatewayclass-controller
  parametersRef:
    group: config.gateway.envoyproxy.io
    kind: EnvoyProxy
    name: production-config
---
apiVersion: config.gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
  name: production-config
  namespace: infra
spec:
  provider:
    type: Kubernetes
    kubernetes:
      envoyDeployment:
        replicas: 3
        pod:
          affinity:
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 100
                podAffinityTerm:
                  labelSelector:
                    matchLabels:
                      app.kubernetes.io/name: envoy
                  topologyKey: kubernetes.io/hostname
          resources:
            requests:
              cpu: "1"
              memory: "1Gi"
            limits:
              cpu: "4"
              memory: "4Gi"

关键配置要点:

  • 多副本+Pod反亲和:确保Envoy实例分布在不同节点,单节点故障不影响网关可用性
  • 资源限制:根据实际QPS调整CPU/内存,Envoy是数据面组件,CPU是核心瓶颈
  • GatewayClass参数引用:通过
    1
    parametersRef

    将实现特有的配置从GatewayClass中解耦

可观测性集成

Gateway API的标准不包含可观测性定义,但所有主流实现都支持Prometheus指标导出。核心监控指标包括:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Prometheus ServiceMonitor配置
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: envoy-gateway-metrics
  namespace: infra
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: envoy
  endpoints:
  - port: metrics
    interval: 15s
    path: /stats/prometheus

推荐监控的关键指标:

  • 1
    envoy_http_downstream_rq_xx

    :按状态码分类的请求计数

  • 1
    envoy_http_downstream_rq_time

    :请求延迟分布

  • 1
    envoy_cluster_membership_healthy

    :上游集群健康端点数

  • 1
    envoy_server_live

    :Envoy进程存活状态

结合Grafana Dashboard,可以构建完整的网关可观测性视图,包括QPS趋势、P99延迟热力图、错误率告警和上游服务健康状态。

可观测性监控仪表盘

TLS证书自动化管理

生产环境的TLS证书管理是运维痛点。结合cert-manager可以实现Gateway级别证书的自动签发和轮转:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: api-cert
  namespace: infra
spec:
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  dnsNames:
  - "api.example.com"
  - "*.api.example.com"
  secretName: api-tls-secret
  secretTemplate:
    annotations:
      reflector.v1.k8s.emberstack.com/reflection-allowed: "true"

cert-manager会自动监控证书过期时间,在到期前自动续签并更新Secret。Gateway Controller监听Secret变化后会自动热加载新证书,无需重启Gateway或Envoy。这比Ingress时代的证书管理体验提升了一个量级。

迁移策略与注意事项

渐进式迁移路径

从Ingress迁移到Gateway API不应一次性切换,推荐的渐进式迁移路径:

  1. 并行运行阶段:在现有Ingress Controller旁部署Gateway API实现,新旧网关共享同一组后端Service。通过DNS权重逐步将流量从Ingress切换到Gateway。
  2. 灰度验证阶段:先迁移低风险的非核心服务到Gateway API,观察稳定性和性能指标。保持Ingress作为回滚路径。
  3. 全量迁移阶段:所有服务迁移完成后,将DNS完全指向Gateway API网关。保留Ingress配置一段时间作为紧急回滚方案。
  4. 清理阶段:确认Gateway API运行稳定后,移除Ingress资源和旧版Controller。

迁移常见陷阱

在实际迁移过程中,以下问题需要特别注意:

  • 路径匹配语义差异:Ingress的
    1
    ImplementationSpecific

    路径类型在Gateway API中需要明确指定为

    1
    Exact

    1
    PathPrefix

    1
    RegularExpression

    。不同类型的匹配行为差异很大,务必逐条审查。

  • 默认后端缺失:Ingress有
    1
    defaultBackend

    概念,Gateway API没有。需要在HTTPRoute中配置catch-all规则来处理未匹配的请求。

  • Annotation迁移:大量Ingress Annotation是Controller特定的,没有标准化的映射。每个Annotation都需要单独评估,有些功能可能需要通过Filter或Policy资源实现。
  • Websocket支持:部分Ingress Controller通过Annotation开启WebSocket支持,在Gateway API中需要确认实现是否默认支持或需要额外配置。

总结与展望

Gateway API标志着Kubernetes流量管理从”够用”到”好用”的关键跨越。它的角色分离模型解决了多团队协作的根本问题,标准化的API消除了Controller锁定的困境,而Filter和扩展机制为未来功能(如限流、认证、WAF)的标准化留出了空间。

对于正在评估迁移的团队,建议从新服务开始直接使用Gateway API,存量服务按上述渐进式路径分批迁移。Gateway API已经进入v1稳定期,所有主流Controller实现都已支持,现在是迁移的最佳时机。

未来值得关注的发展方向包括:BackendTrafficPolicy(后端级流量策略,支持限流和重试)、FrontendTrafficPolicy(网关级安全策略)以及与服务网格更紧密的融合——当Gateway API和服务网格共享同一套流量路由语义时,从网关到网格的端到端流量治理将真正无缝。

【本站文章皆为原创,未经允许不得转载】:汤不热吧 » Kubernetes Gateway API深度实战:从Ingress迁移到新一代流量路由,构建云原生API网关
分享到: 更多 (0)