全部產品
Search
文件中心

Container Service for Kubernetes:QuotaPath資料卷

更新時間:Jun 19, 2024

您可以在本地碟上通過檔案系統(如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