AKS节点内核netfs模块空指针解引用问题分析与解决方案
AKS Azure Kubernetes Service 项目地址: https://gitcode.com/gh_mirrors/ak/AKS
问题背景
在Azure Kubernetes Service(AKS)环境中,使用Ubuntu 22.04节点镜像(AKSUbuntu-2204gen2containerd)的用户报告了一个严重的内核级问题。当节点上加载了cephfs内核模块(通常由rook-ceph等存储方案使用)时,系统在高磁盘读取负载下会出现内核空指针解引用错误,导致节点崩溃和约5-10分钟的服务中断。
技术分析
问题现象
系统日志中会出现如下关键错误信息:
BUG: kernel NULL pointer dereference, address: 0000000000000402
#PF: kernel read access in kernel mode
#PF: error_code(0x0000) - not-present page
PGD 0 P4D 0
Oops: 0000 [#1] SMP NOPTI
CPU: 4 PID: 2688731 Comm: kworker/4:2 Not tainted 5.15.0-1075-azure #84-Ubuntu
Hardware name: Microsoft Corporation Virtual Machine/Virtual Machine, BIOS Hyper-V UEFI Release v4.1 08/23/2024
Workqueue: ceph-msgr ceph_con_workfn [libceph]
RIP: 0010:netfs_rreq_unlock+0xf7/0x3c0 [netfs]
根本原因
该问题源于Linux内核5.15.0-1075-azure版本中netfs模块的一个缺陷。在netfs_rreq_unlock函数的执行过程中,当处理XA_RETRY_ENTRY返回值时,代码未能正确检查xarray迭代器返回的特殊值,导致内核尝试解引用非法地址0x402。
具体来说,在fs/netfs/read_helper.c文件的第406行附近,xas_find()函数可能返回XA_RETRY_ENTRY这个特殊值,表示需要重试迭代。但原始代码没有正确处理这种情况,直接将其当作普通页面指针使用,从而引发空指针解引用。
影响范围
该问题影响以下环境组合:
- AKS节点使用Ubuntu 22.04镜像
- 内核版本为5.15.0-1075-azure
- 系统加载了cephfs内核模块
- 节点执行大量磁盘读取操作(可能触发条件)
受影响的镜像版本包括但不限于:
- AKSUbuntu-2204gen2containerd-202410.09.0
- AKSUbuntu-2204gen2containerd-202412.10.0
解决方案
临时缓解措施
对于无法立即升级的用户,可以考虑以下临时方案:
- 避免在受影响节点上使用基于ceph的存储方案
- 监控节点负载,避免高并发读取操作
- 设置适当的Pod资源限制,防止单个Pod占用过多IO资源
永久解决方案
Canonical已在后续内核版本中修复此问题,具体方案是:
- 升级到Azure Linux内核版本5.15.0-1083或更高
- 使用AKS节点镜像版本202503.21.0或更新版本
该修复的核心是正确实现了xarray重试机制,在netfs_rreq_unlock函数中添加了对XA_RETRY_ENTRY值的检查和处理逻辑。
技术细节
修复原理
修复后的代码在xarray迭代过程中会检查XA_RETRY_ENTRY返回值,并在需要时执行重试操作。这遵循了Linux内核xarray数据结构的设计规范,确保在并发修改情况下迭代器的正确性。
相关内核机制
- netfs模块:Linux内核中的网络文件系统辅助模块,为分布式文件系统(如cephfs)提供通用支持
- xarray数据结构:内核中的高级数组/映射结构,支持并发访问和高效存储
- XA_RETRY_ENTRY:xarray迭代过程中的特殊标记值,表示需要重试当前迭代
最佳实践
- 定期更新AKS节点到最新支持的镜像版本
- 在生产环境部署前,在测试环境验证存储方案与内核版本的兼容性
- 监控系统日志,及时发现类似的内核级错误
- 对于关键业务,考虑使用多副本部署提高可用性
总结
该问题展示了内核模块与存储子系统交互时可能出现的边界条件问题。通过及时更新到修复版本,用户可以避免因此类内核缺陷导致的服务中断。Azure团队已将该修复纳入标准镜像更新流程,建议所有受影响用户尽快安排升级。
AKS Azure Kubernetes Service 项目地址: https://gitcode.com/gh_mirrors/ak/AKS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考