下面给你一份 Kubernetes 使用 Ceph RBD + StorageClass 实现动态生成 PV(Dynamic Provisioning) 的完整、可直接使用的配置与说明,非常适合实际部署和排错。


🧩 Kubernetes + Ceph RBD 通过 StorageClass 动态生成 PV

Kubernetes 支持使用 Ceph RBD(RADOS Block Device)进行存储的 动态卷供给(Dynamic Provisioning)
关键组件包括:

  • StorageClass
  • Ceph Secret(K8s 内部保存 Ceph user key)
  • Provisioner(kube-controller-manager 内置支持 RBD)
  • PVC(触发 PV 自动生成)

⚠ 注意:RBD 需要内核支持(大部分 Linux 内核默认支持),且 Node 需要装 ceph-common。


1️⃣ 前提条件(Prerequisites)

确保:

  1. Ceph 集群正常运行,且你能创建 RBD pool,如: ceph osd pool create kube 128
  2. 有一个 Ceph 用户具备对 pool 的读写权限,例如: ceph auth get-or-create client.kube mon 'allow r' osd 'allow rwx pool=kube'
  3. 获取 key: ceph auth get-key client.kube
  4. 所有 Kubernetes Node 安装: apt install ceph-common

2️⃣ 创建 Kubernetes Secret(保存 Ceph 密钥)

apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret
  namespace: default
type: "kubernetes.io/rbd"
data:
  key: <BASE64编码后的Ceph-key>

Base64 编码示例:

echo -n "AQB123xyz..." | base64


3️⃣ 创建 StorageClass(触发动态 PV 生成)

这是最关键的配置。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ceph-rbd-sc
provisioner: kubernetes.io/rbd  # kube-controller-manager 内置 rbd provisioner
parameters:
  monitors: 10.0.0.1:6789,10.0.0.2:6789,10.0.0.3:6789
  adminId: admin
  adminSecretName: ceph-secret
  adminSecretNamespace: default
  pool: kube
  userId: kube
  userSecretName: ceph-secret
  fsType: ext4
  imageFormat: "2"
  imageFeatures: layering
reclaimPolicy: Delete
mountOptions:
  - discard

说明:

参数说明
provisioner=kubernetes.io/rbd使用 k8s 自带 rbd 动态卷供应器
adminId/adminSecretName用于创建 RBD 镜像的 Ceph 管理用户
userId/userSecretNamePod 挂载盘时使用的用户
poolCeph 存储池
monitorsCeph Monitor 列表
fsType格式化文件系统
imageFeatureslayering 提供快照基础能力

4️⃣ 创建 PVC(触发动态创建 PV)

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

📌 PVC 创建后,Kubernetes 会自动进行以下步骤:

  1. 调用 StorageClass 对应的 RBD provisioner
  2. 在 Ceph pool 中创建 RBD image
  3. 自动生成一个 PV 绑定到 PVC
  4. Pod 中即可使用该卷

5️⃣ 在 Pod 中使用 PVC

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


6️⃣ 验证

查看 PVC 状态

kubectl get pvc

预期输出:

NAME       STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
rbd-pvc    Bound    pvc-xxxx-xxxx-xxxx                         10Gi       RWO            ceph-rbd-sc     10s

查看 Ceph 端 RBD 镜像:

rbd -p kube ls -l

会看到自动生成的镜像。


7️⃣ 常见错误 & 解决方案

❌ 1. 节点无法挂载 RBD

报错:

modprobe: FATAL: Module rbd not found

→ 解决:安装 ceph-common,并确保内核支持 rbd:

apt install ceph-common
modprobe rbd


❌ 2. Secret 找不到

failed to get admin secret

→ 检查命名空间一致性:

  • StorageClass 的 adminSecretNamespace
  • Secret 的实际 namespace

❌ 3. 权限不足(Ceph auth 报错)

确保:

ceph auth get client.kube

包含:

mon 'allow r'
osd 'allow rwx pool=kube'


📌 总结

组件作用
Secret保存 Ceph 用户秘钥
StorageClass定义如何创建 RBD 动态卷
PVC向系统申请存储
PVKubernetes 自动生成,无需手动创建

通过 StorageClass,Kubernetes 能自动在 Ceph RBD 中创建镜像,实现企业级块存储方案。