Rook 部署前 8 项前置条件自查:从 4 类典型故障倒推 Kubernetes Ceph 部署条件
【免费下载链接】rookStorage Orchestration for Kubernetes项目地址: https://gitcode.com/gh_mirrors/roo/rook
Rook 是以 Operator 形式在 Kubernetes 上交付 Ceph 存储集群的云原生存储编排器。本文不讲安装步骤,而是从部署之后最容易出现的四类故障场景倒推,逐项列出部署前必须在既有集群上确认好的前置条件:集群版本、节点本地存储设备、lvm2 包、udev 守护进程、内核 rbd 模块、CephFS 内核下限,共 8 项,全部确认后再动手部署。
部署前的第一道门:确认集群版本与节点架构
用 kubectl 核对 Kubernetes 版本是否在 v1.32 到 v1.37 之间
Rook 支持 Kubernetes 版本v1.32 至 v1.37,这个数字在 prerequisites.md 和 quickstart.md 中同时出现。部署前先确认现状:
$ kubectl version --short版本低于 v1.32 或高于 v1.37 时,建议先升级集群,或核对当前 Rook 版本的官方支持矩阵后再执行部署。
用 kubectl get nodes 确认 CPU 架构是 amd64 还是 arm64
Rook 只支持两种 CPU 架构(见 quickstart.md):
amd64 / x86_64arm64
$ kubectl get nodes -o wide只要镜像仓库提供对应架构的镜像,x86 裸金属、云虚拟机、ARM 边缘节点都能部署。

集群层的门过了,Operator 就能部署。开篇提到的四类故障都出在节点与内核层,每一类都对应一项前置检查。
故障一:节点重启后 OSD Pod 起不来
哪些场景下 Ceph OSD 依赖 LVM
CephCluster CR 命中以下任一条件时,OSD 就依赖 LVM(注释示例见 cluster.yaml):
- 启用加密:
encryptedDevice: "true"(该选项默认值为"false"); - 指定了
metadata设备(为 OSD 单独配置 WAL/DB 元数据设备); osdsPerDevice大于 1(同一块设备上创建多个 OSD,需 LVM 管理子卷)。
反过来,OSD 直接建在裸设备或裸分区上、或通过storageClassDeviceSets建在 PVC 上时,不需要 LVM,这个故障不会出现。
安装 lvm2,RancherOS 上额外激活逻辑卷
需要 LVM 时,所有将运行 OSD 的主机都必须安装lvm2。部分 Linux 发行版默认不带这个包,而它缺少时的表现是一颗延时炸弹:Rook 仍能正常创建 OSD,但节点重启后,重启节点上的 OSD Pod 会启动失败。⚠️ 这一步跳过,重启后你会在 Pod 里看到 OSD 卷无法被正确激活。
# CentOS $ sudo yum install -y lvm2 # Ubuntu $ sudo apt-get install -y lvm2RancherOS 自 1.5.0 起支持 LVM,但启动过程中逻辑卷不会被自动激活,需在 cloud-config 的runcmd里手动激活:
runcmd: - [ "vgchange", "-ay" ]LVM 决定了 OSD 能否扛住重启;下一个检查点发生在应用第一次挂载块卷的时刻。
故障二:RBD 卷挂载失败
用 modprobe rbd 验证内核模块是否可加载
Ceph 要求 Linux 内核编译并加载 RBD 模块。多数发行版自带,但并非全部——GKE 的 Container-Optimised OS(COS)就没有 RBD 模块。在节点上验证:
$ modprobe rbd提示 rbd 模块 'not found' 时,三条出路:重新编译内核以包含rbd模块、安装更新的内核、或更换 Linux 发行版。
内核 5.4 及以上时在 StorageClass 中启用更多 RBD 特性
默认的 RBD 配置只启用layering特性,为的是兼容较老的内核。若节点运行 5.4 或更高版本的内核,可在 StorageClass 中启用更多特性,其中fast-diff与object-map对快照/克隆和差异计算的性能提升尤其有用:
imageFeatures: layering,fast-diff,object-map,deep-flatten,exclusive-lock开启前务必确认节点内核版本支持,别只凭文档照抄。
块这边挂载链路通了,共享文件系统那边还有一个内核下限,它不报错,只决定"配额"生不生效。
故障三:CephFS PVC 配额不生效
用 uname -r 确认内核是否达到 4.17
通过 CephFS 创建 RWX 卷时,推荐的最低内核版本是4.17。低于 4.17 时,请求的 PVC 大小不会被强制执行;存储配额只会在更新的内核上生效。这是最容易漏查的一项:集群健康度一切正常,应用却可以无限写超限额。
$ uname -r这一项只看了版本号;第四类故障发生得更早——OSD 还没建出来,盘就已经被排除了。
故障四:OSD 准备阶段静默跳过磁盘
用 lsblk 判断磁盘能不能给 Ceph 用
节点上至少要有 prerequisites.md 列出的下列一种本地存储:
- 裸设备:没有分区、没有格式化文件系统的整块磁盘;
- 裸分区:没有格式化文件系统的磁盘分区;
- LVM 逻辑卷:未格式化文件系统的逻辑卷;
- 存储类(StorageClass)提供的
block模式持久卷。
quickstart.md 的存储清单还额外提到加密设备与多路径设备。设备是否"干净"看FSTYPE字段:
$ lsblk -f NAME FSTYPE vda └─vda1 LVM2_member ├─ubuntu--vg-root ext4 └─ubuntu--vg-swap_1 swap vdbFSTYPE非空就说明设备上有文件系统,OSD 准备逻辑会跳过它,避免误格式化已有数据。上例中vdb可用,vda及其分区均不可用。设备选择时 rbd、nbd、drbd、zram 设备也会被跳过。quickstart.md 对此有一句明确的提醒:永远在虚拟机中测试 Rook,绝不要在可能误用本地设备的主机系统上操作。
确认 udev 守护进程在所有存储节点上运行
另一个静默的元凶是 udev。所有存储节点上必须运行 udev 守护进程——Rook 会把宿主机/run/udev挂载进 OSD Pod,ceph-volume依赖 udev 提供的设备信息做设备识别:
$ systemctl status systemd-udevd大多数发行版默认已运行;没有的话,先安装并启动 udev 再部署。
前四项都是创建前的检查;如果节点是 NixOS,还要多做两处专项配置。
NixOS 专项:内核模块路径与 containerd 限制
把非标准内核模块路径 bind-mount 进 CSI 插件 Pod
NixOS 的内核模块位于非标准路径/run/current-system/kernel-modules/lib/modules/,并符号链接到同样非标准的/nix路径下。容器需要读取这两个位置才能加载所需模块,因此必须把它们作为卷 bind-mount 进 CephFS 与 RBD 插件 Pod。
Helm 安装:在values.yaml中取消注释以下示例配置项——
csi.csiCephFSPluginVolumecsi.csiCephFSPluginVolumeMountcsi.csiRBDPluginVolumecsi.csiRBDPluginVolumeMount
非 Helm(裸 manifest)安装:把同样的值写入 operator.yaml 中定义的rook-ceph-operator-configConfigMap——
CSI_CEPHFS_PLUGIN_VOLUMECSI_CEPHFS_PLUGIN_VOLUME_MOUNTCSI_RBD_PLUGIN_VOLUMECSI_RBD_PLUGIN_VOLUME_MOUNT
移除 containerd 服务配置中的 LimitNOFILE
NixOS 上使用 containerd 时,建议从 containerd 服务配置中移除LimitNOFILE,以避免 ceph 命令执行缓慢、mon 掉出 quorum 等与文件描述符耗尽相关的问题:
systemd.services.containerd.serviceConfig = { LimitNOFILE = lib.mkForce null; };部署前最后一遍自检
8 项检查各对应一类真实故障:K8s 版本不在 v1.32~v1.37 区间或节点架构非 amd64/arm64,集群层前置条件不满足;目标磁盘FSTYPE非空,OSD 准备阶段会直接跳过该盘;启用了加密、metadata 设备或osdsPerDevice > 1却没装 lvm2,节点重启后该节点的 OSD Pod 会启动失败;modprobe rbd报 not found,RBD 卷完全无法挂载;内核低于 4.17,CephFS 的 RWX 卷不会强制执行 PVC 大小与配额。逐项确认完毕,即可按 quickstart.md 部署 Rook Operator 与 Ceph 集群。
【免费下载链接】rookStorage Orchestration for Kubernetes项目地址: https://gitcode.com/gh_mirrors/roo/rook
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考