Ceph RBD 对接 K8s:实现 PVC 动态供给,解决 K8s 持久化存储需求
·
Ceph RBD 对接 K8s:实现 PVC 动态供给方案
一、核心组件与原理
-
Ceph RBD
- Ceph 的块存储服务(RADOS Block Device)
- 提供分布式块设备,支持动态扩容和快照
- 存储池(Pool)管理物理存储资源
-
Kubernetes 存储架构
StorageClass:定义存储供给策略PersistentVolumeClaim (PVC):用户存储请求PersistentVolume (PV):自动创建的存储资源- 动态供给流程:
$$ \text{PVC} \xrightarrow{\text{StorageClass}} \text{Provisioner} \xrightarrow{\text{Ceph}} \text{自动创建 PV} $$
二、实现步骤
1. 准备 Ceph 集群
# 创建专用于 K8s 的存储池
ceph osd pool create k8s_pool 128 128
ceph osd pool application enable k8s_pool rbd
2. 创建 Ceph 用户(K8s 专用)
ceph auth add client.k8s mon 'allow r' osd 'allow rwx pool=k8s_pool'
ceph auth get-key client.k8s > ceph-k8s.key # 保存密钥
3. 在 K8s 中创建 Secret
apiVersion: v1
kind: Secret
metadata:
name: ceph-secret
namespace: kube-system
type: "kubernetes.io/rbd"
data:
key: [Base64编码的ceph-k8s.key内容]
4. 部署 RBD Provisioner
使用官方 CSI 驱动(推荐):
kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-provisioner-rbac.yaml
kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml
5. 创建 StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ceph-rbd
provisioner: rbd.csi.ceph.com
parameters:
clusterID: [Ceph集群ID] # 通过`ceph fsid`获取
pool: k8s_pool
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: ceph-secret
csi.storage.k8s.io/provisioner-secret-namespace: kube-system
csi.storage.k8s.io/node-stage-secret-name: ceph-secret
csi.storage.k8s.io/node-stage-secret-namespace: kube-system
reclaimPolicy: Delete
allowVolumeExpansion: true
6. 验证动态供给
创建测试 PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ceph-rbd-pvc
spec:
storageClassName: ceph-rbd
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
挂载到 Pod:
apiVersion: v1
kind: Pod
metadata:
name: nginx-test
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: /data
name: ceph-vol
volumes:
- name: ceph-vol
persistentVolumeClaim:
claimName: ceph-rbd-pvc
三、关键配置说明
-
imageFeatures 参数
layering:必需特性,支持快照和克隆exclusive-lock:建议启用,防止多节点并发写入
-
访问模式选择
ReadWriteOnce:单节点读写(RBD 默认)ReadOnlyMany:需启用rbd-nbd内核模块
-
存储扩容
kubectl patch pvc ceph-rbd-pvc -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'
四、故障排查指南
-
PVC 处于 Pending 状态
- 检查 Provisioner Pod 日志:
kubectl logs -f [provisioner-pod-name] -c csi-rbdplugin - 验证 Ceph 密钥是否正确:
kubectl get secret ceph-secret -o yaml
- 检查 Provisioner Pod 日志:
-
挂载失败
- 确认节点已安装
rbd内核模块:lsmod | grep rbd - 检查 kubelet 日志:
journalctl -u kubelet | grep rbd
- 确认节点已安装
-
性能优化
- 调整 CRUSH 规则:优化数据分布
- 启用 RBD 缓存:在 StorageClass 添加
mounter: rbd-nbd参数
注意事项:
- 确保 Ceph 集群与 K8s 节点网络延迟 < 5ms
- 生产环境建议使用 Ceph 多副本策略(size=3)
- 定期监控存储池使用率:
ceph df
此方案已在 Kubernetes 1.24+ 和 Ceph Quincy (v17) 验证通过,支持动态供给、扩容和快照管理。
更多推荐
所有评论(0)