全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:使用CPFS智算版动态存储卷

更新时间:Jan 21, 2026

通过动态卷机制,可为 CPFS 智算版实现自动化按需存储,免去手动管理 PV 的繁琐。该方法支持多应用并行读写,尤其适用于 AI 训练、大数据分析等场景,可高效共享代码、配置文件、计算中间结果等数据。

准备工作

  • 已了解CPFS智算版的CPFS智算版使用限制

  • 确保集群满足以下条件:

    • 集群版本:1.26及以上版本。如需升级集群,请参见手动升级集群

    • 节点操作系统:Alibaba Cloud Linux 3。

    • 已安装以下存储组件,且版本满足要求。

      可在集群的组件管理页面,确认组件版本、安装或升级组件。
      • CSI组件(csi-plugincsi-provisioner):v1.33.1及以上版本。如需升级,请参见管理CSI组件

      • cnfs-nas-daemon组件:0.1.2及以上版本。

        展开查看cnfs-nas-daemon介绍

        cnfs-nas-daemon负责管理EFC进程,其资源消耗较高,并直接影响存储性能。可在组件管理页面调整其资源配置,推荐的调整策略如下:

        • CPU:CPU请求量与节点总带宽相关。计算规则为:每1Gb/s带宽需分配0.5 Core,并额外增加1 Core用于元数据管理。请根据此规则调整CPU配置。

          例如,对于一个配置了100Gb/s网卡的节点,推荐的CPU请求量为 100 * 0.5 + 1 = 51 Cores。
        • Memory:CPFS智算版通过FUSE访问,其数据读写缓存及文件元数据均占用内存。推荐将内存请求量设置为节点总内存的15%。

        配置调整后,可根据实际负载情况进行动态扩缩。

        重要
        • 更新生效方式:cnfs-nas-daemon DaemonSet默认更新策略为OnDelete。在组件管理页面调整其CPU或Memory后,需手动删除节点上原有的cnfs-nas-daemon Pod,以触发重建使新配置生效。

          为确保业务稳定性,建议在业务低峰期执行此操作。

        • 操作风险:删除或重启 cnfs-nas-daemon Pod 会临时中断该节点上的CPFS挂载服务。

          • 不支持挂载点热升级的节点:此操作为硬中断,将导致应用Pod运行异常。需手动删除应用Pod,等待应用Pod重启后恢复。

          • 支持热升级的节点:应用Pod可在cnfs-nas-daemon Pod重启后自动恢复。

          ①:符合以下条件的节点支持热升级:

          • 节点系统内核为5.10.134-18及以上

          • bmcpfs-csi-controller和bmcpfs-csi-plugin版本为 1.35.1 及以上

          • cnfs-nas-daemon版本为0.1.9-compatible.1及以上

      • 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文件系统

  1. 参见创建CPFS智算版文件系统创建CPFS文件系统,并记录文件系统ID。

  2. (可选)如需在非灵骏节点实现挂载,请创建VPC挂载点(与集群节点所在的VPC一致),并记录挂载点域名。格式为cpfs-***-vpc-***.<Region>.cpfs.aliyuncs.com

    如果Pod将调度到灵骏节点,则默认使用VSC挂载,无需此步骤。

步骤二:创建 StorageClass

创建StorageClass对象作为存储模板。

  1. 使用以下内容,创建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-xxxxxxxxxcpfs-xxxxxxxxx

    path

    文件系统内的子路径。

    • 指定时:卷将创建在 {path}/{volumeName}/ 路径下

    • 不指定时:卷将创建在 /{volumeName}/ 路径下。

    allowVolumeExpansion

    是否允许后续通过 PVC 自动扩容。

    当前版本不支持动态扩容,此为预留参数。

    reclaimPolicy

    • Delete(默认):删除 PVC 时自动删除后端文件系统中的文件集(Fileset)。

    • Retain:删除 PVC 时保留后端文件系统中的文件集(Fileset),需手动清理。生产环境建议使用。

  2. 创建StorageClass。

    kubectl apply -f sc.yaml

步骤三:创建 PVC

应用通过PVC申请存储卷,并引用StorageClass作为配置模板。

  1. 使用以下内容,创建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 ,以触发存储卷的动态创建。

  2. 创建PVC。

    kubectl apply -f pvc.yaml
  3. 执行以下命令,确认PVC状态。

    • 可执行kubectl get pvc bmcpfs-vsc -n default查看PVC状态。若STATUSBound,表明系统已为其自动创建了对应的 PV。

    • 可执行kubectl describe pvc bmcpfs-vsc -n default,在 Events 中查看 Provisioning succeeded的成功信息。

步骤四:创建工作负载并挂载PVC

PVC创建后,部署示例工作负载,将PVC绑定的 PV 挂载到应用中。

  1. 使用以下内容,创建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
  2. 创建Deployment。

    kubectl apply -f deploy.yaml

资源释放指引

为避免产生预期外费用并确保数据安全,请遵循以下流程释放无需使用的资源。

  1. 删除工作负载

    • 操作:删除所有使用相关 PVC 的应用,如 Deployment、StatefulSet 等,以停止应用并卸载存储卷。

    • 命令示例:kubectl delete deployment <your-deployment-name>

  2. 删除 PVC

    • 操作:删除应用关联的 PVC。后端数据的处理结果取决于 StorageClass 的回收策略(reclaimPolicy)。

      • Retain(推荐):删除 PVC 后,后端 CPFS 智算版的文件集和数据会完整保留。

      • Delete:删除 PVC 后,其绑定的 PV 和后端 CPFS 智算版的文件集将被永久删除。此操作不可逆,请谨慎使用。

    • 命令示例:kubectl delete pvc <your-pvc-name>

  3. 删除 PV(回收策略为 Retain时)

    • 操作:如果回收策略为 Retain,删除 PVC 后 PV 变为 Released 状态。此时需要手动删除 PV。此操作仅移除 Kubernetes 中的资源定义,不影响后端数据。

    • 命令示例:kubectl delete pv <your-pv-name>

  4. 删除 StorageClass(可选)

    • 操作:如果不再需要该存储类型,可删除 StorageClass。此操作不影响已创建的卷。

    • 命令示例:kubectl delete sc <your-sc-name>

  5. 删除后端 CPFS 智算版文件系统

    • 操作:此操作将永久删除该文件系统上的所有数据(包括 Retain 策略保留的数据),且无法恢复。执行前,请务必确认该文件系统已无任何业务依赖,详见删除文件系统

常见问题

为什么 PVC 一直处于 Pending 状态?

PVC 处于 Pending 状态通常表示动态存储卷的创建(Provisioning)失败。请遵循以下步骤排查。

  1. 检查 PVC 事件,通常会直接说明失败原因。

    kubectl describe pvc <your-pvc-name> -n <your-namespace>

    关注 Events 部分的告警信息。常见原因如下:

    • StorageClass not foundstorageClassName 字段填写错误或对应的 StorageClass 不存在。

    • provisioning failedfailed to create fileset:与后端存储交互存在问题,请继续执行后续流程。

  2. 检查 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 已经被调度到某个节点,但在节点上挂载存储卷时失败。请遵循以下排查流程。

  1. 查看 Pod 事件,定位原因

    通过 describe pod 命令查看 Pod 的事件日志。

    kubectl describe pod <pod-name> -n <your-namespace>

    重点关注 Events 部分的 Warning 信息,例如 FailedMountMountVolume.Setup failed

  2. 检查挂载的前提条件

    确认 PVC 状态为 Bound:Pod 只能挂载已经成功绑定的存储卷。

    kubectl get pvc <your-pvc-name>

    PVC 的 STATUS 需为 Bound。如果为 Pending,表明存储卷创建阶段存在问题,请参见为什么 PVC 一直处于 Pending 状态?

  3. 检查节点 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 错误等。