通过动态卷机制,可为 CPFS 智算版实现自动化按需存储,免去手动管理 PV 的繁琐。该方法支持多应用并行读写,尤其适用于 AI 训练、大数据分析等场景,可高效共享代码、配置文件、计算中间结果等数据。
准备工作
已了解CPFS智算版的CPFS智算版使用限制。
确保集群满足以下条件:
集群版本:1.26及以上版本。如需升级集群,请参见手动升级集群。
节点操作系统:Alibaba Cloud Linux 3。
已安装以下存储组件,且版本满足要求。
可在集群的组件管理页面,确认组件版本、安装或升级组件。
CSI组件(csi-plugin和csi-provisioner):v1.33.1及以上版本。如需升级,请参见管理CSI组件。
cnfs-nas-daemon组件:0.1.2及以上版本。
bmcpfs-csi组件:1.35.1及以上
包括bmcpfs-csi-controller(控制面组件,由ACK托管)和bmcpfs-csi-node(节点侧组件,以DaemonSet形式部署在集群中)。
注意事项
使用VSC挂载时,运行 Pod 的节点必须与 CPFS 智算版文件系统实例处于同一 hpn-zone。
灵骏节点在初始化的时候必须与某一个 CPFS 智算版关联,否则无法使用 CSI 进行挂载。
灵骏节点出现故障需要下线前,必须先执行Pod排水(drain)操作。否则,将导致集群元信息不一致,造成Pod资源残留且无法被正常回收。
不支持在同一个Pod中挂载多个源于同一个CPFS智算版文件系统的存储卷(即由包含相同
bmcpfsId的StorageClass所创建的多个PV)。由于原生协议的限制,当同一个Pod尝试多次挂载同一个文件系统实例时(即使是不同子目录),会导致预期外行为。
步骤一:创建CPFS文件系统
参见创建CPFS智算版文件系统创建CPFS文件系统,并记录文件系统ID。
(可选)如需在非灵骏节点实现挂载,请创建VPC挂载点(与集群节点所在的VPC一致),并记录挂载点域名。格式为
cpfs-***-vpc-***.<Region>.cpfs.aliyuncs.com。如果Pod将调度到灵骏节点,则默认使用VSC挂载,无需此步骤。
步骤二:创建 StorageClass
创建StorageClass对象作为存储模板。
使用以下内容,创建
sc.yaml。apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-bmcpfs-test provisioner: bmcpfsplugin.csi.alibabacloud.com parameters: # CPFS 智算版文件系统 ID bmcpfsId: bmcpfs-29000z8xz3lf5nj***** # 指定文件系统内的子路径 # path: "/shared" # 允许后续扩容 allowVolumeExpansion: true # Delete(自动清理)或 Retain(保留数据) reclaimPolicy: Delete参数说明:
参数
是否必填
说明
bmcpfsId是
BMCPFS 文件系统 ID,格式如
bmcpfs-xxxxxxxxx或cpfs-xxxxxxxxx。path否
文件系统内的子路径。
指定时:卷将创建在
{path}/{volumeName}/路径下不指定时:卷将创建在
/{volumeName}/路径下。
allowVolumeExpansion否
是否允许后续通过 PVC 自动扩容。
当前版本不支持动态扩容,此为预留参数。
reclaimPolicy否
Delete(默认):删除 PVC 时自动删除后端文件系统中的文件集(Fileset)。Retain:删除 PVC 时保留后端文件系统中的文件集(Fileset),需手动清理。生产环境建议使用。
创建StorageClass。
kubectl apply -f sc.yaml
步骤三:创建 PVC
应用通过PVC申请存储卷,并引用StorageClass作为配置模板。
使用以下内容,创建
pvc.yaml。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: bmcpfs-vsc namespace: default spec: accessModes: # CPFS 智算版存储卷支持多 Pod 同时读写 - ReadWriteMany resources: requests: # 支持大容量存储(Ti 级别) storage: 10Ti # 仅支持 Filesystem volumeMode: Filesystem # 指定此前创建的 StorageClass storageClassName: alicloud-bmcpfs-test参数说明:
以下参数均为必填
参数
说明
accessModes仅支持
ReadWriteMany,即多 Pod 同时进行挂载和读写。storage请求的存储容量,支持 Gi、Ti 等单位。
volumeMode仅支持
Filesystem。storageClassName指定使用的
StorageClass,以触发存储卷的动态创建。创建PVC。
kubectl apply -f pvc.yaml执行以下命令,确认PVC状态。
可执行
kubectl get pvc bmcpfs-vsc -n default查看PVC状态。若STATUS为Bound,表明系统已为其自动创建了对应的 PV。可执行
kubectl describe pvc bmcpfs-vsc -n default,在Events中查看Provisioning succeeded的成功信息。
步骤四:创建工作负载并挂载PVC
PVC创建后,部署示例工作负载,将PVC绑定的 PV 挂载到应用中。
使用以下内容,创建
deploy.yaml。apiVersion: apps/v1 kind: Deployment metadata: name: cpfs-shared-example spec: # 创建 3 个副本,验证多 Pod 共享存储 replicas: 3 selector: matchLabels: app: cpfs-shared-app template: metadata: labels: app: cpfs-shared-app spec: # 确保Pod可以被调度到灵骏节点上 tolerations: - key: node-role.alibabacloud.com/lingjun operator: Exists effect: NoSchedule # 可选:如需将所有Pod调度到指定节点,可取消此行注释并修改节点名称 # nodeName: cn-hangzhou.10.XX.XX.226 containers: - name: app-container image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 volumeMounts: - name: pvc-cpfs # 将共享存储卷挂载到容器内的 /data 目录 mountPath: /data # 简单的生命周期命令,用于验证数据写入和共享 # Pod启动后,会向共享目录写入一个包含自身主机名的文件 lifecycle: postStart: exec: command: - /bin/sh - -c - > echo "Data written by $(hostname)" > /data/$(hostname).txt && echo "Deployment is running, check shared data in /data." && sleep 3600 volumes: - name: pvc-cpfs persistentVolumeClaim: # 引用此前创建的 PVC claimName: bmcpfs-vsc创建Deployment。
kubectl apply -f deploy.yaml
资源释放指引
为避免产生预期外费用并确保数据安全,请遵循以下流程释放无需使用的资源。
删除工作负载
操作:删除所有使用相关 PVC 的应用,如 Deployment、StatefulSet 等,以停止应用并卸载存储卷。
命令示例:
kubectl delete deployment <your-deployment-name>
删除 PVC
操作:删除应用关联的 PVC。后端数据的处理结果取决于
StorageClass的回收策略(reclaimPolicy)。Retain(推荐):删除 PVC 后,后端 CPFS 智算版的文件集和数据会完整保留。Delete:删除 PVC 后,其绑定的 PV 和后端 CPFS 智算版的文件集将被永久删除。此操作不可逆,请谨慎使用。
命令示例:
kubectl delete pvc <your-pvc-name>
删除 PV(回收策略为
Retain时)操作:如果回收策略为
Retain,删除 PVC 后 PV 变为Released状态。此时需要手动删除 PV。此操作仅移除 Kubernetes 中的资源定义,不影响后端数据。命令示例:
kubectl delete pv <your-pv-name>
删除 StorageClass(可选)
操作:如果不再需要该存储类型,可删除
StorageClass。此操作不影响已创建的卷。命令示例:
kubectl delete sc <your-sc-name>
删除后端 CPFS 智算版文件系统
操作:此操作将永久删除该文件系统上的所有数据(包括
Retain策略保留的数据),且无法恢复。执行前,请务必确认该文件系统已无任何业务依赖,详见删除文件系统。
常见问题
为什么 PVC 一直处于 Pending 状态?
PVC 处于 Pending 状态通常表示动态存储卷的创建(Provisioning)失败。请遵循以下步骤排查。
检查 PVC 事件,通常会直接说明失败原因。
kubectl describe pvc <your-pvc-name> -n <your-namespace>关注
Events部分的告警信息。常见原因如下:StorageClass not found:storageClassName字段填写错误或对应的 StorageClass 不存在。provisioning failed或failed to create fileset:与后端存储交互存在问题,请继续执行后续流程。
检查 StorageClass 和 CSI 驱动配置
如果事件日志指向配置问题,或没有明确错误,请检查
StorageClass的配置和 CSI 驱动的状态。# 1. 检查 StorageClass 的 YAML 配置 kubectl get storageclass <your-sc-name> -o yaml # 2. 检查 CSI 驱动是否已在集群中注册 kubectl get csidriver bmcpfsplugin.csi.alibabacloud.com需确认:
StorageClass 配置:
provisioner字段正确,parameters中的bmcpfsId已正确填写且文件系统 ID 真实存在。bmcpfs-csi 状态:如果
get csidriver命令报错或无返回,表明驱动未正确安装。请在集群的组件管理页面安装bmcpfs-csi-controller、bmcpfs-csi-node和cnfs-nas-daemon。
Pod 一直处于 ContainerCreating 状态,或者事件中出现 MountVolume.Setup failed 错误,该如何排查?
此错误表示 Pod 已经被调度到某个节点,但在节点上挂载存储卷时失败。请遵循以下排查流程。
查看 Pod 事件,定位原因
通过
describe pod命令查看 Pod 的事件日志。kubectl describe pod <pod-name> -n <your-namespace>重点关注
Events部分的Warning信息,例如FailedMount或MountVolume.Setup failed。检查挂载的前提条件
确认 PVC 状态为
Bound:Pod 只能挂载已经成功绑定的存储卷。kubectl get pvc <your-pvc-name>PVC 的
STATUS需为Bound。如果为Pending,表明存储卷创建阶段存在问题,请参见为什么 PVC 一直处于 Pending 状态?。检查节点 CSI 插件的详细日志
如果 PVC 已
Bound且 Pod 位于正确的节点上,进一步确认节点侧的csi-plugin组件的执行挂载操作。# 查看 Pod 所在节点上 csi-plugin 的日志,以获取最终的失败原因 kubectl get pods -n kube-system -l app.kubernetes.io/name=bmcpfs-csi-driver --field-selector spec.nodeName=<nodeName> -o name | xargs kubectl logs -n kube-system -c csi-plugin此日志会包含最底层的错误信息,例如从节点到存储后端的网络连接问题、挂载点权限问题,或是底层的 I/O 错误等。