下面给你一份 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)
确保:
- Ceph 集群正常运行,且你能创建 RBD pool,如:
ceph osd pool create kube 128 - 有一个 Ceph 用户具备对 pool 的读写权限,例如:
ceph auth get-or-create client.kube mon 'allow r' osd 'allow rwx pool=kube' - 获取 key:
ceph auth get-key client.kube - 所有 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/userSecretName | Pod 挂载盘时使用的用户 |
pool | Ceph 存储池 |
monitors | Ceph Monitor 列表 |
fsType | 格式化文件系统 |
imageFeatures | layering 提供快照基础能力 |
4️⃣ 创建 PVC(触发动态创建 PV)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
storageClassName: ceph-rbd-sc
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
📌 PVC 创建后,Kubernetes 会自动进行以下步骤:
- 调用 StorageClass 对应的 RBD provisioner
- 在 Ceph pool 中创建 RBD image
- 自动生成一个 PV 绑定到 PVC
- 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 | 向系统申请存储 |
| PV | Kubernetes 自动生成,无需手动创建 |
通过 StorageClass,Kubernetes 能自动在 Ceph RBD 中创建镜像,实现企业级块存储方案。
发表回复