WEBKT

Gateway API vs Ingress 在服务网格中的选型:从稳定性、功能到 Ambient 模式的深度对比

2 0 0 0

引言:一个正在发生的范式转移

如果你现在还在用 nginx-ingress-controllertraefik 的传统 Ingress 配置做服务网格相关的流量管理,是时候重新审视这个选择了。Kubernetes Gateway API 已经不只是"新一代 Ingress",它正在成为服务网格数据面统一控制的事实标准——尤其是在 Istio Ambient Mode 和 GAMMA 项目推动下,这个趋势变得不可忽视。

本文从稳定性现状、功能集完整性、与 Ambient/Sidecarless 数据面的适配程度三个维度,结合实际生产经验,给出具体场景下的选型建议。


一、稳定性的真相:你以为的"成熟"可能只是惯性

1.1 标准本身的成熟度评估

Gateway API 目前(2024年)处于 GA(v1.x)状态,但需要注意:

Gateway API 版本状态(截至2024年Q2)
├── Core Features (GA): HTTPRoute, TCPRoute, TLSRoute, UDPRoute ✅
├── Extended Features (Experimental): GRPCRoute, HTTPRewrite, RequestMirror ⚠️  
└── Experimental: BackendTLSPolicy, ClientTrafficPolicy 🔧

⚠️ 注意:"GA" 只保证 CRD 和核心行为稳定,
   但各厂商实现差异仍然显著,不建议盲目相信跨平台一致性。

相比之下,传统 Ingress 的稳定是另一种含义的稳定——它足够老、社区足够熟悉、出错有大量参考资料。但这种"熟悉感"在引入服务网格后会迅速崩塌,因为 Ingress 无法原生表达 L7 元数据(如 mTLS 要求、Circuit Breaking、Retries)。

1.2 生产环境验证情况

实现方案 生产大规模使用 主要痛点
Kong Gateway + Gateway API >500节点规模有案例 配置同步延迟
Cilium + Gateway API 大规模 eBPF 环境首选 与传统工具链兼容
Istio + Gateway API 中等规模增长中 Ambient模式仍在Beta
Contour/Emissary 小到中等规模 功能集相对保守

我的判断:如果你追求的是控制平面本身的稳定性,选择已 GA 的核心功能(HTTPRoute)配合经过充分测试的实现(Cilium/Tecent Cloud等)。不要被"全部 GA"的表象迷惑,扩展功能的生产可用性需要逐一验证。


二、功能集的代差:不只是多了几个字段的问题

2.1 从"Ingress 能做什么"到"Gateway API 能做什么"

这是本质上的范式跃迁:

# ❌ 老方式:通过 Annotation 打补丁(Ingress典型写法)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api-gateway  
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/proxy-read-timeout: "300"
    # 每个厂商有自己的annotation,互不兼容
    
---
# ✅ 新方式:用原生API表达语义(Gamwayroute示例)
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute  
metadata:
  name: api-service-route  
spec:
  parentRefs:
    - kind: Gateway  
      name: production-gateway  
      sectionName: https-listener  
      
  hostnames:
    - "api.example.com"
    
  rules:
    - matches:
        - path:
            type: PathPrefix  
            value: /v2/users/
          headers:
            values:
              X-Canary-Release: "true"
            
      backendRefs:
        - kind: Service  
          name: users-service-v2  
          port: 8080  
          weight: 20   # 金丝雀流量权重,原生支持!
        - kind: Service   
          name: users-service-v1   
          port: 8080   
          weight: 80
        
      filters:
        - type: RequestHeaderModifier 
          requestHeaderModifier:
            set:
              - name:X-Real-IP 
                value:"%{request.header.X-Forwarded-For}"

2.2 服务网格场景下的关键能力差距

在引入 mTLS、可观测性、零信任网络后,功能差距变得无法忽视:

能力矩阵对比:

                    │ Traditional Ingress │   GATEWAY-API    │
────────────────────┼─────────────────────┼──────────────────┤
// L7路由           │                     │                  │
├─ Header匹配       │ 仅限正则Annotation   │ ✅ 原生完整支持   │
├─ 方法级路由       │ 需要插件             │ ✅ 原生支持       │
├─ Query参数路由    │ 部分支持             │ ✅ 原生支持       │
├─ 重试策略         │ 不支持               │ ⚠️ ExtensionPoint │
├─ 超时配置         │ Annotation           │ ⚠️ 部分Beta支持   │
│                    │                     │                  │
// 安全相关         │                     │                  │
├─ mTLS表述         │ ❌ 完全无法表达       │ ✅ 可通过GRPCRoute│ 
│                   │                      │   BackendPolicy等│ 
├─ OAuth范围        │ 需要插件             │ ⚠️ Extension Point│ 
│                    │                     │                  │
// 可观测性         │                     │                  │
├─ tracing上下文     │ 不保证传递           │ ⚠️ 各实现不一     │
└─ metrics标签      └─────────────────────┴──────────────────┘...

三、最关键的部分:Ambient Mode 的出现改变了什么?

这是我认为最值得深入讨论的部分。Ambient Mode 是 Istio 在2023年推出的全新数据面架构,它的核心设计目标是:去掉 Sidecar,改用共享的 ztunnel 和按需部署的 Waypoint Proxy。

3.1 为什么这对 Gateway 选择至关重要?

当你选择 Ingress/Gateway 实现时,你实际上是在选择未来与你的 mesh 数据面的集成方式。Sidecar模式下,所有流量拦截发生在 Pod 内核空间,Ingress 可以保持相对独立。但 Ambient Mode 引入了新的网络拓扑:

Ambient Mode 网络拓扑简化示意:

外部请求 ──┐                       ┌── 应用Pod-A(zTunnel感知)   
           ├── ztunnel Node网络 ──┤   
入口网关 ──┘                       └── 应用Pod-B(zTunnel感知)   
                                      ↓(按需触发)    
                                   Waypoint Proxy ← 你配置的Policy在这里生效
   
特点:
✅ 无Sidecar注入,应用容器零侵入  
⚠️ 所有L4流量必须经过zTunnel层进行加密处理     
⚠️ L7策略执行依赖Waypoint,而非每个Pod独立Envoy实例    

在这种拓扑下,传统 Ingress 控制流量的方式(比如直接修改 iptables/pod网络)是行不通的,因为你无法预知哪些 Pod 会启用 Waypoint,哪些不会。这使得 Gateway-native 的声明式模型成为唯一可行的路径

istio ambient 对比 classic sidecar:

# Classic Sidecar模式:你需要在每个Workload上配置Sidecar资源来定义流量拦截范围
  
apiVersion networking.istio.io/v1beta1 # 已废弃,但仍有大量存量配置!
kind Sidecar资源配置元数据...
spec workloadSelector labels app product-service ...
egress 定义出口规则...

---
# Ambient模式:通过AuthorizationPolicy在Waypoint上执行,L7不再依赖每Pod代理
  
apiVersion security istio.io/v1beta # 这是Istio推荐的新写法,废弃了原来的AuthorizationPolicy?
kind AuthorizationPolicy元数据...
spec selector matchLabels app product-service 
action ALLOW ...
from SOURCE principal "*"
to OPERATION ports GET /api/products/* ...

⚠️ WARNING:这个例子有问题。在Ambient模式下,
安全策略的执行位置发生了变化,不再是简单的替代关系。
请参考Istio官方文档确认具体的CRD变化。

重要修正说明:上面代码示例存在不准确之处。在Istio持续演进过程中,部分CRD的使用方式和推荐做法会发生变化。建议读者以 Istio官方文档 为准,特别是关于Ambient模式下SecurityPolicy和AuthorizationPolicy的具体用法。


四、GAMMA 项目:从"Kubernetes标准"到"Mesh标准"的野望

GAMMA Initiative是什么?

GAMMA(Gateway API for Mesh Management and Administration)是Gateway SIG下的一个工作组,专门研究如何把Gateway API的概念延伸到Service Mesh内部通信场景。这不是修修补补,而是一套全新的抽象层。

当前进展与实际意义

根据最新GEP提案,GAMMA的核心目标是让以下配置可以用统一的API完成:

期望的统一化目标(非完整实现):


面向外部用户的入口层:
HTTPRoute ←→ LoadBalancer IP / NodePort / External LB


Mesh内部的东西向流量层:
HTTPRoute ←→ Service A → Service B 之间调用


当前差距举例:
❌ 无法通过HTTPRoute直接描述Service Mesh内部的mTLS要求(2024仍为实验特性)
❌ BackendLBpolicy在各mesh实现中不一致           
❌ ServiceMesh接口(SMI)与GAMMA规范的映射尚未完成...

这意味着什么?你的团队今天学的一套语法,明天可能就适用从边缘网关到内部微服务的所有南北+东西向流量管理。这是一个宏大的愿景,但也是真实的工程挑战。


五、选型建议:根据场景给出可操作的结论

Scenario A:高密度短生命周期任务优先的环境(如 Serverless/FAAS)

推荐方案:继续使用现有Ingress + 云厂商托管方案(如ALB/Ingress Controller)
理由:
· serverless场景下pod生命周期极短,sidecar或waypoint overhead过高    
· gateway-api虽然更好,但托管配套不完善    
· 当前阶段没必要为了“统一”牺牲易用性    

风险提示:如果未来整体迁移至mesh优先架构,重构成本较高。

Scenario B:有计划或已在使用 Istio/Linkerd 等服务网格,且考虑切换到 Ambient Mode

推荐方案:以Gateway-native的方式构建入口层,逐步试验Ambient Beta特性
  
具体步骤:
① 确保现有ingress controller能理解并转发给mesh控制平面(如通过MCPP)    
② 将外部入口定义为HTTPRoute,由mesh ingress controller消费     
③ 实验性地部署非关键服务的Waypoint,观察行为     
④ 建立监控基线,对比sidecar vs ambient的性能损耗(gVisor/eBPF路径差异)

不建议的做法:在没有充分测试的情况下立即切换所有工作负载至ambient。
当前(2024 Q2)仍有以下已知限制待解决...

Scenario C:新建项目,追求长期可维护性和跨集群一致性

推荐方案:以Cilium/Tecent Edge为代表的eBPF-native方案,配合成熟的CNI,
结合 Cilium ClusterwideNetworkPolicies 构建统一的网络策略层。
同时为未来接入GAMMA规范预留空间,避免vendor-lockin的风险。

Cilium目前是gateway-api实现中与底层数据面整合最深的一个,
它的优势在于eBPF可以直接hook netfilter,减少对iptables/netfilter的依赖——
这对性能敏感的场景意义重大。

六、未来展望与需要持续关注的方向

以下几个信号值得持续跟踪,它们可能在接下来12~18个月内显著改变格局:


📍 Q3/Q4预期里程碑(基于公开路线图推测):
├─ GAMMA规范中BackendTLSPolicy进入更稳定的阶段        
├─ Istio Ambient正式Release候选版本发布            
└─ 更多主流云厂商(阿里云/腾讯云/AWS)在托管K8S中默认启用gateway-api控制器...

🔮 更远的趋势判断:
· 如果Cilium+Tetragon组合获得更多生产验证,无sidecar的安全策略执行会更有竞争力      
· 如果GAMMA能够真正落地,一个HTTProute同时管理东西+南北流量的时代会到来          
· 但在那之前,我们仍然需要在“理想架构”和“工程现实”之间做妥协                 

结语:在确定性与可能性之间做选择

回到最初的问题:选传统Ingress还是Gateway-API?我的答案不是非此即彼,而是:取决于你所在的组织阶段和对未来的赌注大小。

如果你今天就需要跑稳生产系统,选你已经验证过的方案,包括传统Ingress。别为了追新而追新。但如果你是平台团队,正在为未来3~5年的基础设明确方向,那投资在学习Gateway-API和了解Ambient模式的细节上,这笔账大概率是划算的——因为这股力量已经不可逆转地起来了,你现在欠下的认知债,早晚会在某个重构节点一次性还清。

与其等待完美时机,不如现在开始小范围试点。让业务压力驱动技术升级,而不是相反。

林九 KubernetesGAMMA

评论点评