【Rook / CSI】挂载与 features:NodeStage、krbd 错位与 read affinity

💡 原文中文,约8200字,阅读约需20分钟。
📝

内容提要

本文探讨Rook/CSI中RBD卷挂载的复杂问题。核心要点:PVC绑定后挂载成功不等于数据安全,因image features与节点内核krbd能力不匹配、read affinity在Tentacle v20.2.0存在损坏风险、节点丢失后未正确fencing会导致双挂。排障时应先检查挂载栈、features、内核、锁和read affinity,而非直接怀疑存储后端。

🔎

延伸解读

挂载成功不等于数据安全

PVC 绑定、Pod 调度成功、NodePublish 返回 OK,这些只代表挂载流程走完,不代表数据安全。RBD 卷的 image features 与节点内核 krbd 能力不匹配时,可能 map 成功但行为异常,如校验和错误、偶发卡顿。排障时不能只看挂载事件,要检查 features、内核版本和插件日志。

read affinity 的雷区

read affinity 是性能优化,默认关闭,需要节点 topology 标签和内核 ≥5.8。在 Tentacle v20.2.0 上启用有已知数据损坏风险,官方建议升级到 v20.2.1+。若已在 v20.2.0 上开启,应立即关闭并重启应用。开启前要确保拓扑标签正确,否则收益不稳定。

节点丢失后的 fencing 关键

节点宕机后,RBD 卷不能自动安全迁移,旧节点若仍持有 map 会话,双挂会损坏数据。必须确认节点不可用后打上 out-of-service taint,并确保旧节点断电,才能安全迁移。过早摘除 taint 会留下陈旧会话,造成严重一致性问题。

排障顺序:先查客户端,再疑后端

遇到卷已挂载但应用异常,不要先怀疑 OSD 或 PG 降级。应按顺序检查:挂载栈设备是否存在、image features 是否与 StorageClass 一致、节点内核与模块是否支持、锁与 blocklist 状态、read affinity 是否刚开启。只有这些干净后,才考虑后端问题。

Q&A

Rook/CSI中RBD卷挂载成功但业务读写异常,可能的原因有哪些?

可能原因包括:image features与节点内核krbd能力不匹配(如object-map、fast-diff等特性半支持)、read affinity在Tentacle v20.2.0存在数据损坏风险、节点丢失后未正确fencing导致双挂。排障时应先检查挂载栈、features、内核、锁和read affinity,而不是直接怀疑存储后端。

Rook/CSI中RBD卷挂载的NodeStageVolume和NodePublishVolume分别做什么?

NodeStageVolume在节点全局staging路径将RBD image map成块设备(默认krbd),必要时格式化或挂载到staging;NodePublishVolume将staging上的设备或文件系统bind-mount进Pod可见路径。

Rook/CSI中krbd和nbd两种mounter有什么区别?

krbd是内核态驱动,默认使用;nbd是用户态路径,需节点具备模块和二进制。StorageClass可设置mounter: rbd-nbd强制使用nbd,或设置tryOtherMounters: "true"在krbd不支持时回退nbd。nbd的运维面(日志、性能)与krbd不同,需单独runbook。

Rook/CSI中image features与krbd能力不匹配会导致什么问题?

当image带有object-map、fast-diff、exclusive-lock等特性,而节点内核半支持时,map可能成功,但exclusive-lock、object-map更新或多客户端边界行为异常,导致校验和错误、偶发卡住、迁移后数据不对。排障时不能只看FailedMount,需检查features和内核支持。

Rook/CSI中read affinity是什么?有什么风险?

read affinity是Rook允许在CephCluster上开启的CSI功能(默认关闭),通过节点topology标签推导CRUSH位置,map时附加krbd选项(如read_from_replica=localize),让读尽量打到更近的OSD副本,是延迟优化。但Tentacle v20.2.0启用read affinity存在已知数据损坏/丢失风险,官方建议升级到v20.2.1+或关闭。

Rook/CSI中节点丢失后如何安全地将RBD卷挂载到其他节点?

节点丢失后,需确认节点不可用后打上node.kubernetes.io/out-of-service=nodeshutdown的taint,若启用network fencing(默认不启用),驱动会从image元数据取客户端地址并blocklist旧会话。在节点完整断电重启循环之前,不得提前去掉taint,否则可能留下陈旧map/会话造成严重一致性问题。恢复后经冷却期,CSI-Addons可自动解除blocklist。

Rook/CSI排障时遇到卷已挂载但应用不对,应该按什么顺序检查?

按以下顺序收窄:1.确认挂载栈(/dev/rbd*或nbd设备、Pod内挂载选项);2.确认features实际值(rbd info与SC声明是否一致);3.确认节点内核与模块(rbd/libceph是否加载、内核版本);4.确认lock/blocklist(是否刚做过节点迁移或fencing);5.确认read affinity(若刚升Tentacle或打开localize读)。只有前四项都干净,才把问题推到PG降级、磁盘延迟或应用逻辑。

Rook/CSI中为什么说挂载成功码不等于数据安全?

挂载成功码只证明NodePublish返回了OK,但features错位、Tentacle+ read affinity雷区、以及未fencing的双挂风险,都会在OK之后伤害数据。因此不能仅凭挂载成功就认为数据安全。

🏷️

标签

➡️

继续阅读