全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:使用CPFS通用版静态存储卷

更新时间:Mar 05, 2026

CPFS是一种高吞吐、高IOPS的并行文件系统,适用于AI训练、自动驾驶等高性能计算(HPC)场景。在ACK集群中,多个Pod可以挂载同一个CPFS通用版静态存储卷,以实现高性能的数据共享和持久化存储。

工作原理

在ACK集群中挂载CPFS通用版静态存储卷主要流程如下。

image
  1. 创建PV:在集群中“注册”已有的CPFS通用版,声明其挂载地址、容量、访问模式等。

  2. 创建PVC:应用通过PVC来“申请”使用已注册的存储资源。PVC会与符合条件的PV自动绑定。

  3. 在应用中挂载:将已绑定的PVC挂载到应用Pod中,作为容器内的一个持久化目录。

准备工作

  • 检查并升级CSI组件:已确保csi-plugin和csi-provisioner组件版本不低于v1.22.11-abbb810e-aliyun。

    如需升级,请参见升级CSI组件
  • 已配置存储组件,以支持CPFS的挂载。

    配置流程

    根据csi-plugin的版本选择不同的配置方式。

    1.33及以上

    安装cnfs-nas-daemon组件,并配置csi-plugin开启AlinasMountProxy=true FeatureGate,使得CSI后续调用cnfs-nas-daemon进行挂载。具体操作,请参见管理cnfs-nas-daemon组件

    1.33以下

    1. 配置ConfigMap,开启挂载CPFS通用版时使用的NFS协议。

      cat << EOF | kubectl apply -f -
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: csi-plugin
        namespace: kube-system
      data:
        cpfs-nas-enable: "true"   # 使用CPFS通用版挂载时,使用NFS协议。
      EOF
    2. 重启csi-plugin,安装相关依赖。

      此操作不影响业务正常运行。

      kubectl -n kube-system rollout restart daemonset csi-plugin

      预期输出:

      daemonset.apps/csi-plugin restarted
  • 已准备CPFS通用版文件系统、协议服务和可供ACK集群挂载的挂载地址。

    如未创建,请在集群所属地域创建CPFS通用版文件系统,使用集群对应的VPC和交换机创建协议服务,并生成挂载点。

    • 文件系统:为CPFS通用版开服地域,且与集群位于同一地域,版本为2.3.0及以上。

      NAS控制台文件系统列表页面单击目标CPFS文件系统,在基本信息页面确认CPFS版本号。
    • 协议服务:CPFS不支持跨VPC挂载,使用的VPC需与集群一致。

    • 已获取服务协议的挂载地址(由挂载点域名和导出目录组成)。如指定导出 / 目录,则挂载地址为cpfs-****.<Region ID>.cpfs.aliyuncs.com:/share

      协议服务页面,单击导出目录,在挂载地址列复制并保存挂载地址。
  • 已了解CPFS通用版的使用限制

步骤一:创建PV

在集群中创建PV,用于“注册”已有的CPFS文件系统。

  1. 将以下内容保存为cpfs-pv.yaml文件。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: cpfs-pv
      labels:  # 定义标签,用于后续PVC绑定
        alicloud-pvname: cpfs-pv
    spec:
      accessModes:  # 访问模式
      - ReadWriteMany
      capacity:
        storage: 20Gi  # 定义PV的总容量
      csi:
        driver: nasplugin.csi.alibabacloud.com  # 固定为此值
        volumeAttributes:
          mountProtocol: cpfs-nfs   # 使用NFS协议进行挂载
          path: "/share"    # 挂载地址中的挂载目录
          volumeAs: subpath    # 子目录
          server: "cpfs-******-******.cn-shanghai.cpfs.aliyuncs.com" # 挂载地址中的挂载点域名
        volumeHandle: cpfs-pv  # 卷的唯一标识符,与metadata.name保持一致       
      mountOptions:  # NFS挂载参数
      - rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport
      - vers=3

    核心参数说明:

    参数

    说明

    accessModes

    PV的访问模式。

    capacity.storage

    声明存储卷容量。

    csi.driver

    驱动类型,使用CPFS通用版时固定为nasplugin.csi.alibabacloud.com

    csi.volumeAttributes.server

    CPFS通用版协议服务导出目录的挂载地址中的挂载点域名。

    csi.volumeAttributes.path

    CPFS通用版协议服务导出目录的挂载地址中的挂载目录,例如/share。支持设置为子目录,例如/share/dir

    csi.volumeAttributes.mountProtocol

    cpfs-nfs表示使用NFS协议挂载CPFS。

    csi.volumeAttributes.volumeAs

    subpath表示创建子目录类型的PV。

    csi.volumeHandle

    与PV Name保持一致。

  2. 执行以下命令创建PV。

    kubectl apply -f cpfs-pv.yaml
  3. 查看PV状态。

    kubectl get pv cpfs-pv

    预期输出:

    NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    cpfs-pv   20Gi       RWX            Retain           Available                                   2s

步骤二:创建PVC

创建PVC,用于“申请”使用上一步注册的存储资源。

  1. 将以下内容保存为cpfs-pvc.yaml。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: cpfs-pvc
    spec:
      accessModes:
      - ReadWriteMany  # 访问模式
      resources:
        requests: 
          storage: 20Gi  # 请求的存储容量
      selector:  # 
        matchLabels:
          alicloud-pvname: cpfs-pv  # 精确绑定此前创建的PV

    参数

    说明

    accessModes

    PVC请求PV的访问模式。

    selector

    使用PV上的Label进行匹配绑定。

    resources.requests.storage

    分配给Pod的存储容量。不大于PV容量即可。

  2. 创建PVC。

    kubectl apply -f cpfs-pvc.yaml
  3. 查看PVC状态,确认已与PV成功绑定。

    kubectl get pvc cpfs-pvc

    返回示例如下:

    NAME       STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
    cpfs-pvc   Bound    cpfs-pv   20Gi       RWO                           <unset>                 18m

步骤三:创建应用并挂载

创建应用负载,并在其配置中声明使用此前创建的PVC。

  1. 将以下内容保存为cpfs-test.yaml。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: cpfs-sts
    spec:
      selector:
        matchLabels:
          app: nginx
      serviceName: "nginx"
      replicas: 2
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            volumeMounts:
            - name: cpfs-pvc
              mountPath: /data  # 将存储卷挂载到容器内的/data目录
          volumes:
          - name: cpfs-pvc
            persistentVolumeClaim:
              claimName: cpfs-pvc  # 引用此前创建的PVC
  2. 创建StatefulSet。

    kubectl apply -f cpfs-test.yaml
  3. 查看Pod状态。

    kubectl get pods -l app=nginx

    预期输出:

    NAME         READY   STATUS    RESTARTS   AGE
    cpfs-sts-0   1/1     Running   0          58s
    cpfs-sts-1   1/1     Running   0          50s
  4. 检查容器内的挂载点,确认CPFS已挂载成功。

    kubectl exec cpfs-sts-0 -- mount | grep /data

    预期输出如下,说明CPFS通用版静态卷挂载成功。

    cpfs-******-******.cn-shanghai.cpfs.aliyuncs.com:/share on /data type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,noresvport,proto=tcp,port=30000,timeo=600,retrans=2,sec=sys,mountaddr=127.0.1.255,mountvers=3,mountport=30000,mountproto=tcp,local_lock=all,addr=127.0.1.255)

验证共享存储和持久化存储

成功部署应用后,可验证存储卷是否按预期工作。

共享存储

在一个Pod中创建文件,然后另一个Pod中查看,验证数据的共享存储。

  1. 查看Pod信息,获取Pod名称。

    kubectl get pod -l app=nginx

    预期输出:

    NAME         READY   STATUS    RESTARTS   AGE
    cpfs-sts-0   1/1     Running   0          10s
    cpfs-sts-1   1/1     Running   0          5s
  2. 在一个Pod中创建文件。

    以名为cpfs-sts-0的Pod作为示例:

    kubectl exec cpfs-sts-0 -- touch /data/test.txt
  3. 在另一个Pod中查看文件是否存在。

    以名为cpfs-sts-1的Pod为例。

    kubectl exec cpfs-sts-1 -- ls /data

    预期输出:

    test.txt

    可以查看到此前新建的文件,表明数据可在多Pod间共享。

持久化存储

重建Deployment,在新建Pod中查看文件系统中的数据是否存在,验证数据的持久化存储。

  1. 删除应用Pod以触发重建。

    kubectl rollout restart sts cpfs-sts
  2. 查看Pod,等待新Pod启动并进入Running状态。

    kubectl get pod -l app=nginx

    预期输出:

    NAME         READY   STATUS    RESTARTS   AGE
    cpfs-sts-0   1/1     Running   0          1s
    cpfs-sts-1   1/1     Running   0          10s
  3. 在新Pod中查看此前创建的文件是否存在。

    以名为cpfs-sts-0的Pod为例。

    kubectl exec cpfs-sts-0 -- ls /data

    预期输出:

    test.txt

    可以查看到此前写入的文件,表明数据可持久化存储。

生产环境使用建议

  • 性能调优:CPFS适用于高吞吐和高IOPS场景。可在PV的mountOptions中调整NFS挂载参数(如rsizewsize)以优化性能,满足特定工作负载需求。

  • 数据一致性:CPFS作为共享存储,不保证多个Pod并发写入同一文件的数据一致性。为避免文件损坏,需在应用层面自行实现分布式锁或采用仅追加(Append-only)的写入模式。

  • 存储卷管理:静态存储卷的方式需手动管理PV。对于需要为多个应用自动创建、隔离存储卷的场景,推荐使用CNFS管理CPFS动态存储卷,请参见管理CPFS通用版动态存储卷