Ceph RBD 块存储:从创建到 Kubernetes 集成

RBD(RADOS Block Device)是 Ceph 提供的块存储接口,支持精简配置、快照、克隆、增量备份等高级功能。它是 OpenStack Cinder/Nova、Kubernetes PV 的首选后端存储。

本文将详细介绍 RBD 的完整使用流程,包括创建、映射、快照、克隆以及与 Kubernetes 的集成。


一、RBD 基础概念

1.1 什么是 RBD

RBD 将 Ceph 对象存储虚拟化为块设备,提供:

  • 精简配置:按需分配空间,提高利用率
  • 快照:时间点数据快照,支持回滚
  • 克隆:基于快照创建可写副本
  • 增量备份:只备份变化的数据
  • 动态调整大小:在线扩容/缩容

1.2 核心概念

概念 说明 示例
Pool 存储池,RBD 镜像的容器 rbd_pool
Image RBD 镜像,即块设备 vm-disk-001
Snapshot 镜像的时间点快照(只读) @snap1
Clone 基于快照创建的可写副本 vm-disk-001-clone

二、RBD 基本操作

2.1 创建存储池

# 创建存储池(32 个 PG,3 副本)
ceph osd pool create rbd_pool 32 32
ceph osd pool set rbd_pool size 3

# 初始化 RBD 存储池
rbd pool init rbd_pool

# 查看存储池
ceph osd pool ls detail
ceph df

2.2 创建 RBD 镜像

# 创建 10GB 精简配置镜像
rbd create --size 10G rbd_pool/image1

# 创建厚配置镜像(预分配空间)
rbd create --size 10G --data-pool rbd_pool rbd_pool/image2 --thick

# 创建 100GB 镜像,4MB 对象大小
rbd create --size 100G --object-size 4M rbd_pool/large_disk

# 查看镜像列表
rbd ls rbd_pool

# 查看镜像详情
rbd info rbd_pool/image1

2.3 映射到本地

# 映射到本地设备(需要内核模块)
modprobe rbd
rbd map rbd_pool/image1

# 查看映射信息
rbd showmapped

# 输出示例:
# id  pool       namespace  image    snap  device
# 0   rbd_pool   -          image1   -     /dev/rbd0

# 格式化并挂载
mkfs.xfs /dev/rbd0
mount /dev/rbd0 /mnt/data

# 取消映射
umount /mnt/data
rbd unmap /dev/rbd0

2.4 调整镜像大小

# 扩容到 20GB
rbd resize --size 20G rbd_pool/image1

# 扩容后调整文件系统
xfs_growfs /mnt/data

# 缩容到 15GB(先备份!)
rbd resize --size 15G rbd_pool/image1 --allow-shrink

三、快照与克隆

3.1 创建快照

# 创建快照
rbd snap create rbd_pool/image1@snap1

# 查看快照
rbd snap ls rbd_pool/image1

# 创建多个快照
rbd snap create rbd_pool/image1@daily-20250101
rbd snap create rbd_pool/image1@daily-20250102

3.2 回滚快照

# 回滚到快照
rbd snap rollback rbd_pool/image1@snap1

# 注意:回滚会覆盖当前数据,操作前建议备份

3.3 删除快照

# 删除单个快照
rbd snap rm rbd_pool/image1@snap1

# 删除所有快照
rbd snap purge rbd_pool/image1

3.4 克隆镜像

# 基于快照创建克隆
rbd clone rbd_pool/image1@snap1 rbd_pool/image1_clone

# 查看克隆信息
rbd children rbd_pool/image1@snap1

# 克隆是独立的可写镜像
rbd map rbd_pool/image1_clone
mkfs.xfs /dev/rbd1
mount /dev/rbd1 /mnt/clone_data

3.5 快照保护

有克隆的快照需要保护才能删除:

# 保护快照
rbd snap protect rbd_pool/image1@snap1

# 取消保护
rbd snap unprotect rbd_pool/image1@snap1

# 查看保护状态
rbd info rbd_pool/image1

四、镜像备份与迁移

4.1 导出镜像

# 导出为文件
rbd export rbd_pool/image1 /backup/image1.img

# 导出为压缩格式
rbd export rbd_pool/image1 - | gzip > /backup/image1.img.gz

# 导出特定快照
rbd export rbd_pool/image1@snap1 /backup/image1_snap1.img

4.2 导入镜像

# 从文件导入
rbd import /backup/image1.img rbd_pool/image1_restored

# 导入压缩文件
gunzip -c /backup/image1.img.gz | rbd import - rbd_pool/image1_restored

4.3 镜像复制(远程集群)

# 启用镜像复制功能
rbd mirror image enable rbd_pool/image1 snapshot

# 配置远程集群
rbd mirror pool peer bootstrap create --site-name site1 rbd_pool

# 查看复制状态
rbd mirror image status rbd_pool/image1

五、QoS 与性能优化

5.1 配置 IOPS 限制

# 设置读写 IOPS 限制
rbd config set rbd_pool/image1 client_read_iops_limit 1000
rbd config set rbd_pool/image1 client_write_iops_limit 500

# 设置带宽限制(MB/s)
rbd config set rbd_pool/image1 client_read_bps_limit 104857600
rbd config set rbd_pool/image1 client_write_bps_limit 52428800

# 查看配置
rbd config get rbd_pool/image1

5.2 性能优化建议

  • 对象大小:大 IO 场景使用 4MB 或 8MB 对象
  • 条带化:高并发场景启用条带化
  • 缓存:启用客户端缓存
  • SSD 缓存:使用 SSD 作为缓存层
# 创建带条带化的镜像
rbd create --size 100G --stripe-unit 4M --stripe-count 4 rbd_pool/stripped_image

六、Kubernetes 集成

6.1 部署 Ceph CSI

# 下载 Ceph CSI 部署文件
git clone https://github.com/ceph/ceph-csi
cd ceph-csi/deploy/rbd/

# 配置 ConfigMap
kubectl create -f csi-config-map.yaml

# 部署 CSI
kubectl create -f csi-rbdplugin-provisioner.yaml
kubectl create -f csi-rbdplugin.yaml

6.2 创建 StorageClass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ceph-rbd
provisioner: rbd.csi.ceph.com
parameters:
  clusterID: ceph-cluster
  pool: rbd_pool
  imageFormat: "2"
  imageFeatures: layering,fast-diff,object-map,deep-flatten
  csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
  csi.storage.k8s.io/provisioner-secret-namespace: default
  csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
  csi.storage.k8s.io/controller-expand-secret-namespace: default
  csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
  csi.storage.k8s.io/node-stage-secret-namespace: default
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true

6.3 创建 PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rbd-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: ceph-rbd

6.4 在 Pod 中使用

apiVersion: v1
kind: Pod
metadata:
  name: app-with-rbd
spec:
  containers:
  - name: app
    image: nginx
    volumeMounts:
    - mountPath: /data
      name: rbd-storage
  volumes:
  - name: rbd-storage
    persistentVolumeClaim:
      claimName: rbd-pvc

七、监控与故障排查

7.1 监控命令

# 查看 RBD 使用情况
rbd du rbd_pool/image1

# 查看存储池使用
ceph df rbd_pool

# 查看镜像状态
rbd info rbd_pool/image1

# 查看映射状态
rbd showmapped

7.2 常见问题

问题 1:无法映射镜像

# 检查内核模块
lsmod | grep rbd
modprobe rbd

# 检查镜像是否被占用
rbd showmapped | grep image1

# 强制取消映射
rbd unmap -o force /dev/rbd0

问题 2:快照无法删除

# 检查是否有克隆
rbd children rbd_pool/image1@snap1

# 如果有克隆,需要先删除或迁移克隆

问题 3:空间不足

# 查看存储池使用率
ceph df

# 添加 OSD 扩容
ceph orch apply osd --all-available-devices

总结

通过本文,你掌握了 RBD 的完整使用流程:

  • ✅ 创建和管理 RBD 镜像
  • ✅ 快照、克隆、回滚操作
  • ✅ 镜像备份与迁移
  • ✅ QoS 配置与性能优化
  • ✅ Kubernetes CSI 集成

下一步:部署 RGW 对象存储网关、搭建 CephFS 文件系统


🔗 相关链接

下一篇将介绍 Ceph RGW 对象存储:S3 兼容接口实战!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注