使用CPFS通用版静态存储卷

更新时间:
复制 MD 格式

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

工作原理

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

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

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

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

步骤一:创建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挂载参数(如rsize、wsize)以优化性能,满足特定工作负载需求。

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

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