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用户态库访问(灵活)。
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映像。
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 对象空间,避免存储浪费。