想象你站在一座新建的巨型写字楼前。外面的人要拜访楼里的公司,得先经过门岗、登记、刷卡;楼里不同公司之间要互相送文件、开会,则走另一套内部通道。这座写字楼就是 Kubernetes 集群,外面来的人叫“外部流量”,楼内公司之间的往来叫“服务间流量”。今天要聊的 Ingress 和 Gateway API,就是管理“楼外的人怎么进门”的门禁系统;而服务网格,则是楼内各部门派出的“专属秘书”,负责内部安全传递。整篇文章会从一张“进楼路线图”讲起,逐步拆解入口规则、智能门禁、楼内秘书、调度算法、性能优化和实战案例。读完你会明白:为什么云原生工程师把入口设计称为“盖楼时最重要的第一步”。
对云原生与 AI 基础设施工程师而言,掌握 Ingress 与 Gateway API,意味着能设计出高可用、可灰度、可观测的流量入口,这是线上 AI 服务稳健运行的核心能力。
可视化演示
Ingress与Gateway API是云原生流量编排入口。拖动滑块调整流量。观察两种API的架构差异、路由流程与性能优化机制。
本节配有交互动效(进入视口后自动加载,约 3KB)。
网关核心 流量路由 扩展 入口→路由→服务
流量入口基础
一座写字楼再豪华,如果正门只够两个人并排走,高峰期就会乱成一团。Kubernetes 集群也是如此:外部用户要访问 AI 推理服务、模型 API,首先经过的就是“入口”。在云原生世界中,这个入口通常由 Ingress 和 Gateway API 来定义。你可以把 Ingress 理解成贴在写字楼门口的“接待说明牌”,上面写着:哪些访客走东门、哪些访客坐哪部电梯、哪些访客需要登记。不过,说明牌本身不会行动,真正守在门口执行接待工作的是 Ingress Controller,也就是写字楼的门岗保安。
从技术上看,Ingress 是 Kubernetes 的一种 API 资源对象,它描述“外部访问服务的规则”;Ingress Controller 则是独立部署的代理程序,负责监听 Ingress 对象的变化,把规则翻译成 Nginx、Envoy 等网关的配置。外部流量进入集群,再从服务暴露出去,这种“楼外到楼内”的流向叫南北向流量;而服务与服务之间互相调用,属于“楼内房间到楼内房间”,叫东西向流量。Ingress 解决的是前者。
入口的接待能力决定了整个系统能扛住多大的访问量。我们可以用一个小公式来估算:
所以,提高入口性能不只是加带宽,还要同时关注“减少响应耗时”和“合理设置并发连接”。这就像写字楼想要提高进门效率,既要加快登记速度,也要拓宽门廊,而不是只把门牌号写得更漂亮。
- 并发连接数 C大楼门口同一时刻排队的访客数量,也就是系统里正在处理但没有结束的请求数。
- 平均响应时间 R每位访客从进门到办完事离开的平均耗时,对应一个请求从进入到返回的平均时间。
- 入口吞吐量 Q每秒能接待多少人,等于“门口能同时站多少人”除以“每人平均停留多久”。
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 的规则册越是精细,越要考虑后端负载。就像前台保安如果发现某个公司在排队,就应该引导访客去另一家同样能处理业务的办公室。
- 当前连接数 C_i第 i 个后端房间此刻正在接待的请求数。
- 最大连接数 C_i^{max}该后端房间设计时允许的最大并发数。
- 负载比例 η_i如果超过 100%,说明这个房间已经满员,入口应该减少向它转发请求。
Gateway API进阶
传统 Ingress 就像一名保安身兼数职:既决定装什么样的大门,又制定访客规则,还负责接待每个人。当楼里只有几家公司时还行,可一旦有几十个团队,就会互相踩脚。Gateway API 的诞生,就是要把这些职责拆开:物业负责选门禁品牌,安保负责设置入口实例,各家公司自己提交访客接待单。
在 Gateway API 中,GatewayClass 对应“物业选定的门禁供应商”,它声明使用哪种控制器实现;Gateway 对应一个具体入口,相当于楼下真正装好的那台门禁机;HTTPRoute 则是业务团队提交的路由规则,描述“什么请求去什么服务”。三者分离后,基础设施管理员和业务开发者可以并行工作,甚至可以跨命名空间引用路由,策略也不再像 Ingress 注解那样散落各处,而是能统一挂载到 Gateway 或 HTTPRoute 上。
路由规则往往要同时满足多个条件,比如“路径是 /v1/chat,且请求头里带有灰度标签”。我们可以用组合概率来理解:
Gateway API 的智能之处,是把“谁定门禁、谁管入口、谁定义路由”彻底分层。这就像物业、安保、公司前台各司其职,整栋楼的入口管理才真正走向规模化。
- 单个条件概率 p_k每个匹配条件单独命中的概率,例如“路径匹配”和“请求头匹配”各自成立的概率。
- 连乘符号多个条件必须同时满足,所以概率相乘。
- 最终命中率条件叠加后得到的整体匹配概率。
服务网格协同
访客通过门禁进入楼内后,要去不同的房间。房间之间怎么沟通?总不能每家公司都派一群人到处跑。于是,每个部门安排了一位“专属秘书”——Sidecar 代理。这位秘书负责替部门送文件、接收文件、做记录,还负责检查对方身份。一个 Pod 旁边挂一个 Sidecar,就相当于每个房间门口都有一位秘书,服务之间的所有通信都从秘书手里经过。
服务网格处理的就是这种东西向流量。它负责服务发现,让秘书们知道彼此在哪;负责 mTLS,让每次通信都加密且互相验证身份;还负责可观测性,把每次调用的延迟、状态、错误都记录下来。API 网关处理的是“楼外到楼内”,服务网格处理的是“楼内到楼内”。两者并不冲突,反而是配合关系:访客由门禁接入后,再由秘书带着去正确房间。
当楼内服务越来越多时,服务网格需要维护的安全通道数量会快速增长。例如 N 个服务都使用 mTLS 通信,两两之间都要建立可信连接:
服务网格的可扩展性挑战也来源于此。正因如此,很多系统并不会让所有服务都全互联,而是通过服务发现和分层路由,把通道控制在一个合理范围。门禁管好外面,秘书管好里面,整栋楼才能有序运转。
- 服务数量 N楼内参与通信的房间总数。
- 两两组合每个房间都要与其他 N−1 个房间建立通道,但 A 到 B 和 B 到 A 是同一条。
- 总通道数 T服务规模翻倍时,通道数远不止翻倍。
调度与容错算法
门禁和秘书都解决“去哪”的问题,但具体“去哪个房间”需要算法说了算。最常见的策略是加权负载均衡:每个后端房间根据自己的硬件能力,拥有不同权重。能力强、机器多的房间权重高,承接更多请求;刚扩容的新房间权重低,先接收少量流量观察情况。
权重分配可以用一个概率公式描述:
光有负载均衡还不够,系统还要学会容错。比如,某个后端房间正在冒烟,如果一直把请求送进去,只会烧得更厉害。这时需要熔断降级:连续失败次数超过阈值后,入口直接“拉闸”,快速返回默认响应,而不是继续排队等待。重试也要有限制,失败就重试,看起来稳妥,但故障时无限重试会把后端彻底压垮。正确的做法是设置重试次数、超时时间和退避策略,再配合健康检查,只把流量发给体检合格的后端。
这套逻辑就像大楼里发生火情时,保安会临时封闭某些电梯,引导访客走备用楼梯;等到火情解除,再恢复电梯使用。调度与容错算法的核心,就是“永远不要把鸡蛋放进一个正在漏水的篮子”。
- 单个权重 w_i第 i 个后端被分配的流量份额。
- 总权重所有健康后端权重之和,分母越大,单点被选中的概率越小。
- 选中概率 P_i入口按这个比例把请求均匀摊到不同后端。
性能优化策略
写字楼高峰期,门口排队的人越来越多。与其让所有人挤在门口,不如优化进门流程。网关常见的性能优化手段包括:连接复用,把多个请求塞进同一条连接里,减少反复握手;内容缓存,把静态响应放在门口附近,访客不用每次都跑到后端房间;动态压缩,对大数据量的响应先压缩再传输。这些策略能显著降低入口延迟和后端压力。
但当流量突然暴增时,还需要“限流控制”。令牌桶算法是常用的一种思路:系统按固定速率向桶里放令牌,每个请求必须取到令牌才能进入。如果桶空了,请求就会被拒绝或排队,避免后端被超额流量冲垮。令牌桶可以表示为:
令牌桶算法非常适合 AI 推理服务:模型接口希望保持稳定吞吐,而不是被瞬间的高并发打乱节奏。门禁放行的速度一旦可控,整个楼内系统就能保持平稳,不至于因为一个高峰把所有房间都挤满。
- 当前令牌数 b_n此刻桶里攒下的可用令牌数量。
- 补充速率 ρ每秒向桶里放入多少个令牌,相当于门禁每秒放行的速度。
- 容量上限 C桶最多能装多少令牌,防止突发流量一次性耗尽所有资源。
实践与案例
把前面的知识拼起来,就是一次写字楼入口系统的整体升级。想象一家 AI 公司要发布新版推荐模型,团队不希望一次性切换用户,而是先让 10% 的流量走新模型,观察效果后再逐步扩大。这个场景就是灰度发布。用 Gateway API 可以轻松实现:为新旧两个版本分别定义后端,并通过 HTTPRoute 的权重字段控制流量比例。
灰度发布的核心公式非常直观:
除了灰度发布,生产环境还常用流量镜像:把线上请求复制一份发送给新版本,但不影响真实用户,用于搜集模型效果对比;故障演练则会在演练环境中随机杀掉一些 Pod,观察入口网关和服务网格能否自动切换流量;多集群网关更是 AI 基础设施的常见方案,让一个入口背后连接多个 Kubernetes 集群,实现容灾和弹性伸缩。这就像写字楼全面升级后,门禁、秘书、消防通道和应急预案都演练到位,楼内几千人也能安全高效地运转。
- 新版本权重希望分给新版模型的流量份额。
- 新旧权重总和两个版本共同组成的完整流量池。
- 灰度比例 r新版本实际承担的用户请求比例,例如 10%=0.1。
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 演示
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])
total = sum(b["weight"] for b in backends if b["healthy"])只对健康后端求权重总和,相当于门禁只把访客带到“正常营业”的房间。r = random.uniform(0, total)生成一个 0 到总权重之间的随机数,相当于走到门口随机抽一个分流结果。upto += b["weight"]逐个累加权重,把总权重切成连续区间。if r <= upto:随机数落在当前区间内,就选中这个后端。pool = route(path)先按路径缩小候选范围,例如/api请求只会进入 API 后端。chosen = weighted_choice(pool)在候选池内执行加权随机选择。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 中的作用是什么?
- A.声明外部访问服务的路由规则← 正确答案
- B.直接修改内核网络转发规则
- C.代替 Service 做容器编排调度
- D.提供持久化数据存储能力
答案:A。Ingress 是声明式资源对象,描述外部请求如何路由到内部服务,就像门口贴的接待说明牌。它本身不改变内核网络,也不做容器编排或存储。
Q2. 谁真正实现了 Ingress 的流量转发?
- A.Ingress Controller 与后端代理← 正确答案
- B.etcd 集群与 kubelet 组件
- C.CNI 插件与存储插件
- D.kube-proxy 与调度器组件
答案:A。真正干活的是 Ingress Controller,它把 Ingress 规则转成 Nginx、Envoy 等代理配置并执行转发。etcd 和 kubelet 是集群基础组件,不负责入口流量转发。
Q3. Gateway API 相比传统 Ingress 的改进点有哪些?
- A.按角色分离基础设施管理← 正确答案
- B.路由规则可跨命名空间引用← 正确答案
- C.完全不需要 Controller 参与
- D.自带数据库存储健康状态
答案:AB。Gateway API 通过 GatewayClass、Gateway、HTTPRoute 实现角色分层,并支持跨 namespace 引用。它仍然需要 Controller 实现,也不带数据库存储功能。
Q4. 服务网格中的东西向流量与 API 网关处理南北向流量,区别在于?
- A.网格关注服务间调用安全← 正确答案
- B.网格只负责容器镜像构建
- C.网关只处理数据库读写
- D.网关不能暴露 HTTP 接口
答案:A。服务网格通过 Sidecar 处理服务与服务之间的东西向流量,负责 mTLS、重试、可观测性。API 网关处理外部南北向流量,容器镜像构建和数据库读写都不是其核心职责。
Q5. 加权轮询负载均衡的核心思路是什么?
- A.按权重比例分配请求← 正确答案
- B.按连接数最少分配
- C.按 CPU 使用率分配
- D.按随机数平均分配
答案:A。加权轮询让每个后端按权重获得对应比例的流量,权重高则请求多。连接数、CPU 使用率属于动态负载均衡策略,随机平均分配则没有权重概念。
Q6. 熔断降级为防止故障扩散,常见动作有哪些?
- A.快速失败拒绝新请求← 正确答案
- B.无限重试直到成功
- C.返回降级默认响应← 正确答案
- D.关闭监控和日志采集
答案:AC。熔断开启后,应该快速失败而不是继续等待,同时返回降级响应保障用户体验。无限重试会放大故障,关闭监控更是会让问题不可见。
Q7. 使用重试机制提升可靠性时,最需要注意什么?
- A.限制重试次数与超时← 正确答案
- B.重试次数越多越好
- C.只要失败就重试即可
- D.重试不会增加后端压力
答案:A。重试必须有限制,否则故障时请求会被无限放大,压垮后端。合理做法是限制重试次数、设置超时预算,并结合退避策略。
Q8. 令牌桶算法限制流量的核心思想是什么?
- A.以恒定速率补充令牌← 正确答案
- B.用随机概率丢弃请求
- C.把所有请求直接排队
- D.根据 CPU 次数放行
答案:A。令牌桶以固定速率补充令牌,请求需要拿到令牌才能通过,从而平滑突发流量。随机丢弃和直接排队都不是令牌桶的核心。
Q9. 用 Gateway API 做灰度发布时,可以怎么做?
- A.按权重切分新版流量← 正确答案
- B.按请求头匹配灰度用户← 正确答案
- C.让新旧版本互相隔离← 正确答案
- D.避免任何网络开销
答案:ABC。Gateway API 的 HTTPRoute 支持权重路由和请求头匹配,可以把少量用户导入新版本,同时新旧版本作为独立后端服务隔离。任何网络方案都无法避免全部网络开销。
Q10. 在多集群场景下使用统一网关,最直接的收益是什么?
- A.一个入口路由到多个集群← 正确答案
- B.替代所有集群存储系统
- C.让容器镜像自动构建
- D.消除所有网络延迟
答案:A。统一网关把多个集群收敛到一个入口,支持跨集群容灾和流量调度。它不能替代存储、镜像构建,也无法消除网络延迟。