服务器神秘挂起:一场惊心动魄的内核探案

news2024/11/16 5:17:51

2024年6月17日,我们的运维团队突然收到了一连串的告警。监控大屏上,代表着不同 Sealos 可用区的绿点中,零星地闪烁起了一两个红点。

“奇怪,怎么有几台服务器突然 hang 住了?” 值班的小辉皱起了眉头。

这次故障的诡异之处在于它的随机性。并非所有节点都受到影响,而是在不同可用区中,时不时地有个别服务器突然 “失联”。更令人不解的是,这些突然 hang 住的服务器资源都很充足,CPU、内存、磁盘 IO 等各项指标都处于健康水平。

“正常情况下它们不是都会自愈么?” 小谢问道。

“不会,我们已经观察了10分钟,还是没有恢复正常。” 小杨摇摇头,“这不太正常。”

常规手段失效,真凶难寻

面对这种间歇性但严重的故障,我们立即启动了应急预案。首先,我们祭出了我们的 “传家宝”——dmesg 命令,希望能从系统日志中找到一些蛛丝马迹。

然而,这次 dmesg 没有给我们任何有价值的信息。日志中看不到任何异常,服务器看起来完全正常,太诡异了。我们对比了之前遇到的所有已知问题,发现这次的情况与以往都不同,问题主要发生在北京和广州节点,但发生的概率较低,这更增加了排查的难度。

我们继续深入排查,检查了网络连接、系统负载、进程状态等多个方面,但所有指标都显示正常。

“等等,我发现了一个共同点!” 小李突然喊道,“所有出问题的节点,内核版本都是 5.15.0-91-generic!

这个发现让我们眼前一亮,难道真凶就藏在这个特定的内核版本中?

意外的 “内核恐慌”

为了进一步确认猜测,我们联系了云服务提供商的技术支持团队。在他们的协助下,我们终于在串口日志中发现了关键线索。

就在系统 hang 住之前,日志中打印了一段特殊的堆栈信息:

这段堆栈信息清楚地显示,系统触发了一个内核 bug,导致了严重的内核恐慌。正常情况下,当发生内核 panic 时,系统应该会崩溃并进入 kdump 流程,将 Vmcore 写入磁盘,然后重新启动。但是,我们的系统却陷入了持续的 hang 状态,这显然不太对劲。

进一步分析 kdump 的日志,我们发现了问题的真相:

原来,kdump 在启动第二内核时出现了异常。我们怀疑,这可能是由于 crashkernel 配置的内存不足,导致第二内核启动失败,系统最终陷入了 hang 状态。

好家伙,这不就像是消防车在赶往火灾现场的路上自己也出了故障。。。

内核升级大法

既然找到了问题的根源,接下来就是对症下药的时候了。我们的解决方案很直接——升级内核到已经修复了这个 bug 的最新版本:

apt install linux-image-5.15.0-112-generic

然而,事情并没有像我们预想的那样一帆风顺。在升级内核后的恢复过程中,我们又遇到了一个新的挑战——Cilium (我们使用的网络方案) 开始频繁重启,并报出了这样的错误:

Cilium 的小插曲

仔细查看 Cilium 的错误日志,我们发现问题出在一个叫做 “kube-ipvs0” 的网络接口上。这个 “kube-ipvs0” 设备其实是 Kubernetes 的 kube-proxy 组件在使用 IPVS 模式时创建的。

等等,我们的集群不是已经不再使用 kube-proxy 了吗?

经过一番排查后发现,原来在我们迁移到 Cilium 网络方案的过程中,忘记了清理这个遗留的网络接口。就是这个小小的疏忽导致了 Cilium 无法正确获取节点上的 IPv4 地址,进而引发了我们遇到的错误。

Cilium 源码中的相关片段:

// https://github.com/cilium/cilium/blob/8c7e442ccd48b9011a10f34a128ec98751d9a80e/pkg/datapath/loader/loader.go#L183
if option.Config.EnableIPv4Masquerade && bpfMasqIPv4Addrs != nil {
    ipv4 := bpfMasqIPv4Addrs[ifName] // nil checking is missing here
    opts["IPV4_MASQUERADE"] = uint64(byteorder.NetIPv4ToHost32(ipv4)) // ipv4 is nil
}

这段代码中,Cilium 尝试获取网络设备的 IPv4 地址,但是由于 “kube-ipvs0” 设备并不包含有效的 IP 地址,导致了空指针异常,最终就会导致 ip 进行类型转换时溢出:

func NetIPv4ToHost32(ip net.IP) uint32 {
        ipv4 := ip.To4()
        _ = ipv4[3] // Assert length of ipv4.
        return Native.Uint32(ipv4)
}

参考 issue:https://github.com/cilium/cilium/issues/30746

解决方法很简单:删除这个多余的网络接口。

ip link delete kube-ipvs0

完成这个操作后,Cilium 终于恢复了正常,我们的服务也重新上线了。

总结

这次的故障给我们上了很重要的一课:要保持警惕,不放过任何细节。

即使是一个看似无害的遗留网络设备,也可能成为系统稳定性的隐患。在进行重大架构变更时,我们需要更加细致地清理旧的组件和配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1860877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

能运行的Bug就别动它了...程序员老梗图什么时候看见才能不笑啊

说到程序员,那可是外界眼中自带光环的生物——掌控代码的大神,改变世界的王者! 然而,现实却是“甲方虐我千百遍,我待bug如初恋”。活多钱少压力大,程序员们只能踏上了自黑、自嘲的不归路,毕竟&…

记录一个前端axios传参格式的问题

今天改造一个其他系统的页面,直接把原来系统的接口拿过来复用,发现怎么传参都报400,地址参数都一样,怎么就报错了呢,报错原因大概是后台无法解析出参数(后台属于其他平台,无法测试)。…

Spring Boot配置Springdoc

刚刚开通了一个公众号,会分享一些技术博客和自己觉得比较好的项目,同时会更新一些自己使用的工具和图书资料,后面会整理一些面试资料进行分享,觉得有兴趣的可以关注一下。 问题描述 之前文章有提到Spring Boot切换到Springdoc&a…

CAD随机球体插件 专业版

插件介绍 CAD随机球体插件专业版可用于在AutoCAD内建立随机分布的球体三维模型。 模型说明 模型尺寸中长度、宽度、高度:设定随机球体生成的长方体区域,及生成的长方体部件尺寸。 建模控制中球体内包参数为限定球体是否会穿过模型的边界。当球体内…

标准立项 | 湖库沉积物微生物多样性监测规程

饮用水水源地保护是饮用水安全保障中最重要的一个环节,其水质状况直接关系到供水区人民群众的身体健康。我国水资源存在水质差、资源短缺、资源时间空间分布不合理等问题。而近些年由水源地污染引发的饮用水安全事件,给居民的生产生活造成一定程度的影响…

【网络安全的神秘世界】解决dvwa靶场报错:Illegal mix of collations for operation ‘UNION‘

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 🚩问题描述 当尝试执行如下 SQL 语句时: 1 union select schema_name,1 from information_schema.s…

[数据集][目标检测]鸡蛋缺陷检测数据集VOC+YOLO格式2918张2类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2918 标注数量(xml文件个数):2918 标注数量(txt文件个数):2918 标注…

【Linux】使用chrony同步时间

chrony介绍 chrony 是一个开源的网络时间协议 (NTP) 客户端和服务器,旨在保持计算机系统的时间精确同步。它是Linux和其他类Unix系统中广泛使用的工具,特别是在需要高精度时间同步的环境中。chrony 的设计考虑了现代网络的挑战,如不稳定的连…

性能评测系列(PT-010):Spring Boot + MySQL,高并发insert

一、测试概述 测试场景 场景编号: PT-010场景描述: Java应用,MySQL单表写测试目的:指定规格、配置、环境下,Java应用数据库简单写场景负载能力评估。(不含调优,所测结果未必是最优结果&#x…

ElementUI框架搭建及组件使用+登录界面精美模版分享

目录 如何在项目中使用ElementUI组件? ① 通过npm 安装 ② 完整引入 Element ③ 导入组件测试 登录界面搭建 注意事项 ▐ 前言: 本篇文章将详解基于Vue-cli脚手架搭建的项目如何使用ElementUI ?所以在学习本篇文章内容之前建议您先学习…

计算机网络-BGP路由反射器与Cluster_List选路原则

一、优选Cluster_List最短的路由 Cluster_List是BGP路由属性之一,它在路由的AS_Path属性中用来标识路由经过的BGP路由反射器(Route Reflectors)集群列表。 1.1 路由反射器 在大型网络中,为了减少IBGP全互联的需求,可以…

如何自己录制教学视频?零基础也能上手

随着在线教育的蓬勃发展,录制教学视频成为了教师和教育工作者们不可或缺的一项技能。无论是为了远程教学、课程分享还是知识普及,教学视频的录制都变得愈发重要。可是如何自己录制教学视频呢?本文将介绍两种录制教学视频的方法,这…

【Docker】存储数据卷

目录 1、挂载数据卷到容器里 2、查询挂载文件 3、容器与主机之间映射共享卷 4、三个容器之间使用共享卷 5、卷数据的备份与恢复 5.1 备份 5.2 恢复 1、挂载数据卷到容器里 docker run -itd --name test02 -v /data nginx docker exec -it test02 bashls / docker inspe…

2024软件设计师笔记之考点版(一考就过):1-10

软件设计师之一考就过:成绩版 考点1:CPU、指令 真题1:CPU 执行算术运算或逻辑运算时,常将源操作数和结果暂存在(累加器(AC))中。 真题2:在程序的执行过程中,Cache与主存的地址映射是由(硬件自动)完成的。 真题3:计算机执行程序时,内存分为静态数据区、代码区、…

【CMake】Windows下配置CMake

文章目录 前言配置CMake下载CMake设置环境变量测试CMake是否安装成功 总结 前言 CMake是一个开源的跨平台自动化建构系统,它用配置文件控制编译过程的方式和Unix的make相似,但是CMake的配置文件取名为CMakeLists.txt。CMake可以生成标准的构建文件&…

2011-2022年 全国省级-农业绿色全要素生产率数据

农业绿色全要素生产率(Green Total Factor Productivity in Agriculture,简称GTFP-A)是一个重要的指标,它不仅衡量了农业部门的生产效率,还考虑了环境的可持续性与资源的利用效率。GTFP-A反映了农业生产过程中各种投入…

[C++][设计模式][桥模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受1.代码一2.代码二 1.动机 由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度, 乃至多个纬度的变化如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多…

数据可视化如何为智慧农业带来变革

数据可视化如何为智慧农业保驾护航?随着农业现代化的深入推进,智慧农业应运而生,通过集成物联网、大数据、人工智能等先进技术,实现农业生产的数字化、智能化和高效化。而在这一过程中,数据可视化技术作为重要的工具&a…

新品发布 | TC1018Pro和TC1034Pro正式发布,功能升级,多设备时间同步

新品发布/New products release 同星智能最新推出TC1018Pro和TC1034Pro两款产品,新版本在保留原来基本功能的基础上做了升级,主要新增IO功能、错误帧ID检测、多设备间时间同步等功能。 接下来,让我们看看这两款产品带来了哪些具体功能升级&a…

计算机网络——数据链路层(数据链路层概述及基本问题)

链路、数据链路和帧的概念 数据链路层在物理层提供服务的基础上向网络层提供服务,其主要作用是加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造为逻辑上无差错的数据链路,使之对网络层表现为一条无差错的链路。 链路(…