CubeFS CSI 插件详解:Kubernetes 云存储集成与部署实战
发布时间:2026/10/12 4:07:48 锦皓数字建站

存储分布式文件系统对象存储云原生【免费下载链接】cubefscloud-native distributed storage项目地址https://gitcode.com/gh_mirrors/cu/cubefs点击查看免费下载CubeFS 基于 Container Storage InterfaceCSI规范实现了 CSI 插件使 Kubernetes 集群中的 Pod 可以直接以 PersistentVolumeClaimPVC的方式使用 CubeFS 的分布式存储能力。本文以官方文档 docs/source/ecology/k8s.md 为主线完整覆盖 CSI 插件分支选型、节点标签、非 Helm 与 Helm 两种部署方式、PVC 创建与挂载、故障排查等全流程并结合仓库内集群部署与 CLI 文档补充底层依据帮助读者在真实环境中完成 CubeFS 与 Kubernetes 的对接。CSI 插件分支与 Kubernetes 版本兼容CubeFS 的 CSI 插件当前维护两个代码分支原因是 k8s 官方在演进 CSI 协议时1.0.0 版本与之前的 0.* 版本互不兼容CSI 协议Kubernetes 兼容版本v0.3.0v1.13 之前的版本例如 v1.12v1.0.0v1.13 及之后的版本例如 v1.15master 分支兼容 CSI 协议 1.0.0 之后的版本k8s v1.13 及以后直接使用csi-spec-v0.3.0 分支兼容 CSI 协议 0.3.0 之前的版本适用于 k8s v1.13 之前的版本。注意csi-spec-v0.3.0 分支的代码基本处于冻结不更新状态后续 CSI 新功能特性都会在 master 分支上演进。本文部署步骤基于 master 分支进行。在开始 CSI 部署之前请先搭建好 CubeFS 集群。集群搭建所需的依赖组件与版本要求可参考 docs/source/quickstart/requirement.mdgcc-c 4.8.5 及以上、CMake 3.1 及以上、bzip2-devel 1.0.6 及以上、zlib-devel 1.2.7 及以上、mvn 3.8.4 及以上、Go 1.17 及以上若需部署纠删码子系统还需准备 kafka 1.x 及以上与 consul 1.1x 及以上。集群的完整部署步骤master/metanode/datanode 等组件的 json 配置与启动命令参见 docs/source/quickstart/cluster-deploy.md。为集群节点添加 CSI 标签部署 CSI 之前需要给 k8s 集群节点打标签。CSI 容器会根据节点标签决定是否驻留打了标签的节点会自动部署 CSI 容器未打标签的节点不会驻留 CSI 容器。在对应的 k8s 节点上执行如下命令$ kubectl label node nodename component.cubefs.io/csienabled该标签component.cubefs.io/csienabled会在后续的 StorageClass、DaemonSet、Helm nodeSelector 等配置中被反复引用是 CSI 组件调度的核心依据。CSI 部署方式一非 Helm 手动部署非 Helm 方式按顺序依次创建 RBAC、StorageClass、CSI Controller 与 CSI Node所需部署文件基本都在 cubefs-csi 仓库的 deploy 目录下。获取插件源码$ git clone https://github.com/cubefs/cubefs-csi.git $ cd cubefs-csi创建 CSI RBACdeploy/csi-rbac.yaml内容基本不需要修改它声明了 CSI 组件的角色与对应权限直接应用即可$ kubectl apply -f deploy/csi-rbac.yaml创建 StorageClassdeploy/storageclass.yaml内容如下需要修改masterAddrkind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: cfs-sc provisioner: csi.cubefs.com allowVolumeExpansion: true reclaimPolicy: Delete parameters: # Resource manager IP address or URL masterAddr: master-service.cubefs.svc.cluster.local:17010 # Owner name as authentication owner: csiuser参数说明masterAddrCubeFS 集群中 master 组件的地址需修改为实际部署的 master IP格式为ip:port多个地址用英文逗号隔开格式为ip1:port1,ip2:port2也可以使用域名。17010 正是 master 组件的默认监听端口参见 docs/source/quickstart/cluster-deploy.md 中 master.json 的listen: 17010配置owner卷属主名称作为鉴权标识。从源码文档看创建卷时如果集群中不存在与 owner 同名的用户会自动创建以 owner 为用户 ID 的用户详见 docs/source/user-guide/volume.md 中createVol接口的说明allowVolumeExpansion: true允许对已创建的卷进行扩容reclaimPolicy: Delete删除 PVC 时回收底层存储资源。修改完成后执行$ kubectl apply -f deploy/storageclass.yaml部署 CSI ControllerCSI Controller 组件在整个集群中只会部署一个 Pod负责卷的创建、删除、挂载/卸载等控制面操作$ kubectl apply -f deploy/csi-controller-deployment.yaml部署完成后使用kubectl get pod -n cubefs应能看到只有一个 controller 处于 RUNNING 状态。部署 CSI NodeCSI Node 会部署多个 Pod数量与打了标签的 k8s 节点数一致负责在节点上执行实际的卷挂载动作$ kubectl apply -f deploy/csi-node-daemonset.yamlCSI 部署方式二Helm 自动化部署使用 Helm 可以减少一部分人工操作适合对 Helm 熟悉的用户。安装 Helm使用 Helm 部署前需要先安装 Helm按官方安装文档操作。下载 cubefs-helm$ git clone https://github.com/cubefs/cubefs-helm.git $ cd cubefs-helm编写 Helm 部署文件在 cubefs-helm 目录下创建 CSI 相关的 Helm 部署 yaml 文件cubefs-csi-helm.yaml$ touch cubefs-csi-helm.yaml文件内容如下component: master: false datanode: false metanode: false objectnode: false client: false csi: true monitor: false ingress: false image: # CSI related images csi_driver: cubefs/cfs-csi-driver:v3.4.0 csi_provisioner: registry.k8s.io/sig-storage/csi-provisioner:v2.2.2 csi_attacher: registry.k8s.io/sig-storage/csi-attacher:v3.4.0 csi_resizer: registry.k8s.io/sig-storage/csi-resizer:v1.3.0 driver_registrar: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.5.0 csi: driverName: csi.cubefs.com logLevel: error # If you changed the default kubelet home path, this # value needs to be modified accordingly kubeletPath: /var/lib/kubelet controller: tolerations: [ ] nodeSelector: component.cubefs.io/csi: enabled node: tolerations: [ ] nodeSelector: component.cubefs.io/csi: enabled resources: enabled: false requests: memory: 4048Mi cpu: 2000m limits: memory: 4048Mi cpu: 2000m storageClass: # Whether automatically set this StorageClass to default volume provisioner setToDefault: true # StorageClass reclaim policy, Delete or Retain is supported reclaimPolicy: Delete # Override the master address parameter to connect to external cluster # 如果是要连接外部 CubeFS 集群的设置该参数否则可以忽略 masterAddr: otherParameters:参数说明masterAddr对应的 CubeFS 集群地址多个地址用英文逗号隔开格式为ip1:port1,ip2:port2如果要连接外部 CubeFS 集群则设置该参数否则可以忽略csi.kubeletPath默认 kubelet 路径如修改过 kubelet 主目录需同步修改csi.resources.requests/limits默认资源限制为 2 CPU 与 4G 内存4048Mi可按需调整image.csi_driverCSI 组件镜像若使用自己编译的镜像可按需替换其余几个 CSI 镜像尽量保持默认除非对 CSI 运行原理非常了解component段将 master、datanode、metanode、objectnode、client、monitor、ingress 全部置为 false仅启用csi: true表示仅通过该 Chart 部署 CSI 组件controller与node段的nodeSelector均绑定component.cubefs.io/csi: enabled标签与手动部署方式的节点标签机制保持一致。执行 Helm 部署在 cubefs-helm 根目录执行$ helm upgrade --install cubefs ./cubefs -f ./cubefs-csi-helm.yaml -n cubefs --create-namespace该命令会创建cubefs命名空间并以cubefs为 release 名称安装 CSI 组件。检查 CSI 组件部署状态部署完成后检查 CSI 部署情况$ kubectl get pod -n cubefs正常情况下controller组件容器只有一个node组件容器的数量与 k8s 节点打标签的数量一致且状态都为RUNNING。如果发现某个 Pod 状态不为RUNNING先查看该 Pod 的报错信息$ kubectl describe pod -o wide -n cubefs pod名称根据报错信息排查如果报错信息有限可进入该 Pod 所在的宿主机执行$ docker ps -a | grep pod名称过滤与该 Pod 相关的容器找到有问题的容器查看日志$ docker logs 有问题的docker容器id根据容器日志输出排查。如果日志出现没有权限之类的字眼很可能是 RBAC 权限没有生成好重新部署一次 CSI RBAC 即可kubectl apply -f deploy/csi-rbac.yaml。创建 PVC 验证存储CSI 组件部署完成后可以创建 PVC 进行验证。pvc.yaml内容如下apiVersion: v1 kind: PersistentVolumeClaim metadata: name: cubefs-pvc namespace: default spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: cfs-scstorageClassName必须与刚才创建的 StorageClass 的metadata.name保持一致示例为cfs-sc这样 k8s 才会根据该 StorageClass 中定义的参数masterAddr、owner、provisioner: csi.cubefs.com等来动态创建存储卷。编写 pvc yaml 时需注意以下参数metadata.namePVC 名称可按需修改同一 namespace 下 PVC 名称唯一不允许重复metadata.namespacePVC 所在命名空间按需修改spec.resources.request.storagePVC 容量大小storageClassNameStorageClass 名称可通过kubectl get sc查看当前集群有哪些 storageclass。执行创建$ kubectl create -f pvc.yaml执行后通过kubectl get pvc -n 命名空间查看 PVC 状态Pending表示等待中Bound表示创建成功。PVC 一直 Pending 的排查思路如果 PVC 状态一直处于 Pending先用kubectl describe pvc -n 命名空间 PVC名称查看原因。若报错消息不明显则使用kubectl logs命令查看 csi controller Pod 内csi-provisioner容器的日志——csi-provisioner是 k8s 与 csi driver 之间的中间桥梁大量信息都可以在这里查看。如果csi-provisioner的日志仍看不出具体问题则使用kubectl exec命令查看 csi controller Pod 内cfs-driver容器的日志其日志存放在容器内的/cfs/logs目录下。这里不能使用kubectl logs查看cfs-driver日志是因为cfs-driver的日志并不打印到标准输出而csi-provisioner等 sidecar 容器的日志打印到标准输出所以后者可以直接用kubectl logs查看。在应用中挂载 PVC有了 PVC即可在应用中挂载到指定目录。示例 Deployment yaml 如下apiVersion: apps/v1 kind: Deployment metadata: name: cfs-csi-demo namespace: default spec: replicas: 1 selector: matchLabels: app: cfs-csi-demo-pod template: metadata: labels: app: cfs-csi-demo-pod spec: nodeSelector: component.cubefs.io/csi: enabled containers: - name: cfs-csi-demo image: nginx:1.17.9 imagePullPolicy: IfNotPresent ports: - containerPort: 80 name: http-server volumeMounts: - mountPath: /usr/share/nginx/html mountPropagation: HostToContainer name: mypvc volumes: - name: mypvc persistentVolumeClaim: claimName: cubefs-pvc该 yaml 表示将名为cubefs-pvc的 PVC 挂载到cfs-csi-demo容器内的/usr/share/nginx/html目录。注意nodeSelector同样指定了component.cubefs.io/csi: enabled确保应用被调度到已部署 CSI 节点的机器上。常见问题编译最新 CSI 镜像下载 cubefs-csi 源码后执行$ make image即可基于当前源码构建最新的 CSI 镜像构建产物可用于替换 helm 配置中的image.csi_driver。查看 PVC 里面的文件如果 PVC 已挂载给容器使用可进入容器对应的挂载位置查看或者将 PVC 对应的卷使用 CubeFS client 挂载到宿主机某目录查看。client 的挂载方式与配置参数mountPoint、volName、owner、masterAddr等详见 docs/source/user-guide/file.md。k8s v1.13 之前版本配置如果使用 csi-spec-v0.3.0 分支对接 v1.13 之前的 k8s需要在各组件启动参数中开启 CSI 相关特性门控kube-apiserver 启动参数--feature-gatesCSIPersistentVolumetrue,MountPropagationtrue --runtime-configapi/allkube-controller-manager 启动参数--feature-gatesCSIPersistentVolumetruekubelet 启动参数--feature-gatesCSIPersistentVolumetrue,MountPropagationtrue,KubeletPluginsWatchertrue --enable-controller-attach-detachtrue查看 PVC 对应的 CubeFS 卷PVC 会与一个 PV 绑定该绑定的 PV 名称就是底层 CubeFS 卷的名称通常以pvc-开头。PVC 对应的 PV 可直接使用kubectl get pvc -n 命名空间查看。CubeFS 卷管理创建、扩容、删除、设置副本数等卷管理操作可参考 cfs-cli 工具使用指南 docs/source/user-guide/cli/overview.md。该工具支持cfs-cli volume系列命令以及 cluster、datanode、metapartition、user、quota 等管理命令可用于核对 CSI 动态创建的卷状态。赞分享存储分布式文件系统对象存储云原生【免费下载链接】cubefscloud-native distributed storage项目地址https://gitcode.com/gh_mirrors/cu/cubefs点击查看免费下载相关推荐KurrentDB与Kubernetes集成云原生事件存储部署方案KurrentDB与Kubernetes集成云原生事件存储部署方案 KurrentDB作为专为 事件溯源 优化的流数据库在现代微服务架构中发挥着关键作用。本数据库后端流处理Kubernetes存储插件终极指南CSI驱动与存储类配置详解Kubernetes存储插件终极指南CSI驱动与存储类配置详解 Kubernetes存储插件是容器编排中实现持久化存储的核心组件而CSIContainer文档云原生Element-Tiptap编辑器完全指南Vue3富文本编辑的终极解决方案Element Tiptap编辑器完全指南Vue3富文本编辑的终极解决方案 Element Tiptap是一款基于tiptap2和Element Plus构建前端UI组件富文本上一篇NS-USBLoader完整指南Switch游戏传输与系统管理的终极解决方案下一篇django-allauth 集成 CILogon为科研机构场景接入 OIDC/OAuth2 社会化登录创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。