游乐游手机版
首页/科技数码/文章详情

运维人的日常之一次 K8s 磁盘故障的惊魂夜

时间:2025-09-05 20:37
迷迷糊糊中拿起手机,眼皮还没完全睁开,就看到满屏的告警,Prometheus那边已经炸了——trade-service的错误率飙到了85%以上。没办法拿人钱财与人消灾,操练起来吧。 事件起因23年3

迷迷糊糊中拿起手机,眼皮还没完全睁开,就看到满屏的告警,Prometheus那边已经炸了——trade-service的错误率飙到了85%以上。没办法拿人钱财与人消灾,操练起来吧。

事件起因

23年3月的某个该死的一天,而且是该死的凌晨两点,值班人员忽然来电话,公司主力产品的某大型在线对战游戏部分玩家在拍卖行交易时,界面一直停在“提交中”,页面卡死,整个流程卡住了。”好!知道了~“,迷迷糊糊中拿起手机,眼皮还没完全睁开,就看到满屏的告警,Prometheus那边已经炸了——trade-service的错误率飙到了85%以上。没办法拿人钱财与人消灾,操练起来吧。

废话少说直接来干货!先声明这个K8s集群的版本是v1.24.8。

排查过程

先从集群角度看看都什么情况!

kubectl get nodes -o wide显示worker-node-7状态为DiskPressure该节点运行着交易服务的核心事务处理的Pod。

执行驱逐检查:

kubectl describe node worker-node-7 | grep -i evicted # 发现12个Pod因磁盘压力被驱逐

Elastic Stack日志分析发现连续错误:[FATAL] Transaction commit failed: Input/output error

再从问题节点上看看什么情况。

SSH登录worker-node-7随手就是一个技能:

df -hT /var/lib/kubelet # 显示使用率100%

嚯!~接下来必须看看是哪个或者哪些大文件导致的?:

ncdu -x /var/lib/docker/overlay2 # 发现某容器日志文件占用52GB

那我删?别忙,别动!老运维的直觉,感觉有埋伏.那我必须再一个技能

sudo smartctl -a /dev/nvme0n1 | grep -e 'Media_Wearout_Indicator' -e 'Reallocated_Sector_Ct'

Reallocated_Sector_Ct 0x0033 086 086 000 Pre-fail Always FAILING_NOW 142

我勒个去.迷糊不?子母雷呀!磁盘有142个坏道。

这时候不能处理奥!这时候就想起了IT运维技术圈的博主老杨对我的谆谆教诲:“不要看到一个毛病就下手,一定要尽量的查,全查明白了,然后再反馈,然后再按照领导的决定去执行”记得前一阵子刚升级了k8s集群版本,咋就这么巧出了问题呢?我再仔细摸一下集群的配置.那边总监已经开始在群里各种哀嚎了.不过一定要稳住,稳住!

我再确认一下集群的配置:

ps aux | grep kubelet | grep -o 'eviction-hard=.*' # 输出'imagefs.available<10%,nodefs.available<5%'第三颗雷被我找到了.查了一下K8s v1.24.8的新特性,默认是禁用SMART的journalctl -u kubelet | grep 'eviction_manager'显示日志轮转失效警告

到这可以做阶段总结了:

硬件老化失效:NVMe SSD出现严重坏道,I/O故障直接影响服务。K8s存储感知缺失:集群未启用本地存储容量隔离特性,无法及时预警磁盘异常。资源限额与日志治理缺陷:Pod未设定存储限额,日志文件无轮转,导致磁盘空间被单一容器异常占用。

行了,该总监上场了,把自己看到的和认为合理的处理办法告诉它,得到了“汪汪“的回复,并且给出了“汪汪”的建议,以及“汪汪”的指导后,开始操作。

一顿反摇拳

干掉worker-node-7节点,但一定要优雅。

标记节点不可调度:

kubectl taint nodes worker-node-7 diskfailure=true:NoSchedule

驱逐Pod:

kubectl drain worker-node-7 --ignore-daemonsets --grace-period=300

临时用badblocks和e2fsck标记坏块,强行让文件系统跳过这些坑bash badblocks -sv /dev/nvme0n1 # 标记坏块 e2fsck -c /dev/nvme0n1 # 强制文件系统跳过坏道。

日志全清空:

truncate -s 0 /var/lib/docker/containers/*/*-json.log

直接用ArgoCD把trade-service重新部署了一遍。

使用ArgoCD触发自动重部署:

argocd app actions run trade-service --kind Rollout --action restart

数据库那边也没敢大意,特地跑了个一致性校验:

kubectl exec trade-db-0 -- pg_checkconsistency -v

等到凌晨四点半,监控大屏上的交易成功率终于回升,玩家投诉也慢慢消停了。第二天直接休了一天!~

复盘

复盘会上没什么好撕的,根因就上面那些!做了下面的几个方向的改进。

写了个磁盘检查脚本(罗列一下大概意思,不喜勿喷)disk_health_monitor.sh:

#!/bin/bash# 设备自动发现(兼容NVMe/SATA)DEVICES=$(lsblk -d -o NAME,TYPE | grep disk | awk '{print "/dev/"$1}')ALERT_FLAG=0for DEV in$DEVICES; do# SMART健康检查(带重试机制)for i in {1..3}; do SMART_REPORT=$(smartctl -H $DEV 2>/dev/null) [ $? -eq 0 ] && break || sleep 5done# 关键参数解析 REALLOC=$(smartctl -A $DEV | grep 'Reallocated_Sector_Ct' | awk '{print $10}') WEAR_LEVEL=$(smartctl -A $DEV | grep 'Wear_Leveling_Count' | awk '{print $4}' | tr -d '%')# 多维度健康评估ifecho$SMART_REPORT | grep -q "FAILED"; then logger "[DISK CRITICAL] $DEV SMART failed!" ALERT_FLAG=1elif [ $REALLOC -gt 50 ]; then logger "[DISK WARNING] $DEV Realloc sectors: $REALLOC" ALERT_FLAG=1elif [ $WEAR_LEVEL -lt 10 ]; then logger "[DISK WARNING] $DEV Wear level: $WEAR_LEVEL%" ALERT_FLAG=1fidone# 联动K8s节点标记if [ $ALERT_FLAG -eq 1 ]; then NODE_NAME=$(hostname) kubectl label nodes $NODE_NAME disk-status=critical --overwrite curl -X POST -H "Content-Type: application/json" -d '{"text":"磁盘健康告警!"}'$WEBHOOK_URLfi

(1) 修改k8s集群配置

启用特性门控(/etc/kubernetes/kubelet.conf):

featureGates: LocalStorageCapacityIsolation:true

部署存储限额策略:

apiVersion:scheduling.k8s.io/v1kind:PriorityClassmetadata: name:high-storagevalue:1000000ephemeral-storage-limit:5Gi # 每个Pod限制5GB临时存储

(2) 日志生态系统重构

部署Loki+Promtail替代Docker原生日志:

helm upgrade --install loki grafana/loki-stack --set promtail.enabled=true

添加日志自动清理CronJob:

apiVersion:batch/v1kind:CronJobspec:schedule:"0 */4 * * *"jobTemplate: spec: containers: -name:log-cleaner image:alpine:3.14 command: ["find", "/var/log/containers", "-size +500M", "-delete"]

最终状态

后续研发通过Redis事务补偿机制自动修复2,317笔中断交易。叉会腰,这次可给我牛批坏了!

来源:https://www.51cto.com/article/819659.html
上一篇LVM 全攻略:一文掌握逻辑卷的增删改查(含生产实操) 下一篇一次“测试”引发的惨案:dd 命令写错目标,系统彻底崩盘!
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
理想新车布局预测:L9L与i9上半年发布
科技数码 · 2026-07-04

理想新车布局预测:L9L与i9上半年发布

1月23日消息,综合权威公开信息与行业趋势研判,理想汽车2026年度新车布局规划正式曝光。此番产品线布局,不仅持续深耕SUV市场,同时加速补齐全场景覆盖的拼图。 理想L9旗舰SUV 在增程动力领域,理想L系列将迎来一位新成员——L9L,预计2026年上半年正式上市,预估售价区间为45万至55万元。与

三星消息应用7月停用 部分旧设备可继续使用
科技数码 · 2026-07-04

三星消息应用7月停用 部分旧设备可继续使用

6月29日,多家海外媒体援引三星官方消息证实,三星消息(Samsung Messages)应用将于2026年7月正式终止服务。随着这个截止日期越来越近,依然在使用该应用的Galaxy用户需要尽快迁移到新的默认信息工具。其实过去两年里,三星一直在悄悄引导用户转向谷歌信息(Google Messages

吉利发布2030战略:年销650万辆全面迈向全球前五
科技数码 · 2026-07-04

吉利发布2030战略:年销650万辆全面迈向全球前五

1月22日,吉利控股集团在北京召开战略解析大会,正式发布“一个吉利,全面领先”的2030战略蓝图。战略目标清晰明确:到2030年,全球总销量(含乘用车与商用车)突破650万辆,稳居全球车企前五。其中,新能源车型占比预计达到75%左右,海外销量占比超过三分之一。尤为关键的是,依托全新全球化架构,单车型

OPPO Find X9系列旗舰手机累计销量突破250万部Ultra版超12万部
科技数码 · 2026-07-04

OPPO Find X9系列旗舰手机累计销量突破250万部Ultra版超12万部

OPPO Find X9 Ultra 旗舰机型 回顾产品发布背景:Find X9系列于2025年10月正式登场,作为OPPO年度旗舰产品线,涵盖标准版、Pro版与Ultra版三大版本。该系列的核心竞争力十分明确——影像系统与综合性能的双重显著提升。上市以来,凭借芯片算力、屏幕显示素质、续航表现以及影

IntelliJ IDEA 2025.3.2 版本正式发布
科技数码 · 2026-07-04

IntelliJ IDEA 2025.3.2 版本正式发布

IntelliJ IDEA 2025 3 2 版本现已正式发布。除了常规的漏洞修复与功能完善,本次更新有几个修复点值得格外关注——特别是如果你经常使用终端工具执行命令,或者正在采用远程开发工作流。终端工具窗口的闪烁问题终于得到彻底解决。此前在调用支持同步输出的命令行工具(例如 Claude Code