Use dynamic volumes and cloud disks

更新时间:
复制 MD 格式

Ideal for I/O-intensive and latency-sensitive workloads like databases and middleware, the dynamic volume mechanism simplifies storage lifecycle management by automatically creating and mounting a dedicated cloud disk for each application replica.

How it works

A StatefulSet uses cloud disks as dynamic storage volumes through the following process:

  1. Define a template
    Create or use a default StorageClass as a template to dynamically create cloud disks. The StorageClass specifies key parameters, such as the disk type, performance, and reclaim policy.

  2. Declare storage requirements in the application

    In the StatefulSet, define volumeClaimTemplates and reference the StorageClass to specify the storage capacity and access mode for the PVCs.

  3. Automatically create and mount storage volumes
    When the StatefulSet creates a Pod, the system automatically generates a unique PVC for the Pod based on the template. The CSI component then creates a PV based on the StorageClass, binds the PV to the PVC, and mounts the corresponding cloud disk to the Pod.

Prerequisites

  • Availability zone limitations: Except for ESSD zone-redundant cloud disks, other cloud disk types can only be attached to pods in the same availability zone.

  • Instance type family limitations: Some cloud disk types can only be attached to specific instance type families.

  • CSI component requirements: The csi-plugin and csi-provisioner components must be installed.

    The CSI components are installed by default. Check the Add-ons page to ensure they are still installed. We recommend upgrading the CSI components to the latest version.
  • Virtual node limitations: To use a cloud disk on a virtual node, your cluster and kube-scheduler must meet the following version requirements.

    Version requirements

    Cluster version

    Kube-scheduler version

    1.28 or later

    6.9.3 or later

    1.26

    6.8.7

    1.24

    6.4.7

    1.22

    6.4.5

  • Lingjun Node limitations: To use a cloud disk on a Lingjun Node, you must meet the following requirements.

    Requirements

    • CSI component: v1.34.3 or later.

    • Authorize RAM Roles: Manually add the  eflo:DescribeNode and eflo:DescribeNodeType permissions to the AliyunCCCSIPluginRole RAM Role.

    • Cloud disk tags:

      1. Go to ECS console - Block Storage - Disks.

      2. When you create a cloud disk, add the createdByProduct:eflo tag to it. You can add this tag only during creation.

      After the cloud disk is created, use it to manually create a PV and bind it by using a PVC. This cloud disk can be scheduled only to Lingjun nodes.

Step 1: Choose a StorageClass

ACK provides several default StorageClasses. Since a StorageClass cannot be modified after creation, you can manually create a StorageClass if the default configurations do not meet your requirements.

Default StorageClass

You can choose one of the following default StorageClasses and reference its name in the storageClassName field of your application.

Storageclass name

Provisioned disk type

alicloud-disk-topology-alltype (Recommended)

This StorageClass schedules the Pod before creating the Cloud Disk, which prevents mount failures due to availability zone mismatches (volumeBindingMode: WaitForFirstConsumer). The system considers the node's availability zone and instance type, along with available Cloud Disk inventory, and attempts to create a disk in the following order: ESSD, SSD cloud disk, and ultra disk. By default, it prioritizes the creation of an ESSD PL1 disk with a minimum capacity of 20 GiB.

alicloud-disk-essd

Provisions an ESSD. The default performance level is PL1, and the minimum disk capacity is 20 GiB.

Important

ESSDs in a Cloud Box only support the PL0 performance level. You must manually create a StorageClass and specify performanceLevel as PL0.

alicloud-disk-ssd

Provisions an SSD cloud disk. The minimum disk capacity is 20 GiB.

alicloud-disk-efficiency

Provisions an ultra disk. The minimum disk capacity is 20 GiB.

You can run kubectl describe sc <storageclass-name> to view the detailed configuration of a StorageClass.

Manual creation

Kubectl

  1. Create a file named disk-sc.yaml.

    The following example shows a StorageClass that uses volumeBindingMode: WaitForFirstConsumer to delay PV binding.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      # Name of the StorageClass
      name: alicloud-disk-wait-for-first-consumer
    # Provisioner. This must be set to this value when using the Alibaba Cloud Disk CSI plug-in.
    provisioner: diskplugin.csi.alibabacloud.com
    parameters:
      # Cloud Disk type. The system attempts to create a disk in the specified order.
      type: cloud_auto,cloud_essd,cloud_ssd  
      # File system type
      fstype: ext4
      diskTags: "a:b,b:c"
      encrypted: "false"
      # Performance level for the ESSD
      performanceLevel: PL1 
      provisionedIops: "40000"
      burstingEnabled: "false"
    # Volume binding mode. WaitForFirstConsumer is recommended for multi-AZ scenarios.
    volumeBindingMode: WaitForFirstConsumer
    # Reclaim policy
    reclaimPolicy: Retain
    # Whether to allow volume expansion
    allowVolumeExpansion: true
    # Topology restrictions: Restricts disk creation to the specified availability zones.
    allowedTopologies:
    - matchLabelExpressions:
      - key: topology.diskplugin.csi.alibabacloud.com/zone
        values:
        # Replace with your availability zones
        - cn-hangzhou-i
        - cn-hangzhou-k

    The following table describes the main parameters.

    Parameter

    Description

    provisioner

    The provisioner. This required parameter must be set to diskplugin.csi.alibabacloud.com when using the Alibaba Cloud Disk CSI plug-in.

    parameters

    type

    The Cloud Disk type. This is a required parameter. Valid values include:

    You can specify a comma-separated list of types, for example, type: cloud_ssd,cloud_essd,cloud_auto. The system attempts to create a disk in the specified order. The final disk type depends on factors like the node's instance type and the disk types available in the availability zone.

    resourceGroupId

    The resource group for the Cloud Disk. Default: "".

    regionId

    The region of the Cloud Disk, which must be the same as the cluster's region.

    fstype

    The file system for the Cloud Disk. Valid values: ext4 (default) and xfs.

    mkfsOptions

    Formatting options for the Cloud Disk, for example, mkfsOptions: "-O project,quota".

    diskTags

    Tags for the Cloud Disk. For example, diskTags: "a:b,b:c". You can also use the format diskTags/a: b. Requires CSI component version v1.30.3 or later.

    encrypted

    Specifies whether to encrypt the Cloud Disk. Default: false.

    performanceLevel

    The performance level of the ESSD. Valid values are PL0, PL1 (default), PL2, and PL3.

    When used with a Cloud Box, this must be set to PL0.

    volumeExpandAutoSnapshot (Deprecated)

    Deprecated since CSI version 1.31.4.

    provisionedIops

    Sets the provisioned IOPS for an ESSD AutoPL cloud disk.

    burstingEnabled

    For an ESSD AutoPL cloud disk, specifies whether to enable burst. Default: false.

    multiAttach

    Specifies whether to enable the multi-attach feature for the Cloud Disk. Default: false.

    volumeBindingMode

    The volume binding mode for the Cloud Disk. Valid values:

    • Immediate (default): Creates the Cloud Disk before creating the Pod.

    • WaitForFirstConsumer: Delays binding. Schedules the Pod first, then creates the Cloud Disk in the Pod's availability zone.

      In multi-AZ clusters, WaitForFirstConsumer is recommended to prevent mount failures that can occur if a Cloud Disk and its node are in different availability zones.

      If you need to schedule Pods to virtual nodes, using a StorageClass of type WaitForFirstConsumer is not supported with certain scheduling methods or specific annotations. For more information, see What do I do if a PVC remains in the Pending state when a Pod with a Cloud Disk is scheduled to a virtual node?.

    reclaimPolicy

    The reclaim policy for the Cloud Disk.

    • Delete (default): When the PVC is deleted, the PV and the underlying Cloud Disk are also deleted.

    • Retain: When the PVC is deleted, the PV and the underlying Cloud Disk are retained.

      To prevent accidental data loss, we recommend using the Retain policy.

    allowVolumeExpansion

    If set to true, allows online expansion of Cloud Disks.

    allowedTopologies

    Restricts the Cloud Disk to be provisioned only in specific topological domains.

    • key: The topology domain label. Supported values include:

      • topology.diskplugin.csi.alibabacloud.com/zone: A dedicated topology key provided by the Alibaba Cloud CSI plug-in.

      • alibabacloud.com/ecs-instance-id: When using an elastic ephemeral disk, you can use this to specify a node.

    • values: A list containing availability zone or node IDs.

  2. Create the StorageClass.

    kubectl create -f disk-sc.yaml
  3. Verify the StorageClass.

    kubectl get sc

    The output shows that the StorageClass was created with the WaitForFirstConsumer binding mode.

    NAME                                    PROVISIONER                       RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
    alicloud-disk-wait-for-first-consumer   diskplugin.csi.alibabacloud.com   Retain          WaitForFirstConsumer   true                   10s

Console

  1. On the ACK Clusters page, click the name of your cluster. In the left navigation pane, click Volumes > StorageClasses.

  2. Click Create, select Cloud Disk as the Volume Type, configure the parameters, and then click Create.

    Parameter

    Description

    Parameters

    • Default parameter: type.

      The Cloud Disk type. This is a required parameter. Valid values include:

      You can specify a comma-separated list of types, for example, type: cloud_ssd,cloud_essd,cloud_auto. The system attempts to create a disk in the specified order. The final disk type depends on factors like the node's instance type and the disk types available in the availability zone.

    • Show Optional Parameters

      • resourceGroupId: The resource group for the Cloud Disk. Default: "".

      • regionId: The region of the Cloud Disk, which must be the same as the cluster's region.

      • fstype: The file system for the Cloud Disk. Valid values: ext4 (default) and xfs.

      • mkfsOptions: Formatting options for the Cloud Disk, for example, mkfsOptions: "-O project,quota".

      • diskTags: Tags for the Cloud Disk. For example, diskTags: "a:b,b:c". You can also use the format diskTags/a: b. Requires CSI component version v1.30.3 or later.

      • encrypted: Specifies whether to encrypt the Cloud Disk. Default: false.

      • performanceLevel: The performance level of the ESSD. Valid values are PL0, PL1 (default), PL2, and PL3.

        When used with a Cloud Box, this must be set to PL0.
      • provisionedIops: Sets the provisioned IOPS for an ESSD AutoPL cloud disk.

      • burstingEnabled: For an ESSD AutoPL cloud disk, specifies whether to enable burst. Default: false.

      • multiAttach: Specifies whether to enable the multi-attach feature for the Cloud Disk. Default: false.

    Reclaim policy

    The reclaim policy for the Cloud Disk.

    • Delete (default): When the PVC is deleted, the PV and the underlying Cloud Disk are also deleted.

    • Retain: When the PVC is deleted, the PV and the underlying Cloud Disk are retained.

      To prevent accidental data loss, we recommend using the Retain policy.

    Binding Mode

    The volume binding mode for the Cloud Disk. Valid values:

    • Immediate (default): Creates the Cloud Disk before creating the Pod.

    • WaitForFirstConsumer: Delays binding. Schedules the Pod first, then creates the Cloud Disk in the Pod's availability zone.

      In multi-AZ clusters, WaitForFirstConsumer is recommended to prevent mount failures that can occur if a Cloud Disk and its node are in different availability zones.

      If you need to schedule Pods to virtual nodes, using a StorageClass of type WaitForFirstConsumer is not supported with certain scheduling methods or specific annotations. For more information, see What do I do if a PVC remains in the Pending state when a Pod with a Cloud Disk is scheduled to a virtual node?.

    The new StorageClass appears on the StorageClasses page.

Step 2: Create an application with a cloud disk

This section uses a StatefulSet as an example to show how to mount a Cloud Disk volume.

Important

A Cloud Disk provides non-shared storage and, unless multi-attach is enabled, can be mounted to only one Pod at a time. Sharing a PVC in a multi-replica Deployment can prevent new Pods from starting if the Cloud Disk is already in use by another Pod.

If you still need to use a Cloud Disk with a Deployment, consider using a Cloud Disk as an ephemeral volume. To enable multi-attach, see Use NVMe-based Cloud Disks with multi-attach and reservation.

  1. Create a file named statefulset.yaml.

    The following example creates a StatefulSet with two Pods. It uses volumeClaimTemplates to automatically create and bind an independent persistent volume for each Pod.
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      serviceName: "nginx"
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          # We recommend configuring the following securityContext to optimize mount performance.
          securityContext:
            fsGroup: 1000
            fsGroupChangePolicy: "OnRootMismatch"
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
            volumeMounts:
            # Mount the data volume to the /data directory in the container.
            # The name must match metadata.name defined in volumeClaimTemplates.
            - name: pvc-disk
              mountPath: /data
      # Define the PVC template.
      volumeClaimTemplates:
      - metadata:
          name: pvc-disk
        spec:
          # Access mode
          accessModes: [ "ReadWriteOnce" ]
          # Associate with the StorageClass created earlier.
          storageClassName: "alicloud-disk-wait-for-first-consumer"
          resources:
            requests:
              # Requested storage capacity, which is the size of the Cloud Disk.
              storage: 20Gi
    Important

    When you configure securityContext.fsgroup, the kubelet recursively changes file permissions (chmod/chown) when mounting a volume. This can significantly increase mount time for volumes with many files.

    For clusters of version 1.20 or later, we recommend setting fsGroupChangePolicy to OnRootMismatch. This optimizes mount performance by only performing the recursive permission change when the volume is first mounted and the root directory permissions do not match. If performance remains an issue or you require more granular permission control, use an initContainer to manage permissions before the application container starts.

  2. Create the StatefulSet.

    kubectl create -f statefulset.yaml
  3. Verify that the Pods are running.

    kubectl get pod -l app=nginx
  4. Verify that the Cloud Disk is mounted.

    In this example, the Pod is named web-1. Replace it with your actual Pod name.
    kubectl exec web-1 -- df -h /data

    Expected output:

    Filesystem      Size  Used Avail Use% Mounted on
    /dev/vdb         20G   24K   20G   1% /data

Step 3: Verify persistent storage

To verify that data on the cloud disk is persistent, you will write data to the disk, delete the Pod, and then check that the data persists after the Pod is recreated.

  1. Write test data to the Pod.

    In the web-1 Pod, create a file named test in the /data directory, which is the mount point for the cloud disk.

    kubectl exec web-1 -- touch /data/test
    kubectl exec web-1 -- ls /data

    Expected output:

    lost+found
    test
  2. Simulate a Pod failure by deleting the Pod.

    kubectl delete pod web-1

    Run kubectl get pod -l app=nginx again. A new Pod with the same name, web-1, is automatically created.

  3. Verify the data in the new Pod.

    In the new web-1 Pod, check the /data directory again.

    kubectl exec web-1 -- ls /data

    The output confirms that the test file still exists. This demonstrates that persistent storage preserves the data, even after the Pod is deleted and recreated.

    lost+found
    test

Production deployment

  • High availability

    • Cloud disk selection

      Evaluate factors such as performance, billing, availability zones, and instance type families to ensure your pods are scheduled to compatible nodes.

      When you select a cloud disk type, note that SSD cloud disks and Ultra cloud disks are being phased out. We recommend using ESSD PL0 cloud disks or ESSD Entry cloud disks to replace Ultra cloud disks, and ESSD AutoPL cloud disks to replace SSD cloud disks.

    • Cross-AZ disaster recovery

      • Application-level disaster recovery: For critical workloads such as databases, deploy application instances across multiple availability zones and use the application's native data synchronization mechanism for high availability.

      • Storage-level disaster recovery: Choose a cloud disk type that supports multi-AZ disaster recovery. This feature writes data synchronously to different availability zones within the same region, enabling cross-AZ failover. For more information, see Use ESSD Co-located Redundant Disks.

  • Data security and backup

    • Preventing accidental data deletion:

      To prevent data loss, set the reclaimPolicy of the StorageClass to Retain. This ensures the underlying cloud disk is retained when the PVC is deleted, which simplifies data recovery.

    • Regular backups

      Dynamic volumes simplify resource provisioning but do not replace data backups. For critical workloads, use Backup Center to back up and restore your data.

    • Encryption at rest: For applications that handle sensitive data, configure encrypted: "true" in the StorageClass to encrypt cloud disks.

  • Performance and cost optimization

Billing

Cloud disks that are dynamically provisioned by a StorageClass use pay-as-you-go billing. For more information, see block storage billing and block storage pricing.

Clean up resources

To prevent unexpected charges and ensure data security, follow these steps to release unused resources.

  1. Delete the workload

    • Action: Delete all applications using the associated PersistentVolumeClaim (PVC), such as Deployments and StatefulSets. This stops the running Pods and unmounts the associated volumes.

      Example command: kubectl delete deployment <your-deployment-name>

  2. Delete the PVC

    • Action: Delete the PVC associated with your application. The reclaimPolicy of the StorageClass determines the release of the bound PersistentVolume (PV) and underlying cloud disk.

      • Delete: If the policy is Delete, deleting the PVC also deletes its bound PV and the underlying cloud disk. This action is irreversible. Proceed with caution.

        To prevent accidental data loss, you can create an automatic snapshot policy to back up the cloud disk before deletion.
      • Retain: If the policy is Retain, deleting the PVC changes the status of its bound PV to Released, but the PV object and the underlying cloud disk are retained. If you no longer need the cloud disk and its data, follow the instructions in Release a cloud disk to delete it. This action is irreversible. Proceed with caution.

      Example command: kubectl delete pvc <your-pvc-name>

  3. Delete Kubernetes storage resource definitions. This action removes only the resource definitions from the cluster and does not delete the underlying cloud disk.

    • Delete the PV

      • Action: You can manually delete the resource definition for a PV in the Released state.

      • Example command: kubectl delete pv <your-pv-name>

    • Delete the StorageClass

      • Action: If you no longer need this type of storage, you can delete the corresponding StorageClass.

      • Example command: kubectl delete sc <your-storageclass-name>

FAQ

PVC stuck in Pending state when scheduled to a virtual node

This issue can occur if you use a StorageClass that does not support scheduling to virtual nodes. When a pod is scheduled to a virtual node using specific labels or annotations, you cannot use a StorageClass configured with volumeBindingMode: WaitForFirstConsumer.

  • Reason:
    The WaitForFirstConsumer mode relies on the kube-scheduler to select a physical node for a Pod. This selection determines the availability zone, and a cloud disk is then created in that availability zone. However, the scheduling mechanism for virtual nodes does not follow this process. This prevents the CSI from obtaining the availability zone information, which in turn prevents the PV from being created, leaving the PVC in the Pending state.

  • If you encounter this issue, check whether your pod or its namespace has any of the following configurations:

    • Label:

      • alibabacloud.com/eci: "true": Schedules the pod to run on ECI.

      • alibabacloud.com/acs: "true": Schedules the pod to an ACS pod.

    • Node pinning:

      • Setting spec.nodeName to a node name with the virtual-kubelet prefix pins the pod to that node.

    • Annotation:

      • k8s.aliyun.com/eci-vswitch: Specifies the vSwitch for the ECI pod.

      • k8s.aliyun.com/eci-fail-strategy: "fail-fast": Sets the failure strategy for the ECI pod to fail-fast.

Mount a cloud disk for a single pod or single-replica deployment

For simple applications that do not require multi-replica scaling or stable network identifiers, you can manually create a PersistentVolumeClaim and mount it to a pod or a Deployment for persistent storage.

The workflow is as follows: Choose a StorageClass -> Create a PersistentVolumeClaim -> Mount the PersistentVolumeClaim in your application.

  1. Prepare a StorageClass.

  2. Create a PersistentVolumeClaim to request storage resources.

    kubectl

    1. Create a file named disk-pvc.yaml.

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: disk-pvc
      spec:
        # Access mode
        accessModes:
        - ReadWriteOnce
        volumeMode: Filesystem
        resources:
          requests:
            # Requested storage capacity, which is the size of the cloud disk
            storage: 20Gi
        # Associate with the StorageClass created earlier
        storageClassName: alicloud-disk-topology-alltype 

      The following table describes the parameters.

      Parameter

      Description

      accessModes

      The access modes of the volume. Valid values are ReadWriteOnce, ReadOnlyMany, and ReadWriteMany. The supported access modes depend on the multiAttach setting in the StorageClass and the volumeMode setting in the PersistentVolumeClaim.

      multiAttach specifies whether to enable cloud disk multi-attach. The default value is false, which means the feature is disabled.
      • When multiAttach is false and volumeMode is set to any value, the only supported access mode is ReadWriteOnce.

      • When multiAttach is true and volumeMode is Filesystem, the supported access modes are ReadWriteOnce and ReadOnlyMany.

      • When multiAttach is set to true and volumeMode is set to Block, all three access modes are supported.

      Important

      In this scenario, the access mode is typically ReadWriteOnce (RWO), which means that it can be mounted by only one Pod at a time. Therefore, the number of Deployment replicas cannot be greater than 1. If you attempt to scale out, new Pods will remain in the Pending state because they cannot mount the cloud disk that is already in use.

      volumeMode

      The mode of the volume. Valid values:

      • Filesystem (default): The volume is formatted and mounted as a directory.

      • Block: The volume is provided to the pod as a raw, unformatted block device.

      storage

      The requested storage capacity. Different cloud disk types have different capacity ranges. Ensure that the value of storage is within the capacity limits of the cloud disk type that corresponds to the referenced StorageClass to prevent cloud disk creation failure.

      storageClassName

      The name of the StorageClass to use for this claim.

    2. Create the PersistentVolumeClaim.

      kubectl create -f disk-pvc.yaml
    3. Check the PersistentVolumeClaim.

      kubectl get pvc

      In the output, because the StorageClass uses the WaitForFirstConsumer mode, the PVC is in the Pending state until the first Pod that uses it is successfully scheduled.

      NAME       STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS                            VOLUMEATTRIBUTESCLASS   AGE
      disk-pvc   Pending                                      alicloud-disk-wait-for-first-consumer   <unset>                 14s

    Console

    1. In the left navigation pane of the cluster management page, choose Volumes > Persistent Volume Claims.

    2. On the Persistent Volume Claims page, click Create. Select Cloud Disk as the PVC Type and configure the parameters as prompted.

      Parameter

      Description

      Allocation Mode

      Select Use StorageClass.

      Existing Storage Class

      Select a default or manually created StorageClass.

      Capacity

      The requested storage capacity. Different cloud disk types have different capacity ranges. Ensure that the value of storage is within the capacity limits of the cloud disk type that corresponds to the referenced StorageClass to prevent cloud disk creation failure.

      Access Mode

      This scenario supports only ReadWriteOnce, which means a single pod can mount the volume with read-write access.

      After creating the PersistentVolumeClaim, you can view it on the Persistent Volume Claims page.

  3. Mount the PersistentVolumeClaim in your application.

    1. Create a file named disk-deployment.yaml.

      Expand to view example YAML

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: single-pod-app
      spec:
        # Ensure the replica count is 1
        replicas: 1
        selector:
          matchLabels:
            app: nginx-single
        template:
          metadata:
            labels:
              app: nginx-single
          spec:
            containers:
            - name: nginx
              image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
              ports:
              - containerPort: 80
              # Define the mount point in the container
              volumeMounts:
              - name: my-persistent-storage  # Must match the name defined in volumes below
                mountPath: /data  # Mount to the /data directory in the container
            # Declare and reference the PVC at the pod level
            volumes:
            - name: my-persistent-storage # Volume to be referenced by the container
              persistentVolumeClaim:
                claimName: disk-pvc # Reference the PVC created earlier
    2. Deploy the Deployment.

      kubectl create -f disk-deployment.yaml
  4. Verify the mount result.

    1. Confirm that the pod is running.

      kubectl get pods -l app=nginx-single
    2. Connect to the pod and verify that the cloud disk is mounted to the /data directory.

      # Get the pod name
      POD_NAME=$(kubectl get pods -l app=nginx-single -o jsonpath='{.items[0].metadata.name}')
      
      # Run the df -h command on the mount point
      kubectl exec $POD_NAME -- df -h /data

      The following output indicates that the 20 GiB cloud disk is successfully mounted.

      Filesystem      Size  Used Avail Use% Mounted on
      /dev/vdb         20G   24K   20G   1% /data

References