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

· 浏览次数 : 4

小编点评

2024年6月17日,运维团队在监控大屏上发现零星的红点,表示部分Sealos可用区的服务器突然“失联”。经过分析,故障表现为间歇性且随机,且受影响的服务器资源充足,各项指标正常。为应对这一突发状况,团队立即启动应急预案,尝试从系统日志中寻找线索。 首先,团队使用dmesg命令查看系统日志,但未发现异常。随后,他们对比了以往的问题记录,发现本次故障与以往不同,且主要发生在北京和广州节点。在深入排查网络连接、系统负载、进程状态等方面后,团队发现所有指标均显示正常。 关键时刻,小李发现所有受影响节点的内核版本均为5.15.0-91-generic。这一发现让团队意识到问题可能隐藏在该特定内核版本中。经过与云服务提供商技术支持团队的合作,团队在串口日志中发现了一段特殊的堆栈信息,证实了系统触发了一个内核bug,导致了严重的内核恐慌。 为解决这一问题,团队决定升级内核到已修复该bug的最新版本。然而,在升级内核后的恢复过程中,Cilium网络方案开始频繁重启,并出现了一个错误:Cilium的小插曲。经过排查,团队发现问题出在名为“kube-ipvs0”的网络接口上,这是由于在迁移过程中遗留的网络接口导致的。 最终,团队删除了多余的“kube-ipvs0”网络接口,Cilium恢复正常运行,服务也随之重新上线。这次故障给团队上了一堂重要课程:要时刻保持警惕,关注每一个细节,避免因遗留网络设备导致系统稳定性问题。

正文

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 终于恢复了正常,我们的服务也重新上线了。

总结

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

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

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

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

2024年6月17日,我们的运维团队突然收到了一连串的告警。监控大屏上,代表着不同 Sealos 可用区的绿点中,零星地闪烁起了一两个红点。 “奇怪,怎么有几台服务器突然 hang 住了?” 值班的小辉皱起了眉头。 这次故障的诡异之处在于它的随机性。并非所有节点都受到影响,而是在不同可用区中,时不时

WIndow Server 2019 服务器 MinIO下载并IIS配置反向代理

1、官网下载并配置 下载MinIO Serve地址(不需要安装,放在目录就行) https://dl.min.io/server/minio/release/windows-amd64/minio.exe 设置账号和密码(cmd) setx MINIO_ROOT_USER admin setx MI

[转帖]神秘的backlog参数与TCP连接队列

https://www.cnblogs.com/codelogs/p/16060820.html 简介# 这要从一次压测项目说起,那是我们公司的系统与另几家同行公司的系统做性能比拼,性能数据会直接影响项目中标,因此压力非常大。 当时甲方给大家提供了17台服务器供系统部署,并使用LoadRunner对

NetMvc通过亚马逊方式服务器端和客户端上传MinIO顺利解决

前言: 1、由于项目是.NET Framework 4.7 MVC LayUI,所以需要找一个资源站点存放项目中静态资源文件; 2、需要支持服务端和客户端都支持上传文件方式; 3、调用简单,涉及库越少越好。 结果: 调用 AWSSDK.S3 和 AWSSDK.Core 实现文件上传到 MinIO ;

揭开华为云CodeArts TestPlan启发式测试设计神秘面纱!

摘要:质量是产品的生死线。 本文分享自华为云社区《揭开华为云CodeArts TestPlan启发式测试设计神秘面纱!》,作者:华为云PaaS服务小智 。 2019年12月20日,是美国波音公司新一代载人飞船Starliner“星际客机”,执行第一次飞行测试任务的重要日。按计划飞船在本次无人试飞中将

测试人必会 K8S 操作之 Dashboard

在云计算和微服务架构的时代,Kubernetes (K8S) 已成为管理容器化应用的标准。然而,对于许多新手来说,K8S 的操作和管理常常显得复杂而神秘。特别是,当你第一次接触 K8S Dashboard 时,你是否也感到有些无所适从? K8S Dashboard 是 Kubernetes 提供的一

手把手带你使用JWT实现单点登录

JWT(英文全名:JSON Web Token)是目前最流行的跨域身份验证解决方案之一,今天我们一起来揭开它神秘的面纱! 一、故事起源 说起 JWT,我们先来谈一谈基于传统session认证的方案以及瓶颈。 传统session交互流程,如下图: 当浏览器向服务器发送登录请求时,验证通过之后,会将用户

[转帖]方神: 银河麒麟V10SP1桥接配置网卡总结

简介 公司计划再XC服务器上做业务软件的兼容测试,为了满足需要,想利用操作系统自带的KVM虚拟化做些虚拟机。再配置过程中发现虚拟机无法与宿主机通信,无法访问外网。以下对该问题做些简要的故障分析记录。 环境说明 服务器: 飞腾S2500*2 128Core 1T内存 操作系统: #版本 Kylin L

《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(8)-Charles如何进行断点调试

1.简介 Charles和Fiddler一样也有个强大的功能,可以修改发送到服务器的数据包,但是修改前需要拦截,即设置断点。设置断点后,开始拦截接下来所有网页,直到取消断点。这个功能可以在数据包发送之前,修改请求参数;在收到应答包,在js解析和浏览器渲染之前,修改返回结果。有了这个功能,开发者就可以

【ASeeker】Android 源码捞针,服务接口扫描神器

ASeeker 是一个 Android 源码应用系统服务接口扫描工具。是我们在做虚拟化分身产品『 空壳 』过程中的内部开发工具,目的是为了提升 Android 系统各版本适配效率。