4. Ceph 块存储(RBD):RBD 原理、PV/PVC 创建、StorageClass 配置与动态供给

4.1 RBD 核心原理与架构

Ceph RBD(RADOS Block Device)是 Ceph 提供的分布式块存储协议,它将块设备映像以条带化方式存储在 RADOS 集群中。RBD 天然支持快照、克隆、动态扩容和 thin provisioning,是 Kubernetes 持久化存储的首选后端之一。

关键特性:
  • 条带化与分布:RBD 映像被切分为固定大小的对象(默认 4MB),通过 CRUSH 算法分布到 OSD 上,实现并行 I/O。
  • 多副本与强一致性:默认三副本写入,保证数据高可用;支持 primary-copy 读写模型,确保线性一致性。
  • 内核态与用户态双路径:可通过 rbd 内核模块挂载(高性能),也可通过 librbd 用户态库访问(灵活)。
RBD 架构与数据流 Kubernetes / 客户端 rbd 内核模块 / librbd RBD 映像(Image)条带化映射 RADOS 对象(默认 4MB)分布到 OSD OSD 集群(三副本 / EC 纠删码) I/O 路径 客户端 → librbd → 映像 → 对象 → OSD

4.2 RBD 与 Kubernetes PV/PVC 集成模型

在 Kubernetes 中使用 RBD 块存储,遵循标准的 PV/PVC 模型。RBD 支持两种供给模式:

供给模式 描述 适用场景
静态供给 管理员预先创建 RBD 映像,再手动创建 PV 与 PVC 绑定 测试环境、需要固定映像名称的场景
动态供给 通过 StorageClass 自动创建 RBD 映像并生成 PV,PVC 按需绑定 生产环境、大规模自动部署
推荐实践:生产环境始终使用动态供给。RBD 动态供给通过 CSI(Container Storage Interface)驱动实现,Rook 已内置 rook-ceph-rbd CSI 插件,无需额外部署。

4.3 创建 StorageClass 实现动态供给

Rook 部署完成后,默认不会创建 RBD StorageClass。需要手动定义以下 YAML 资源:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: rook-ceph-block
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
  clusterID: rook-ceph
  pool: replicapool
  imageFormat: "2"
  imageFeatures: layering
  csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
  csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
  csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner
  csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
  csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
  csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions: []
参数 说明 典型值
provisioner 指定 CSI 驱动名称,Rook 固定为 rook-ceph.rbd.csi.ceph.com rook-ceph.rbd.csi.ceph.com
pool RBD 映像存放的 RADOS 池,需提前创建 replicapool
imageFeatures RBD 映像特性,至少包含 layering 以支持快照 layering
reclaimPolicy PV 回收策略,Delete 表示删除 PVC 时自动删除 RBD 映像 Delete
allowVolumeExpansion 是否允许在线扩容,RBD 支持动态扩容 true

4.4 创建 PVC 并验证动态供给

定义 PVC 引用上述 StorageClass,Kubernetes 将自动完成 RBD 映像创建与 PV 绑定:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rbd-pvc
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Block
  resources:
    requests:
      storage: 10Gi
  storageClassName: rook-ceph-block
关键检查点:
  • volumeMode: Block 表示原始块设备,RBD 原生支持;若使用 Filesystem 模式,CSI 会在块设备上创建文件系统。
  • 创建后使用 kubectl get pvc rbd-pvc 查看状态,Bound 表示供给成功。
  • 在 Ceph 侧验证:rbd ls -p replicapool 可看到自动生成的 pvc-xxxx 映像。
RBD 动态供给流程 1. 创建 PVC 2. CSI 控制器 3. 创建 RBD 映像 4. 绑定 PV rbd create --size 10G rbd map / 格式化 PVC Bound → Pod 使用 /dev/rbdX 整个流程无需人工介入,StorageClass 参数控制映像池、大小、特性

4.5 使用 RBD 块设备的工作负载示例

以下示例展示一个使用 RBD 块设备作为原始块存储的 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: rbd-block-consumer
spec:
  containers:
  - name: block-writer
    image: busybox
    command: ["/bin/sh", "-c", "while true; do dd if=/dev/zero of=/dev/xvda bs=1M count=10; sleep 5; done"]
    volumeDevices:
    - devicePath: /dev/xvda
      name: rbd-block
  volumes:
  - name: rbd-block
    persistentVolumeClaim:
      claimName: rbd-pvc
注意:使用 volumeDevices 而非 volumeMounts,因为块设备是原始设备,不能挂载到文件系统路径。应用需要自行管理文件系统或直接读写块设备。

4.6 性能与运维要点

维度 建议 说明
映像大小 按需分配,支持在线扩容 使用 kubectl edit pvc 修改 spec.resources.requests.storage,CSI 自动扩展 RBD 映像
IO 队列 调整 rbd queue depth 高并发场景建议增大 librbd 队列深度,默认 128
快照与克隆 通过 VolumeSnapshot 实现 需要额外部署 VolumeSnapshot CRD 和 CSI 快照插件
监控 集成 Prometheus Rook 默认暴露 RBD 性能指标,包括 IOPS、延迟、吞吐量
生产建议:对于数据库等延迟敏感型工作负载,建议启用 RBD 的 discard 特性(通过 mountOptions: ["discard"]),使文件系统删除操作能回收底层 RADOS 对象空间,避免存储浪费。