Kubernetes 动态 PV 供应:StorageClass 与 CSI 插件(Ceph/Rook)配置指南

核心概念
  1. 动态 PV 供应
    自动按需创建持久卷,无需手动预置存储资源。

  2. StorageClass
    定义存储的"类别",包含供应器参数和回收策略:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: rook-ceph-block
    provisioner: rook-ceph.rbd.csi.ceph.com  # CSI 驱动标识
    reclaimPolicy: Retain
    allowVolumeExpansion: true
    

  3. CSI 插件
    Ceph/Rook 通过 CSI 驱动程序实现与 Kubernetes 的集成:

    • RBD (块存储):rook-ceph.rbd.csi.ceph.com
    • CephFS (文件存储):rook-ceph.cephfs.csi.ceph.com

配置步骤(以 RBD 为例)
1. 部署 Rook-Ceph 集群

确保已安装 Rook Operator 并创建 CephCluster:

kubectl apply -f https://raw.githubusercontent.com/rook/rook/v1.8.0/deploy/examples/crds.yaml
kubectl apply -f https://raw.githubusercontent.com/rook/rook/v1.8.0/deploy/examples/common.yaml
kubectl apply -f https://raw.githubusercontent.com/rook/rook/v1.8.0/deploy/examples/operator.yaml
kubectl apply -f cluster.yaml  # 自定义的 Ceph 集群配置

2. 创建 StorageClass
# rook-ceph-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: rook-ceph-block
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
  clusterID: rook-ceph       # Ceph 集群命名空间
  pool: replicapool          # RBD 存储池名称
  imageFormat: "2"           # RBD 镜像格式
  imageFeatures: layering    # RBD 特性
  csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
  csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
  csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
  csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: Immediate

应用配置:

kubectl apply -f rook-ceph-storageclass.yaml

3. 创建 PersistentVolumeClaim (PVC)
# demo-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rbd-pvc
spec:
  storageClassName: rook-ceph-block
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

应用 PVC:

kubectl apply -f demo-pvc.yaml


验证配置
  1. 检查 PV 自动创建:

    kubectl get pv  # 应显示自动生成的 PV
    

  2. 查看 PVC 状态:

    kubectl get pvc rbd-pvc -o wide
    

    输出示例:

    NAME      STATUS   VOLUME   CAPACITY   STORAGECLASS       AGE
    rbd-pvc   Bound    pvc-...  10Gi       rook-ceph-block    5m
    

  3. 检查 Ceph 存储池:

    kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- rbd ls replicapool
    


关键参数说明
参数说明
provisionerCSI 驱动程序标识符
clusterIDRook 部署的命名空间
poolCeph 中创建的 RBD 存储池
reclaimPolicyPV 回收策略 (Retain/Delete)
volumeBindingMode卷绑定时机 (Immediate/WaitForFirstConsumer)

故障排查
  1. PVC 卡在 Pending 状态

    • 检查 StorageClass 名称是否匹配
    • 验证 CSI 插件 Pod 是否正常运行:
      kubectl -n rook-ceph get pod -l app=csi-rbdplugin-provisioner
      

  2. 卷挂载失败

    • 检查节点上的 CSI 驱动日志:
      kubectl -n rook-ceph logs ds/csi-rbdplugin
      

  3. 存储扩容问题

    • 确保 Ceph 存储池支持自动扩容
    • 验证 allowVolumeExpansion: true 已设置

提示:完整配置参考 Rook 官方文档

更多推荐