概述:2026年,国内主要运营商的5GC控制面基本完成了虚拟化/容器化改造,AMF、UDM、NRF这些“大脑”网元,如今都跑在Kubernetes集群和分布式存储之上。但运维的手册还停留在“看网元告警、查信令跟踪”的老时代——当地基(存储、节点)出问题时,故障会以“网元抽风”的假面目出现。本文以一个脱敏复合案例为主线,复盘一次“AMF反复重启、用户批量掉线”的深夜故障:值班如何被假病因带偏、K8s的默认机制如何放大事故、最终如何在存储层抓到真凶,并给出可落地的分层治理清单。
先说清楚:这是一个脱敏复合案例,由多起真实的云化核心网故障模式合成,环境细节做了改写,但每一步的技术机制都有据可查,文末附官方文档来源。场景是一家省公司的5GC控制面资源池:约40个K8s worker节点、Ceph分布式存储做持久卷,AMF容量池3副本、UDM/NRF若干,承载全省约两千万用户的NAS信令。
时间线如下:
| 时间 | 事件 | 表面现象 |
|---|---|---|
| 23:41 | Ceph集群出现慢请求提示,未触发短信告警 | 无感知 |
| 23:47 | worker-07上的AMF实例OOM重启,N1/N2接口闪断 | 网元告警:AMF异常重启 |
| 23:52 | AMF池另两个实例接连抖动,容量降25% | 用户批量掉线、附着变慢 |
| 00:15 | 值班判断“新版本引入bug”,启动回滚 | 版本回滚开始 |
| 01:30 | 回滚完成,故障依旧,且回滚期间业务二次受损 | 事故升级 |
| 01:50 | 平台组介入,第一次看K8s节点状态 | 发现两个节点NotReady |
| 02:10 | 查Ceph健康状态,确认慢OSD | 真凶现身:一块老HDD盘延迟飙升 |
| 02:40 | 隔离慢OSD、限制恢复带宽 | 慢请求逐渐消退 |
| 03:30 | AMF池满配,业务完全恢复 | 事故结束,历时约3小时45分 |
这起故障最典型的特征,不是它有多复杂,而是每一层都在撒谎:网元层报“AMF重启”,看起来是软件问题;值班的第一反应是回滚版本——这是传统NFV时代养成的肌肉记忆。但版本回滚动了一轮pod调度,反而加剧了恢复风暴。真正的病灶在三层之下:一块服役四年的HDD盘,在当晚的备份窗口叠加数据恢复流量后,延迟飙升,拖垮了跑在其上持久卷里的AMF实例。
传统核心网运维,故障树是“网元-单板-链路”三级;云化之后,变成五层。任何一层的故障,都会向上“翻译”成网元层的语言报出来,这就是假病因的来源。
flowchart TD
A["业务层<br/>用户掉线附着慢"] --> B["网元层<br/>AMF重启N2闪断"]
B --> C["K8s平台层<br/>Pod驱逐节点NotReady"]
C --> D["存储层<br/>Ceph慢OSD慢请求"]
C --> E["硬件层<br/>HDD老化网络闪断"]
D --> F["真凶<br/>一块慢盘拖垮全池"]
E --> F
五层的典型现象与定位手段,整理成一张对照表:
| 层级 | 典型现象 | 常见根因 | 第一定位手段 |
|---|---|---|---|
| 业务层 | 掉线、注册时延大 | 上层传导 | 拨测+话单比对 |
| 网元层 | AMF重启、N2闪断 | pod被驱逐/资源不足 | 网元日志+K8s事件 |
| 平台层 | pod漂移、节点NotReady | 心跳丢失、资源压力 | kubectl get nodes/events |
| 存储层 | 卷IO延迟、慢请求 | 慢盘、恢复风暴 | ceph health detail |
| 硬件层 | 盘卡异常、链路误码 | 硬件老化 | 供应商诊断工具 |
很多省公司的现状是:无线专业、核心网专业、IT云资源池专业分属三个部门,告警系统各管一段。网元告警一响,核心网值班先跳起来,而底层存储的慢请求提示根本没接到核心网的告警清单里。这起故障里,23:41的Ceph慢请求如果当时就能联动到核心网值班,后头两个小时基本可以省掉。
这起故障里有一个当时所有人都没想通的细节:worker-07在23:47就出了问题,为什么AMF实例直到快00:00才开始大规模漂移重建,而业务恢复又拖到了凌晨三点半?
答案在Kubernetes的节点故障处理机制里,官方文档写得清清楚楚,但大多数通信运维从没读过:
node-monitor-grace-period(默认40秒),就把节点标成NotReady。这四条默认值拼起来,就是一个运维必须背下来的结论:一个节点猝死,它上面的网元pod要等40秒+5分钟才会“搬家”,搬完家还要重连SCTP、重建N2、恢复服务注册。对电信业务来说,5G核心网的AMF哪怕抖一分钟,全省在移动性管理中的用户都可能被波及;而K8s的默认参数是为互联网业务设计的,对它来说5分钟的收敛不算事。
还有一条更反直觉的:很多团队给AMF配了PodDisruptionBudget(PDB),以为就有了“驱逐保护”。但官方文档明确写着——PDB只保护自愿中断(比如kubectl drain这种计划内维护),对节点宕机这种非自愿中断完全不设防。节点一死,pod该驱逐还是驱逐,PDB拦不住。把PDB当成节点故障保险,是云化核心网运维里流传最广的误解之一。
顺带把PDB的正确用法说透:它的字段只有两个,minAvailable(驱逐后至少保住几个pod)和maxUnavailable(最多允许挂几个),百分比按向上取整。官方给的典型场景恰恰是ZooKeeper、etcd这类有状态应用——保住仲裁数即可。映射到核心网:AMF池3副本配minAvailable: 2,保证计划内维护时至少两副本在线;但别指望它管节点猝死。
网元副本数做3、跨机架反亲和、PDB配齐——这些团队都做了,为什么还是瘫了三个多小时?因为最后一公里倒在存储上。
虚拟化核心网的有状态数据(AMF上下文备份、UDM签约缓存、日志卷)大多落在Ceph这类分布式存储的RBD卷上。Ceph对慢盘有一套健康告警机制:当OSD的请求处理时间明显偏慢时,集群健康状态会打出slow ops类的提示(用ceph health detail能看到具体哪些OSD拖了后腿)。问题在于,慢请求是“温馨提示”不是“红色警报”,在23:41的备份窗口里,它淹没在几千条日常告警里没人看见。
慢盘对有状态NF的杀伤链条是这样的:
flowchart TD
A["HDD老化IO延迟飙升"] --> B["RBD卷写延迟变大"]
B --> C["AMF写日志与状态超时"]
C --> D["实例OOM重启"]
D --> E["pod漂移重建<br/>全池恢复流量涌入"]
E --> F["Ceph雪上加霜<br/>其他卷跟着变慢"]
F --> G["更多实例抖动<br/>全池降容"]
注意第5、6步:pod漂移本身会制造存储压力。三个AMF实例在几分钟内先后在其他节点重建,重建要读旧卷、写新状态、灌日志,恢复流量瞬间把本就吃紧的Ceph池打满,于是“一个慢盘”升级成“全池变慢”。这就是云化故障和传统故障最大的不同——传统设备故障是线性的,坏一块板坏一个网元;云化故障是会自我放大的,恢复动作本身可能成为第二次故障的引信。
另一个隐形地雷是“同池不同命”:信令面的卷和大吞吐的日志卷、备份卷共用一个Ceph池,没有QoS隔离。日志卷吃IO,信令卷就得挨饿。硬盘不区分你的业务优先级,谁重谁先到。
这起故障走完弯路之后,团队把排障过程沉淀成一个四步法,后来在另一次类似故障里十分钟定位。核心思想一句话:云化核心网排障,从下往上查,而不是从上往下猜。
flowchart TD
A["网元批量异常"] --> B["第一步<br/>看K8s事件流"]
B --> C{"有Pod驱逐<br/>或节点NotReady?"}
C -->|有| D["查节点硬件与心跳"]
C -->|没有| E["查网元自身日志"]
D --> F["第二步<br/>查存储健康"]
F --> G{"有慢请求<br/>或OSD异常?"}
G -->|有| H["隔离慢盘限恢复带宽"]
G -->|没有| I["查网络与宿主机"]
E --> I
H --> J["第三步<br/>观察恢复流量"]
J --> K["第四步<br/>确认业务回满"]
四步各自的关键动作:
kubectl get events --sort-by=.lastTimestamp按时间拉通看,pod重启、驱逐、调度失败的原始记录都在这里。网元日志说“我自己重启了”,事件流会告诉你“是谁把你搬走的”。这次的误判,就是只看了网元日志没看事件流。ceph health detail看有没有慢请求提示,ceph osd perf看各OSD的apply/commit延迟是否分化——健康池里各盘延迟应在一个量级,一块盘比同伴慢一个数量级,就是它。事故之后,团队落了七条整改,按“事前-事中-事后”整理成表,供云化核心网的同行直接对照自查:
| 阶段 | 措施 | 要点 |
|---|---|---|
| 事前 | 信令卷与日志卷分池 | Ceph按业务划池,信令面独享或设QoS上限 |
| 事前 | 存储池换NVMe或混闪 | 信令面卷告别纯HDD机械盘 |
| 事前 | Ceph慢请求告警接入核心网告警系统 | 底层“温馨提示”必须上浮到值班视野 |
| 事前 | PDB按仲裁数配置 | 计划内维护保底,但明确它防不了宕机 |
| 事中 | 驱逐重建限并发 | 用K8s的驱逐限速与滚动策略,禁止一拥而上 |
| 事中 | 版本回滚前先看平台层 | 新增“回滚前置检查”:事件流+存储健康 |
| 事后 | 三层告警关联降噪 | 基础设施-平台-网元告警做时间窗关联,根因优先上报 |
其中投入产出比最高的两条:信令面存储换NVMe(一次改造,消灭最大单点诱因)和慢请求告警上浮(零成本,把发现时间从两小时压到两分钟)。标准允许多种实现,各厂家云化方案的平台组件形态有差异,具体参数以各厂家官方文档为准,但上面这套分层思想是通用的。
第一,云化没有消灭故障,只是把故障翻译成了另一门语言。 老一代运维看得懂单板灯、信令码,新一代必须同时看得懂K8s事件流和Ceph健康报告。这门新语言的词汇量不大——节点心跳40秒、驱逐5分钟、PDB只管自愿中断、慢请求要盯OSD延迟分化——但每个词都值得背下来。
第二,“副本数够”不等于“高可用够”。 三副本的AMF,可以同时踩在同一块慢盘撑起的同一个Ceph池上。高可用不是数pod,是数故障域:存储池算一个域,机架算一个域,供电算一个域。域没分开,副本就是同一枚硬币的三个面。
第三,恢复动作本身要当故障对待。 这次事故真正拉长的两个小时,一半是回滚误判,一半是不受控的恢复风暴。以后深夜处理云化故障,我的第一问永远是:“我们现在做的这个动作,会不会成为下一个故障?”在传统网元时代这是多虑,在云上这是必修课。
5G-A时代核心网在继续向云原生深处走,将来还有边缘UPF的分布式云节点要运维。地基的故障只会更多,不会更少——趁下一次深夜告警响起之前,把K8s的默认参数背熟,把存储池的分域画清楚,才是真功夫。
ceph health detail/ceph osd perf等命令出处本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
