DEV Community

anatraf-nta
anatraf-nta

Posted on

Kubernetes 集群里服务间歇性超时怎么排查:从东西向流量到证据闭环的实战方法

很多团队第一次碰到这类问题时,现场都很像:

  • 应用侧报超时,但不是持续性全挂
  • APM 能看到 RT 抖高,但很难解释是哪一跳出了问题
  • 节点 CPU、内存、磁盘看起来都“还行”
  • 网络侧没有明确链路中断,业务却已经开始间歇性报错

最麻烦的地方在于,这类故障往往不是“彻底不可用”,而是间歇性抖动。它会在高峰期、某些可用区、某些节点、某类请求上反复出现,短则几十秒,长则几分钟。等人开始临时抓包时,异常又往往消失了。

这也是为什么很多团队明明做了监控、上了日志、接了 APM,到了真正排障时仍然像在拼拼图。不是没有数据,而是没有围绕故障路径建立一条能闭环的网络证据链。

这篇文章不讲空泛原则,直接围绕一个高频而棘手的实战场景展开:Kubernetes 集群里服务之间出现间歇性超时,应该如何快速缩小范围、拿到证据,并把问题定位到可执行的修复动作。

一、先统一认知:服务超时,不等于应用一定有问题

很多团队看到超时,第一反应就是怀疑应用线程池、数据库慢查询或者代码发布出了 bug。这个方向不能说错,但如果一上来就把所有责任推给应用,通常会错过最关键的排障窗口。

因为“服务超时”只是结果,不是原因。一次服务间调用,至少会经过下面这条链路:

  1. 源 Pod 发起请求
  2. 请求经过源节点网络栈
  3. 经过 CNI / overlay / kube-proxy / Service 转发逻辑
  4. 穿过节点间或跨可用区网络路径
  5. 到达目标节点与目标 Pod
  6. 目标应用处理请求并返回
  7. 响应沿路径返回给源端

这条链上的任何一个点出现抖动,都可能表现成“下游接口超时”。

所以第一条原则很简单:不要把超时当成应用层单点故障,而要把它当成一条调用链的稳定性问题。

二、这类故障为什么总是难查

Kubernetes 场景下的间歇性超时,难查通常不是因为技术本身多神秘,而是因为它同时具备四个特征:

1)影响范围不规则

不是整站挂,而是:

  • 只有部分服务调用异常
  • 只有跨节点、跨可用区调用更明显
  • 只有某些节点上的 Pod 更容易出问题
  • 只有高峰期或发布后的一段时间更容易触发

如果只看全局平均值,问题很容易被稀释掉。

2)持续时间短

很多抖动只持续几十秒到几分钟。人还在拉群、看面板、找权限,现场已经过去了。没有历史回溯,排障就会迅速退化成“凭感觉复盘”。

3)现象跨层

应用侧看到的是超时,平台侧看到的是连接数波动,网络侧看到的可能只是 RTT 抬升、重传增加,基础设施侧甚至没有一个“直接爆红”的大告警。结果就是每层都像有一点问题,又都不像绝对根因。

4)证据容易丢

最常见的一句话就是:

刚才还复现,现在又好了。

没有连续流量证据和历史回放能力,这类故障一恢复,团队就又回到了猜。

三、排查起手式:先判断是“局部路径问题”还是“全局承压问题”

真正高效的排障,第一步不是找根因,而是切范围。

建议先回答四个问题:

  1. 只有某个服务对某个下游超时,还是多个服务一起抖?
  2. 只有某些节点上的 Pod 报错,还是所有副本都报错?
  3. 只有跨可用区路径异常,还是同可用区内也异常?
  4. 异常发生时,目标服务本身资源是否同步承压?

这一步的意义,是把问题快速分成两类:

情况 A:全局承压问题

比如目标服务线程池耗尽、依赖数据库抖动、缓存雪崩、容器被限流。这类问题通常会让目标服务的大部分调用都变差,且应用或资源指标能看到同步异常。

情况 B:局部路径问题

比如某批节点 conntrack 紧张、某段 overlay 路径异常、跨可用区链路抖动、MTU 不一致、特定节点网卡重传增高。这类问题通常表现为:

  • 不是所有副本一起坏
  • 平均值没那么夸张,但局部调用特别差
  • 同服务不同路径表现明显不同

如果一开始不先做这个区分,团队就很容易一头扎进应用日志里,最后把网络层的间歇性问题当成“代码偶发慢”。

四、实战里最有效的排查框架:按 5 层证据往下压

第一层:状态证据——先看异常集中在哪里

这一层不急着定根因,先看模式。

重点切片维度:

  • 源服务 → 目标服务
  • 源节点 → 目标节点
  • 源可用区 → 目标可用区
  • Pod 实例维度
  • 时间窗口维度

要回答的问题是:

  • 异常是否只集中在个别节点池?
  • 是否跨 AZ 的请求明显更差?
  • 是否某次扩容后新节点更容易触发?
  • 是否只有某类请求包体更大时才明显超时?

很多问题到这一步,其实边界已经收缩了一半。

第二层:传输证据——看是不是网络质量在先变差

很多团队只盯应用 RT,但真正把排障拉开差距的,是把传输层信号一起看。

重点关注:

  • TCP 建连耗时
  • SYN 重试
  • RTT 抖动
  • 重传率
  • RST / 连接重置
  • 零窗口 / 窗口异常

如果你发现应用 RT 升高的同时,TCP 重传和 RTT 抖动也同步放大,那就要高度怀疑问题不只是应用慢,而是传输链路先出了问题。

反过来,如果传输层很稳,只有应用处理时间变长,那再优先回到目标服务自身去查。

第三层:节点证据——看是不是个别节点或网络栈局部异常

Kubernetes 场景里,很多“神秘超时”最后都不是整个集群问题,而是个别节点的问题被服务层放大。

重点检查:

  • conntrack 使用率是否接近上限
  • NAT / 端口资源是否紧张
  • 网卡是否有突发丢包、错误包、驱动异常
  • backlog / socket 队列是否堆积
  • 容器网络插件是否在异常时间点有重建、重试、报错

这类问题为什么难?因为它们非常容易被平均值掩盖。集群整体健康,不代表某两台节点之间的通信健康。

第四层:路径证据——确认问题是在同区内、跨区间,还是 overlay 路径里

如果目标服务本身没有明确承压,节点局部又存在异常信号,就要继续往路径层收。

重点看:

  • 同可用区与跨可用区调用是否存在明显差异
  • 某条节点到节点路径是否重传更集中
  • 大包与小包表现是否不同
  • CNI / overlay 相关路径是否与底层 MTU、路由、策略不一致
  • kube-proxy / Service 转发是否在特定时间点发生抖动

这里有一个特别高频的坑:

业务流量并没有“断”,但在某些特定路径下,它已经不够稳定到支持低延迟调用。

这时平台面板可能不会报“链路中断”,但业务已经开始超时。

第五层:时间证据——把异常和变更对齐

任何一次间歇性超时,如果不放到时间轴里,都很难真正讲清楚。

建议把这些事件统一放到一条时间线上:

  • 异常调用峰值出现时间
  • 节点扩缩容时间
  • 服务发布/回滚时间
  • CNI、内核、系统参数变更时间
  • 云网络或安全策略调整时间
  • 数据库、缓存、消息队列慢查询或抖动时间

很多团队把问题叫“偶发”,只是因为没把时间线对齐。时间线一对齐,偶发问题往往就变成了可解释的问题。

五、一个典型案例:不是服务挂了,而是跨节点路径在特定报文下抖了

某团队在 Kubernetes 上部署了一组订单相关服务。白天高峰期,订单创建接口 P95 从 150ms 飙到 1.5s,应用侧日志里大量出现下游库存服务超时。

起初大家都怀疑库存服务代码有问题,因为超时主要报在它身上。但继续排查后,现象开始变得不对劲:

  • 库存服务 CPU、内存并不高
  • 同节点内访问大多正常
  • 跨节点调用更容易抖
  • 某些新扩容节点上的 Pod 命中率更高

团队继续往下做了三步:

第一步:按源节点和目标节点切片

发现异常并不是所有调用都差,而是集中在少数节点对之间。问题边界从“库存服务整体异常”缩小成了“部分节点间通信异常”。

第二步:回看传输层特征

发现异常窗口里 RTT 抖动放大、TCP 重传升高,但没有明显整段链路中断。说明这不是典型的服务全挂,而是路径质量在抖。

第三步:对齐扩容与网络配置变更

最终定位到一批新节点接入后,overlay 网络与底层路径的 MTU 配置不一致。平时小包调用问题不明显,但某些响应包稍大时,就会更容易触发分片与重传,最终放大成业务超时。

这类问题最容易误导人的地方在于:

  • 应用层确实报超时
  • 基础设施层又没有明确“断网”
  • 平均带宽和平均丢包并不夸张
  • 只有部分路径、部分流量形态会触发

如果没有历史流量回溯和按路径切片的证据能力,这种问题通常会在“像应用问题”与“像网络偶发”之间来回拉扯很多轮。

六、这类故障里最值得优先检查的 6 个根因

1. 节点 conntrack 或 NAT 资源紧张

这类问题很典型:整体资源没打满,但高峰期局部节点连接跟踪或端口资源逼近上限,导致新连接建立变慢甚至失败。

2. 跨可用区路径质量波动

尤其是东西向流量跨 AZ、跨 VPC、跨专线时,轻微的链路波动就可能先表现成应用超时,而不是明显中断。

3. CNI / overlay 路径异常

包括 MTU 不一致、封装额外开销未被正确考虑、特定节点隧道路径不稳等。这类问题经常只在某些节点或某些报文形态下触发。

4. kube-proxy / Service 转发表抖动

服务发现、端点变更、规则刷新异常,都会让部分调用出现短暂不稳定。

5. 目标服务本身并不慢,但探针或侧车路径变重

比如 sidecar、mTLS、额外鉴权链路、深度健康检查等,都会让调用链增加比想象中更多的不确定性。

6. 发布、扩容、系统参数修改后的配置不一致

很多团队的问题不在于“改坏了”,而在于“只改对了一部分”。节点池之间参数不一致、镜像版本不一致、网络配置不一致,都会制造这种间歇性抖动。

七、给运维与平台团队的落地建议:把“超时告警”升级成“证据闭环”

如果你的团队经常遇到“服务间歇性超时,但谁都说自己没问题”,通常不是人不够努力,而是观测体系还停留在结果层。

更稳的做法,是围绕高频业务调用链建立三类能力:

1)实时发现能力

能快速看到哪些服务对、哪些节点对、哪些时间窗口开始变差,而不是只在总览面板上看到 RT 高了。

2)历史回溯能力

故障发生后,仍然可以回看关键时间段里的传输行为、路径特征和异常连接,而不是只能复读“当时好像抖了一下”。

3)证据协同能力

让应用、平台、网络团队看到的是同一条故障路径、同一组时间窗口、同一批异常证据,而不是每个团队各自截一张图讲自己的故事。

真正高效的排障,不是每次都临时抓包碰运气,而是让团队在告警触发后,能顺着证据链一路钻到根因。

结语

Kubernetes 里的服务间歇性超时,最难的从来不是“知道出问题了”,而是在问题短暂出现后,还能不能拿到足够证据解释它为什么发生。

一旦团队只剩下日志片段、平均指标和口头回忆,排障就会迅速退化成猜测。相反,如果你能围绕东西向流量建立实时观测、历史回溯和路径级证据闭环,这类故障就会从“说不清的偶发问题”,变成“可复盘、可验证、可修复”的工程问题。

如果你的团队正在补齐这条能力链,建议优先从最关键的服务调用路径和最常复发的跨节点/跨可用区问题入手,先把“发现异常 → 留住证据 → 定位根因”这条链跑通,再考虑规模化扩展。

AnaTraf(www.anatraf.com)专注于面向 IT 与 NetOps 团队的全流量监测、历史回溯与网络根因分析,适合需要把“看到调用超时”进一步升级为“拿到路径证据并完成定位”的场景。

Top comments (0)