Cloud Paralleled File System (CPFS) is a type of parallel file system. CPFS stores data across multiple data nodes in a cluster and allows multiple clients to simultaneously access the data. Therefore, CPFS can provide data storage services with high IOPS, high throughput, and low latency for large-scale and high-performance computing clusters. This topic describes how to mount statically provisioned CPFS 1.0 volumes to a Container Service for Kubernetes (ACK) cluster.

Background information

ACK allows you to mount CPFS 1.0 file systems as statically and dynamically provisioned volumes. To mount a CPFS 1.0 file system as a statically provisioned volume, you must manually create a persistent volume (PV) and a persistent volume claim (PVC). This procedure can be time-consuming when large numbers of PVs and PVCs are required. In this case, you can mount the CPFS 1.0 file system as a dynamically provisioned volume. In this topic, alibaba-cloud-csi-driver is used to mount CPFS 1.0 volumes. For more information, see alibaba-cloud-csi-driver.
Notice CPFS is updated to CPFS 2.0. You cannot mount new CPFS 1.0 volumes to ACK clusters.

Procedure

  1. Deploy the CSI-CPFS component.
    To mount CPFS 1.0 volumes, you must first perform the following steps to deploy cpfs-plugin in your ACK cluster:
    apiVersion: storage.k8s.io/v1
    kind: CSIDriver
    metadata:
      name: cpfsplugin.csi.alibabacloud.com
    spec:
      attachRequired: false
      podInfoOnMount: true
    ---
    # This YAML defines all API objects to create RBAC roles for csi node plugin.
    kind: DaemonSet
    apiVersion: apps/v1
    metadata:
      name: csi-cpfsplugin
      namespace: kube-system
    spec:
      selector:
        matchLabels:
          app: csi-cpfsplugin
      template:
        metadata:
          labels:
            app: csi-cpfsplugin
        spec:
          tolerations:
          - operator: Exists
          priorityClassName: system-node-critical
          serviceAccount: admin
          hostNetwork: true
          hostPID: true
          containers:
          - name: driver-registrar
            image: registry.cn-hangzhou.aliyuncs.com/acs/csi-node-driver-registrar:v1.2.0
            imagePullPolicy: Always
            args:
            - "--v=5"
            - "--csi-address=/var/lib/kubelet/csi-plugins/cpfsplugin.csi.alibabacloud.com/csi.sock"
            - "--kubelet-registration-path=/var/lib/kubelet/csi-plugins/cpfsplugin.csi.alibabacloud.com/csi.sock"
            volumeMounts:
            - name: kubelet-dir
              mountPath: /var/lib/kubelet/
            - name: registration-dir
              mountPath: /registration
          - name: csi-cpfsplugin
            securityContext:
              privileged: true
              capabilities:
                add: ["SYS_ADMIN"]
              allowPrivilegeEscalation: true
            image: registry.cn-hangzhou.aliyuncs.com/acs/csi-cpfsplugin:v1.20.4-3220e46-aliyun
            imagePullPolicy: "Always"
            args:
            - "--endpoint=$(CSI_ENDPOINT)"
            - "--v=5"
            - "--driver=cpfsplugin.csi.alibabacloud.com"
            env:
            - name: CSI_ENDPOINT
              value: unix://var/lib/kubelet/csi-plugins/cpfsplugin.csi.alibabacloud.com/csi.sock
            volumeMounts:
            - name: kubelet-dir
              mountPath: /var/lib/kubelet/
              mountPropagation: "Bidirectional"
            - mountPath: /var/log/
              name: host-log
            - name: etc
              mountPath: /host/etc
          volumes:
          - name: kubelet-dir
            hostPath:
              path: /var/lib/kubelet/
              type: Directory
          - name: registration-dir
            hostPath:
              path: /var/lib/kubelet/plugins_registry
              type: DirectoryOrCreate
          - name: host-log
            hostPath:
              path: /var/log/
          - name: etc
            hostPath:
              path: /etc
      updateStrategy:
        type: RollingUpdate
    Run the following command to check the status of the application:
    kubectl get pod -nkube-system |grep cpfs

    Expected output:

    csi-cpfsplugin-8t585                               2/2     Running   0          4h43m
    csi-cpfsplugin-9z5xj                               2/2     Running   0          4h43m
    csi-cpfsplugin-bdm22                               2/2     Running   0          4h43m
    csi-cpfsplugin-bjnlx                               2/2     Running   0          4h44m
    csi-cpfsplugin-nv7vg                               2/2     Running   0          4h43m
    csi-cpfsplugin-zc7z5                               2/2     Running   0          4h43m
  2. Mount a CPFS 1.0 volume.
    1. Create a CPFS file system.
    2. Create a PV and a PVC.
      Use the following template to create a PV and a PVC for the CPFS file system:
      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: cpfs-csi-pv
        labels:
          alicloud-pvname: cpfs-pv
      spec:
        capacity:
          storage: 5Gi
        accessModes:
          - ReadWriteOnce
        persistentVolumeReclaimPolicy: Retain
        csi:
          driver: cpfsplugin.csi.alibabacloud.com
          volumeHandle: cpfs-csi-pv
          volumeAttributes:
            server: "xxxxxx@tcp:xxxxxx@tcp"
            fileSystem: "xxxxxx"
            subPath: "/k8s"
      ---
      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: cpfs-pvc
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 5Gi
        selector:
          matchLabels:
            alicloud-pvname: cpfs-pv
    3. Create an application.
      Use the following template to reference the PVC and create an application:
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: deployment-cpfs
        labels:
          app: nginx
      spec:
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx:1.7.9
              ports:
              - containerPort: 80
              volumeMounts:
                - name: cpfs-pvc
                  mountPath: "/data"
            volumes:
              - name: cpfs-pvc
                persistentVolumeClaim:
                  claimName: cpfs-pvc