QuotaPath数据卷

您可以在本地盘上通过文件系统(如Ext4)的ProjectQuota功能,实现目录级别的容量Quota控制,通过CSI插件实现QuotaPath数据卷的切分、限额、挂载等生命周期管理。本文介绍如何使用QuotaPath数据卷。

前提条件

已部署LVM CSI插件。具体操作,请参见步骤二:部署Plugin和Provisioner组件

QuotaPath与HostPath、LVM的区别

使用HostPath、LVM、QuotaPath都可以实现Pod对主机存储空间的访问,但其各具特点:

  • HostPath将目录进行切分,多个目录间共享相同存储设备的空间、IO等资源。

  • LVM将设备进行虚拟化,然后切分成多个卷,每个卷都独立拥有存储限额。

  • QuotaPath使用文件系统的Quota功能,将目录进行切分,每个目录拥有独立的存储限额。

功能介绍

  • QuotaPath数据卷生命周期管理:自动创建、删除、挂载、卸载。

  • QuotaPath数据卷扩容功能。

  • 节点本地存储管理:自动运维QuotaPath根目录。

  • QuotaPath卷的集群容量感知能力。

注意事项

  • QuotaPath为本地存储类型,不适用于高可用数据场景。

  • QuotaPath根目录运维、本地存储容量感知为可选项(暂缓提供)。

  • 若使用Root特权模式启动容器,则Quota限制不会生效(Ext4特性)。

使用QuotaPath示例

使用CSI-Provisioner自动创建PV,有以下特点:

  • StorageClass中需要指定rootPath名字。

  • 如果期望创建的PV在某个节点,需要给PVC添加Label:volume.kubernetes.io/selected-node: nodeName

  1. 创建StorageClass。

    1. 使用以下内容创建alicloud-local-quota.yaml文件。

      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: alicloud-local-quota
      parameters:
        volumeType: QuotaPath
        rootPath: /mnt/quota
      provisioner: localplugin.csi.alibabacloud.com
      reclaimPolicy: Delete
      allowVolumeExpansion: true
      volumeBindingMode: WaitForFirstConsumer

      参数

      描述

      volumeType

      本地存储类型,本示例中存储类型为QuotaPath。

      rootPath

      可选,表示QuotaPath所在目录名称。

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

      kubectl create -f alicloud-local-quota.yaml
  2. 创建PVC。

    1. 使用以下内容创建csi-quota.yaml文件。

      默认CSI插件会使用/mnt/quotapath.namespacex.x作为QuotaPath的根目录,所有的PV都将在这个目录下面分配并创建子目录。

      可以在PVC上添加以下Annotation,用来自定义QuotaPath父目录volume.kubernetes.io/selected-storage: /mnt/xxx

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: csi-quota
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 2Gi
        storageClassName: alicloud-local-quota
    2. 执行以下命令创建PVC。

      kubectl create -f csi-quota.yaml
  3. 使用以下模板创建应用。

    1. 使用以下内容创建web-quota.yaml文件。

      apiVersion: v1
      kind: Service
      metadata:
        name: nginx
        labels:
          app: nginx
      spec:
        ports:
        - port: 80
          name: web
        selector:
          app: nginx
      ---
      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: web-quota
      spec:
        selector:
          matchLabels:
            app: nginx
        serviceName: "nginx"
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx
              volumeMounts:
              - name: disk-ssd
                mountPath: /data
            volumes:
              - name: "disk-ssd"
                persistentVolumeClaim:
                  claimName: csi-quota
    2. 执行以下命令创建应用。

      kubectl create -f web-quota.yaml
  4. 查看应用状态。

    执行以下命令查看Pod信息。

    kubectl get pod |grep quota

    预期输出:

    NAME          READY   STATUS    RESTARTS   AGE
    web-quota-0   1/1     Running   0          16s

    执行以下命令查看PVC信息。

    kubectl get pvc

    预期输出:

    NAME        STATUS   VOLUME                CAPACITY   ACCESS MODES   STORAGECLASS           AGE
    csi-quota   Bound    local-f4b129a5-****   2Gi        RWO            alicloud-local-quota   48s

    执行以下命令查看PV信息。

    kubectl get pv |grep quota

    预期输出:

    NAME                  CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS           REASON   AGE
    local-f4b129a5-****   2Gi        RWO            Delete           Bound    default/csi-quota   alicloud-local-quota            66s

    执行以下命令查看Pod挂载详情。

    kubectl exec -ti web-quota-0 sh
    df |grep data

    预期输出:

    Filesystem  1K-blocks  Used Available Use% Mounted on
    /dev/vdd    2097152       4   2097148   1% /data

    执行以下命令列出/data下的目录。

    ls /data

    预期输出:

    lost+found

    执行以下命令在/data下新增test目录并查看。

    touch /data/test
    ls /data

    预期输出:

    lost+found test
  5. 扩容数据卷。

    执行以下命令查看PVC信息。

    kubectl get pvc

    预期输出:

    NAME        STATUS   VOLUME                CAPACITY   ACCESS MODES   STORAGECLASS           AGE
    csi-quota   Bound    local-f4b129a5-****   2Gi        RWO            alicloud-local-quota   42s

    执行以下命令将PVC扩容到3 GiB。

    kubectl patch pvc csi-quota -p '{"spec":{"resources":{"requests":{"storage":"3Gi"}}}}'

    预期输出:

    persistentvolumeclaim/csi-quota patched

    执行以下命令查看PVC信息。

    kubectl get pvc

    预期输出:

    NAME        STATUS   VOLUME                CAPACITY   ACCESS MODES   STORAGECLASS           AGE
    csi-quota   Bound    local-f4b129a5-****   3Gi        RWO            alicloud-local-quota   4m30s

    执行以下命令查看数据卷扩容到3 GiB。

    kubectl exec -ti web-quota-0 sh
    df |grep data

    预期输出:

    Filesystem  1K-blocks  Used Available Use% Mounted on
    /dev/vdd    3145728       4   3145724   1% /data