使用CPFS通用版静态存储卷

CPFS是一种并行文件系统,具有高吞吐和高IOPS,能够满足HPC高性能计算场景的需求,如AI训练、自动驾驶、基因计算、影视渲染等业务。本文介绍如何创建CPFS通用版静态存储卷,并在工作负载中挂载。

前提条件

csi-plugincsi-provisioner组件版本不低于v1.22.11-abbb810e-aliyun。如需升级,请参见升级csi-plugincsi-provisioner

使用限制

  • 仅支持部分地域,请参见CPFS通用版开服地域

  • 仅支持通过NFS协议挂载,不支持通过POSIX协议挂载。

  • 仅支持挂载到x86架构的节点上。

  • 不支持跨VPC挂载,仅支持挂载到同一VPC的集群中。

  • 不支持挂载到操作系统为ContainerOS的节点上。

配置存储组件

请根据csi-plugin组件的版本,选择配置方式。

  • csi-plugin版本为1.33及以上

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

  • csi-plugin版本小于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文件系统和协议服务

CPFS仅支持静态挂载。您需要先创建CPFS文件系统以及对应的协议服务,并获取挂载地址以便后续挂载使用。

  1. 创建CPFS通用版文件系统

    • 请在集群所属地域创建CPFS文件系统。

    • 如果使用已有CPFS文件系统,请在NAS控制台文件系统列表页面单击目标CPFS文件系统,在基本信息页面确认CPFS版本号为2.3.0及以上。如果不满足,请创建新的CPFS文件系统。

  2. 创建协议服务

    • 请使用集群对应的VPC和交换机创建协议服务,并生成挂载点。

    • 如果使用已有协议服务,请确认协议服务所使用的VPC是否与集群一致(CPFS不支持跨VPC挂载)。如果不满足,请重新创建协议服务。

  3. 获取协议服务的挂载地址。

    协议服务页面,单击导出目录,然后在挂载地址列复制并保存挂载地址。挂载地址包含挂载点域名以及挂载目录,如果指定导出的是 / 目录,则挂载地址显示为cpfs-****.<Region ID>.cpfs.aliyuncs.com:/share

步骤二:创建PVPVC

  1. 基于已有的CPFS文件系统,创建对应的PVPVC。

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

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: cpfs-pv
        labels:
          alicloud-pvname: cpfs-pv
      spec:
        accessModes:
        - ReadWriteMany
        capacity:
          storage: 20Gi
        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                                             # 必须与PV Name保持一致。
        mountOptions:
        - rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport
        - vers=3
      ---
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: cpfs-pvc
      spec:
        accessModes:
        - ReadWriteMany
        resources:
          requests:
            storage: 20Gi
        selector:
          matchLabels:
            alicloud-pvname: cpfs-pv
      • PV参数

        参数

        说明

        labels

        设置Label,以便PVC使用selector进行匹配绑定。

        accessModes

        PV的访问模式。

        capacity.storage

        声明存储卷容量。

        csi.driver

        驱动类型,设置为nasplugin.csi.alibabacloud.com

        csi.volumeAttributes

        CPFS存储卷的属性。

        • mountProtocol:设置为cpfs-nfs,表示使用NFS协议挂载CPFS。

        • path:设置为CPFS通用版协议服务导出目录对应路径,例如/share。支持设置为子目录,例如/share/dir

        • volumeAs:设置为subpath,表示创建子目录类型的PV。

        • server:设置为CPFS通用版协议服务导出目录的挂载地址的域名。

        csi.volumeHandle

        必须与PV Name保持一致。

      • PVC参数

        参数

        说明

        accessModes

        PVC请求PV的访问模式。

        selector

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

        resources.requests.storage

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

    2. 创建PVPVC。

      kubectl apply -f cpfs-pv-pvc.yaml
  2. 确认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

步骤三:创建应用并挂载CPFS

  1. 创建StatefulSet并挂载CPFS通用版静态卷。

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

      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: cpfs-sts
      spec:
        selector:
          matchLabels:
            app: nginx
        serviceName: "nginx"
        replicas: 1
        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
            volumes:
            - name: cpfs-pvc
              persistentVolumeClaim:
                claimName: cpfs-pvc
    2. 创建StatefulSet。

      kubectl apply -f cpfs-test.yaml
  2. 确认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)