Ceph RBD 对接 K8s:实现 PVC 动态供给方案

一、核心组件与原理
  1. Ceph RBD

    • Ceph 的块存储服务(RADOS Block Device)
    • 提供分布式块设备,支持动态扩容和快照
    • 存储池(Pool)管理物理存储资源
  2. 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


三、关键配置说明
  1. imageFeatures 参数

    • layering:必需特性,支持快照和克隆
    • exclusive-lock:建议启用,防止多节点并发写入
  2. 访问模式选择

    • ReadWriteOnce:单节点读写(RBD 默认)
    • ReadOnlyMany:需启用 rbd-nbd 内核模块
  3. 存储扩容

    kubectl patch pvc ceph-rbd-pvc -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'
    


四、故障排查指南
  1. PVC 处于 Pending 状态

    • 检查 Provisioner Pod 日志:kubectl logs -f [provisioner-pod-name] -c csi-rbdplugin
    • 验证 Ceph 密钥是否正确:kubectl get secret ceph-secret -o yaml
  2. 挂载失败

    • 确认节点已安装 rbd 内核模块:lsmod | grep rbd
    • 检查 kubelet 日志:journalctl -u kubelet | grep rbd
  3. 性能优化

    • 调整 CRUSH 规则:优化数据分布
    • 启用 RBD 缓存:在 StorageClass 添加 mounter: rbd-nbd 参数

注意事项

  • 确保 Ceph 集群与 K8s 节点网络延迟 < 5ms
  • 生产环境建议使用 Ceph 多副本策略(size=3)
  • 定期监控存储池使用率:ceph df

此方案已在 Kubernetes 1.24+ 和 Ceph Quincy (v17) 验证通过,支持动态供给、扩容和快照管理。

更多推荐