想象你站在一座新建的巨型写字楼前。外面的人要拜访楼里的公司,得先经过门岗、登记、刷卡;楼里不同公司之间要互相送文件、开会,则走另一套内部通道。这座写字楼就是 Kubernetes 集群,外面来的人叫“外部流量”,楼内公司之间的往来叫“服务间流量”。今天要聊的 Ingress 和 Gateway API,就是管理“楼外的人怎么进门”的门禁系统;而服务网格,则是楼内各部门派出的“专属秘书”,负责内部安全传递。整篇文章会从一张“进楼路线图”讲起,逐步拆解入口规则、智能门禁、楼内秘书、调度算法、性能优化和实战案例。读完你会明白:为什么云原生工程师把入口设计称为“盖楼时最重要的第一步”。

岗位关联

对云原生与 AI 基础设施工程师而言,掌握 Ingress 与 Gateway API,意味着能设计出高可用、可灰度、可观测的流量入口,这是线上 AI 服务稳健运行的核心能力。

目录
  1. 可视化演示
  2. 流量入口基础
  3. Ingress核心原理
  4. Gateway API进阶
  5. 服务网格协同
  6. 调度与容错算法
  7. 性能优化策略
  8. 实践与案例
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

Ingress与Gateway API是云原生流量编排入口。拖动滑块调整流量。观察两种API的架构差异、路由流程与性能优化机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

网关核心 流量路由 扩展 入口→路由→服务

流量入口基础

一座写字楼再豪华,如果正门只够两个人并排走,高峰期就会乱成一团。Kubernetes 集群也是如此:外部用户要访问 AI 推理服务、模型 API,首先经过的就是“入口”。在云原生世界中,这个入口通常由 Ingress 和 Gateway API 来定义。你可以把 Ingress 理解成贴在写字楼门口的“接待说明牌”,上面写着:哪些访客走东门、哪些访客坐哪部电梯、哪些访客需要登记。不过,说明牌本身不会行动,真正守在门口执行接待工作的是 Ingress Controller,也就是写字楼的门岗保安。

从技术上看,Ingress 是 Kubernetes 的一种 API 资源对象,它描述“外部访问服务的规则”;Ingress Controller 则是独立部署的代理程序,负责监听 Ingress 对象的变化,把规则翻译成 Nginx、Envoy 等网关的配置。外部流量进入集群,再从服务暴露出去,这种“楼外到楼内”的流向叫南北向流量;而服务与服务之间互相调用,属于“楼内房间到楼内房间”,叫东西向流量。Ingress 解决的是前者。

入口的接待能力决定了整个系统能扛住多大的访问量。我们可以用一个小公式来估算:

所以,提高入口性能不只是加带宽,还要同时关注“减少响应耗时”和“合理设置并发连接”。这就像写字楼想要提高进门效率,既要加快登记速度,也要拓宽门廊,而不是只把门牌号写得更漂亮。

Q=CRQ = \frac{C}{R}
Q 表示入口每秒能处理的请求数,C 是同时存在的并发连接数,R 是每个请求的平均响应时间。
  1. 并发连接数 C大楼门口同一时刻排队的访客数量,也就是系统里正在处理但没有结束的请求数。
    CC
  2. 平均响应时间 R每位访客从进门到办完事离开的平均耗时,对应一个请求从进入到返回的平均时间。
    RR
  3. 入口吞吐量 Q每秒能接待多少人,等于“门口能同时站多少人”除以“每人平均停留多久”。
    CR\frac{C}{R}

Ingress核心原理

回到前台保安的视角。保安手里有一本规则册:访客说“我要去 2 楼财务”,册子上写着“2 楼财务在 B 区,预约过才放行”。Ingress 也是一本规则册,规则由 host 和 path 组成。比如,访问 api.ai.com/v1/chat 时,Ingress 规则会把这个请求指向名为 chat-service 的 Service;而访问 api.ai.com/static 时,则指向静态资源服务。这样,一个入口就能根据 URL 把请求分流到不同后端。

然而,规则册不能自己执行。Ingress Controller 会实时 watch Kubernetes API Server,一旦 Ingress 规则发生变化,它就把新规则转换为代理配置,并加载到 Nginx 或 Envoy 等网关代理中。网关代理是真正站在门口的保安:它收到请求后,按规则册找到对应后端,再把流量转发进去。它还经常负责 TLS 终止,也就是把外部 HTTPS 加密流量解密成内部 HTTP,避免每个后端都做一遍加密解密;同时支持多域名共用一个入口,就像同一栋楼里多个公司共用正门。

当入口把请求转到多个后端时,需要留意每个后端的“拥挤程度”。一个简单的负载指标是:

Ingress 的规则册越是精细,越要考虑后端负载。就像前台保安如果发现某个公司在排队,就应该引导访客去另一家同样能处理业务的办公室。

ηi=CiCimax⁡\eta_i = \frac{C_i}{C_i^{\max}}
η 表示第 i 个后端的负载比例,C 是当前连接数,Cmax 是它能承受的最大连接数。
  1. 当前连接数 C_i第 i 个后端房间此刻正在接待的请求数。
    CiC_i
  2. 最大连接数 C_i^{max}该后端房间设计时允许的最大并发数。
    Cimax⁡C_i^{\max}
  3. 负载比例 η_i如果超过 100%,说明这个房间已经满员,入口应该减少向它转发请求。
    ηi\eta_i

Gateway API进阶

传统 Ingress 就像一名保安身兼数职:既决定装什么样的大门,又制定访客规则,还负责接待每个人。当楼里只有几家公司时还行,可一旦有几十个团队,就会互相踩脚。Gateway API 的诞生,就是要把这些职责拆开:物业负责选门禁品牌,安保负责设置入口实例,各家公司自己提交访客接待单。

在 Gateway API 中,GatewayClass 对应“物业选定的门禁供应商”,它声明使用哪种控制器实现;Gateway 对应一个具体入口,相当于楼下真正装好的那台门禁机;HTTPRoute 则是业务团队提交的路由规则,描述“什么请求去什么服务”。三者分离后,基础设施管理员和业务开发者可以并行工作,甚至可以跨命名空间引用路由,策略也不再像 Ingress 注解那样散落各处,而是能统一挂载到 Gateway 或 HTTPRoute 上。

路由规则往往要同时满足多个条件,比如“路径是 /v1/chat,且请求头里带有灰度标签”。我们可以用组合概率来理解:

Gateway API 的智能之处,是把“谁定门禁、谁管入口、谁定义路由”彻底分层。这就像物业、安保、公司前台各司其职,整栋楼的入口管理才真正走向规模化。

Pmatch=∏k=1npkP_{\text{match}} = \prod_{k=1}^{n} p_k
路由匹配概率等于所有条件命中概率的乘积;条件越多,同时满足越难,匹配就越精确。
  1. 单个条件概率 p_k每个匹配条件单独命中的概率,例如“路径匹配”和“请求头匹配”各自成立的概率。
    pkp_k
  2. 连乘符号多个条件必须同时满足,所以概率相乘。
    ∏k=1npk\prod_{k=1}^{n} p_k
  3. 最终命中率条件叠加后得到的整体匹配概率。
    PmatchP_{\text{match}}

服务网格协同

访客通过门禁进入楼内后,要去不同的房间。房间之间怎么沟通?总不能每家公司都派一群人到处跑。于是,每个部门安排了一位“专属秘书”——Sidecar 代理。这位秘书负责替部门送文件、接收文件、做记录,还负责检查对方身份。一个 Pod 旁边挂一个 Sidecar,就相当于每个房间门口都有一位秘书,服务之间的所有通信都从秘书手里经过。

服务网格处理的就是这种东西向流量。它负责服务发现,让秘书们知道彼此在哪;负责 mTLS,让每次通信都加密且互相验证身份;还负责可观测性,把每次调用的延迟、状态、错误都记录下来。API 网关处理的是“楼外到楼内”,服务网格处理的是“楼内到楼内”。两者并不冲突,反而是配合关系:访客由门禁接入后,再由秘书带着去正确房间。

当楼内服务越来越多时,服务网格需要维护的安全通道数量会快速增长。例如 N 个服务都使用 mTLS 通信,两两之间都要建立可信连接:

服务网格的可扩展性挑战也来源于此。正因如此,很多系统并不会让所有服务都全互联,而是通过服务发现和分层路由,把通道控制在一个合理范围。门禁管好外面,秘书管好里面,整栋楼才能有序运转。

T=N(N−1)2T = \frac{N(N-1)}{2}
T 表示全互联需要的安全通道数量;服务越多,通道数按平方级增长。
  1. 服务数量 N楼内参与通信的房间总数。
    NN
  2. 两两组合每个房间都要与其他 N−1 个房间建立通道,但 A 到 B 和 B 到 A 是同一条。
    N(N−1)2\frac{N(N-1)}{2}
  3. 总通道数 T服务规模翻倍时,通道数远不止翻倍。
    TT

调度与容错算法

门禁和秘书都解决“去哪”的问题,但具体“去哪个房间”需要算法说了算。最常见的策略是加权负载均衡:每个后端房间根据自己的硬件能力,拥有不同权重。能力强、机器多的房间权重高,承接更多请求;刚扩容的新房间权重低,先接收少量流量观察情况。

权重分配可以用一个概率公式描述:

光有负载均衡还不够,系统还要学会容错。比如,某个后端房间正在冒烟,如果一直把请求送进去,只会烧得更厉害。这时需要熔断降级:连续失败次数超过阈值后,入口直接“拉闸”,快速返回默认响应,而不是继续排队等待。重试也要有限制,失败就重试,看起来稳妥,但故障时无限重试会把后端彻底压垮。正确的做法是设置重试次数、超时时间和退避策略,再配合健康检查,只把流量发给体检合格的后端。

这套逻辑就像大楼里发生火情时,保安会临时封闭某些电梯,引导访客走备用楼梯;等到火情解除,再恢复电梯使用。调度与容错算法的核心,就是“永远不要把鸡蛋放进一个正在漏水的篮子”。

Pi=wi∑j=1nwjP_i = \frac{w_i}{\sum_{j=1}^{n} w_j}
请求落在第 i 个后端的概率,等于该后端权重占所有健康后端权重总和的比例。
  1. 单个权重 w_i第 i 个后端被分配的流量份额。
    wiw_i
  2. 总权重所有健康后端权重之和,分母越大,单点被选中的概率越小。
    ∑j=1nwj\sum_{j=1}^{n} w_j
  3. 选中概率 P_i入口按这个比例把请求均匀摊到不同后端。
    PiP_i

性能优化策略

写字楼高峰期,门口排队的人越来越多。与其让所有人挤在门口,不如优化进门流程。网关常见的性能优化手段包括:连接复用,把多个请求塞进同一条连接里,减少反复握手;内容缓存,把静态响应放在门口附近,访客不用每次都跑到后端房间;动态压缩,对大数据量的响应先压缩再传输。这些策略能显著降低入口延迟和后端压力。

但当流量突然暴增时,还需要“限流控制”。令牌桶算法是常用的一种思路:系统按固定速率向桶里放令牌,每个请求必须取到令牌才能进入。如果桶空了,请求就会被拒绝或排队,避免后端被超额流量冲垮。令牌桶可以表示为:

令牌桶算法非常适合 AI 推理服务:模型接口希望保持稳定吞吐,而不是被瞬间的高并发打乱节奏。门禁放行的速度一旦可控,整个楼内系统就能保持平稳,不至于因为一个高峰把所有房间都挤满。

bn+1=min⁡(C,bn+ρΔt)b_{n+1} = \min(C, b_n + \rho \Delta t)
下个时刻的令牌数,等于当前令牌数加上补充的令牌,但不会超过桶容量 C。
  1. 当前令牌数 b_n此刻桶里攒下的可用令牌数量。
    bnb_n
  2. 补充速率 ρ每秒向桶里放入多少个令牌,相当于门禁每秒放行的速度。
    ρΔt\rho \Delta t
  3. 容量上限 C桶最多能装多少令牌,防止突发流量一次性耗尽所有资源。
    min⁡(C,bn+ρΔt)\min(C, b_n + \rho \Delta t)

实践与案例

把前面的知识拼起来,就是一次写字楼入口系统的整体升级。想象一家 AI 公司要发布新版推荐模型,团队不希望一次性切换用户,而是先让 10% 的流量走新模型,观察效果后再逐步扩大。这个场景就是灰度发布。用 Gateway API 可以轻松实现:为新旧两个版本分别定义后端,并通过 HTTPRoute 的权重字段控制流量比例。

灰度发布的核心公式非常直观:

除了灰度发布,生产环境还常用流量镜像:把线上请求复制一份发送给新版本,但不影响真实用户,用于搜集模型效果对比;故障演练则会在演练环境中随机杀掉一些 Pod,观察入口网关和服务网格能否自动切换流量;多集群网关更是 AI 基础设施的常见方案,让一个入口背后连接多个 Kubernetes 集群,实现容灾和弹性伸缩。这就像写字楼全面升级后,门禁、秘书、消防通道和应急预案都演练到位,楼内几千人也能安全高效地运转。

r=wnewwold+wnewr = \frac{w_{\text{new}}}{w_{\text{old}} + w_{\text{new}}}
新版本接收的流量比例,等于新版本权重除以新旧版本权重之和。
  1. 新版本权重希望分给新版模型的流量份额。
    wneww_{\text{new}}
  2. 新旧权重总和两个版本共同组成的完整流量池。
    wold+wneww_{\text{old}} + w_{\text{new}}
  3. 灰度比例 r新版本实际承担的用户请求比例,例如 10%=0.1。
    rr

AI 应用场景

AI 模型推理服务的统一入口

阶段:模型部署与上线

解决的问题:大模型推理服务通常需要暴露 /v1/chat、/v1/embedding 等不同接口,后端可能分散在 GPU 节点池中。如果让每个模型服务各自暴露端口,运维混乱且难以统一鉴权、限流和监控。用 Gateway API 可以把所有推理接口收敛到一个入口,再按路径路由到不同推理服务。

具体案例:某 AI 公司部署多个开源模型,通过一个 Gateway 统一接收请求,/v1/chat 路由到对话模型,/v1/embedding 路由到向量模型,并为每个路由挂载限流策略,避免单个模型被打爆。

微服务灰度发布

阶段:模型版本迭代与 A/B 测试

解决的问题:传统发布方式是全量替换,出了问题影响所有用户。使用 Ingress/Gateway API 的权重路由,可以让新版模型先接收 5%~10% 流量,结合可观测性指标决定是否继续放大流量。

具体案例:推荐系统团队发布新排序模型,通过 HTTPRoute 设置旧版本权重 90、新版本权重 10,同时配合服务网格 mTLS 保障内部调用安全,观察点击率与延迟指标后再动态调整权重。

多集群容灾网关

阶段:AI 基础设施容灾

解决的问题:单集群故障会导致 AI 服务不可用。多集群网关可以将外部流量统一接入,再分发到不同区域集群中的后端服务,并在某个集群异常时自动切除故障节点。

具体案例:某金融 AI 平台在双园区各部署一套 Kubernetes 集群,通过 Gateway API 暴露统一域名,后端 Service 分布在两个集群,健康检查发现某一园区故障后,网关自动把流量全部切换到另一园区。

Python 演示

python42 行
import randomfrom collections import Counter BACKENDS = [    {"name": "api-v1", "weight": 5, "healthy": True},    {"name": "api-v2", "weight": 2, "healthy": True},    {"name": "static", "weight": 3, "healthy": True},] def weighted_choice(backends):    total = sum(b["weight"] for b in backends if b["healthy"])    r = random.uniform(0, total)    upto = 0    for b in backends:        if not b["healthy"]:            continue        upto += b["weight"]        if r <= upto:            return b    return backends[0] def route(path):    if path.startswith("/api"):        return [b for b in BACKENDS if b["name"].startswith("api")]    if path.startswith("/static"):        return [b for b in BACKENDS if b["name"] == "static"]    return BACKENDS def simulate(requests):    counter = Counter()    for path in requests:        pool = route(path)        chosen = weighted_choice(pool)        counter[chosen["name"]] += 1    return counter if __name__ == "__main__":    random.seed(42)    paths = ["/api/order" if i % 2 == 0 else "/static/banner" for i in range(1000)]    result = simulate(paths)    for name in result:        print(name, result[name])
目的:模拟一个简化版 Ingress 路由:先按 URL 路径筛选后端候选池,再在候选池内按权重做负载均衡,最后统计流量分布。
  1. total = sum(b["weight"] for b in backends if b["healthy"])只对健康后端求权重总和,相当于门禁只把访客带到“正常营业”的房间。
  2. r = random.uniform(0, total)生成一个 0 到总权重之间的随机数,相当于走到门口随机抽一个分流结果。
  3. upto += b["weight"]逐个累加权重,把总权重切成连续区间。
  4. if r <= upto:随机数落在当前区间内,就选中这个后端。
  5. pool = route(path)先按路径缩小候选范围,例如 /api 请求只会进入 API 后端。
  6. chosen = weighted_choice(pool)在候选池内执行加权随机选择。
  7. counter[chosen["name"]] += 1记录每个后端被选中的次数,用于观察最终分流比例。

常见误区

误区我以为写好 Ingress YAML 之后,流量就会自动被转发,入口就建好了。

正解Ingress 只是“门口贴的说明牌”,本身不干活。真正转发流量的是 Ingress Controller,比如 Nginx Ingress Controller 或 Envoy Gateway。Controller 会 Watch Ingress 对象,把规则翻译成代理配置。没有 Controller,Ingress 就是一张废纸。

为何常见:很多教程只讲 Ingress 资源,忽略了 Controller 的部署和运行,容易让人误以为写个 YAML 就万事大吉。

误区我以为 Gateway API 就是把 Ingress 字段换个名字,写起来更“时髦”。

正解Gateway API 改变的是管理模型。它把基础设施方、集群管理员、业务开发者的职责分开,支持跨命名空间引用、策略挂载、多层路由等能力。表面看都是 YAML,但 Gateway API 更像一套智能门禁系统,而不是一张手写登记表。

为何常见:初次接触时只看到 YAML 结构相似,容易忽略角色分离带来的治理能力差异。

误区既然服务网格有 Sidecar,是不是连 Ingress/Gateway API 都可以去掉?

正解服务网格主要面向东西向流量,解决服务与服务的通信安全、重试、可观测性;API 网关负责南北向流量,解决外部访客如何进门。两者就像楼内秘书和门禁保安,职责不同。虽然 Istio 也提供入口网关,但一般不会完全替代 Gateway API。

为何常见:看到 Istio 等网格系统也带网关功能,误以为两者完全重叠。

误区接口失败就拼命重试,总有一次会成功,所以重试次数越大越好。

正解重试会放大打到后端的请求量。故障时如果所有调用方都在疯狂重试,后端很快就会被压垮。必须设置合理的重试次数、超时预算和退避时间,并配合熔断快速失败。

为何常见:直觉上“多试几次”更保险,忘了考虑故障期间的系统整体压力。

误区负载均衡权重调大,流量就都能去最强的那台机器。

正解权重只决定分配比例,不是性能保证。如果那台机器已经不健康,或者连接数已经满,高权重反而会加速压垮它。实际生产环境要把权重和健康检查、连接数上限、熔断策略配合使用。

为何常见:把权重当成静态的“性能参数”,忽略了后端动态运行状态。

面试题

Q1. Ingress 对象本身在 Kubernetes 中的作用是什么?

单选题 · easy

  • A.声明外部访问服务的路由规则← 正确答案
  • B.直接修改内核网络转发规则
  • C.代替 Service 做容器编排调度
  • D.提供持久化数据存储能力

答案:A。Ingress 是声明式资源对象,描述外部请求如何路由到内部服务,就像门口贴的接待说明牌。它本身不改变内核网络,也不做容器编排或存储。

Q2. 谁真正实现了 Ingress 的流量转发?

单选题 · easy

  • A.Ingress Controller 与后端代理← 正确答案
  • B.etcd 集群与 kubelet 组件
  • C.CNI 插件与存储插件
  • D.kube-proxy 与调度器组件

答案:A。真正干活的是 Ingress Controller,它把 Ingress 规则转成 Nginx、Envoy 等代理配置并执行转发。etcd 和 kubelet 是集群基础组件,不负责入口流量转发。

Q3. Gateway API 相比传统 Ingress 的改进点有哪些?

多选题 · hard

  • A.按角色分离基础设施管理← 正确答案
  • B.路由规则可跨命名空间引用← 正确答案
  • C.完全不需要 Controller 参与
  • D.自带数据库存储健康状态

答案:AB。Gateway API 通过 GatewayClass、Gateway、HTTPRoute 实现角色分层,并支持跨 namespace 引用。它仍然需要 Controller 实现,也不带数据库存储功能。

Q4. 服务网格中的东西向流量与 API 网关处理南北向流量,区别在于?

单选题 · mid

  • A.网格关注服务间调用安全← 正确答案
  • B.网格只负责容器镜像构建
  • C.网关只处理数据库读写
  • D.网关不能暴露 HTTP 接口

答案:A。服务网格通过 Sidecar 处理服务与服务之间的东西向流量,负责 mTLS、重试、可观测性。API 网关处理外部南北向流量,容器镜像构建和数据库读写都不是其核心职责。

Q5. 加权轮询负载均衡的核心思路是什么?

单选题 · mid

  • A.按权重比例分配请求← 正确答案
  • B.按连接数最少分配
  • C.按 CPU 使用率分配
  • D.按随机数平均分配

答案:A。加权轮询让每个后端按权重获得对应比例的流量,权重高则请求多。连接数、CPU 使用率属于动态负载均衡策略,随机平均分配则没有权重概念。

Q6. 熔断降级为防止故障扩散,常见动作有哪些?

多选题 · mid

  • A.快速失败拒绝新请求← 正确答案
  • B.无限重试直到成功
  • C.返回降级默认响应← 正确答案
  • D.关闭监控和日志采集

答案:AC。熔断开启后,应该快速失败而不是继续等待,同时返回降级响应保障用户体验。无限重试会放大故障,关闭监控更是会让问题不可见。

Q7. 使用重试机制提升可靠性时,最需要注意什么?

单选题 · easy

  • A.限制重试次数与超时← 正确答案
  • B.重试次数越多越好
  • C.只要失败就重试即可
  • D.重试不会增加后端压力

答案:A。重试必须有限制,否则故障时请求会被无限放大,压垮后端。合理做法是限制重试次数、设置超时预算,并结合退避策略。

Q8. 令牌桶算法限制流量的核心思想是什么?

单选题 · mid

  • A.以恒定速率补充令牌← 正确答案
  • B.用随机概率丢弃请求
  • C.把所有请求直接排队
  • D.根据 CPU 次数放行

答案:A。令牌桶以固定速率补充令牌,请求需要拿到令牌才能通过,从而平滑突发流量。随机丢弃和直接排队都不是令牌桶的核心。

Q9. 用 Gateway API 做灰度发布时,可以怎么做?

多选题 · hard

  • A.按权重切分新版流量← 正确答案
  • B.按请求头匹配灰度用户← 正确答案
  • C.让新旧版本互相隔离← 正确答案
  • D.避免任何网络开销

答案:ABC。Gateway API 的 HTTPRoute 支持权重路由和请求头匹配,可以把少量用户导入新版本,同时新旧版本作为独立后端服务隔离。任何网络方案都无法避免全部网络开销。

Q10. 在多集群场景下使用统一网关,最直接的收益是什么?

单选题 · extreme

  • A.一个入口路由到多个集群← 正确答案
  • B.替代所有集群存储系统
  • C.让容器镜像自动构建
  • D.消除所有网络延迟

答案:A。统一网关把多个集群收敛到一个入口,支持跨集群容灾和流量调度。它不能替代存储、镜像构建,也无法消除网络延迟。