您可以在本地盤上通過文件系統(tǒng)(如Ext4)的ProjectQuota功能,實現(xiàn)目錄級別的容量Quota控制,通過CSI插件實現(xiàn)QuotaPath數(shù)據卷的切分、限額、掛載等生命周期管理。本文介紹如何使用QuotaPath數(shù)據卷。
前提條件
已部署LVM CSI插件。具體操作,請參見步驟二:部署Plugin和Provisioner組件。
QuotaPath與HostPath、LVM的區(qū)別
使用HostPath、LVM、QuotaPath都可以實現(xiàn)Pod對主機存儲空間的訪問,但其各具特點:
HostPath將目錄進行切分,多個目錄間共享相同存儲設備的空間、IO等資源。
LVM將設備進行虛擬化,然后切分成多個卷,每個卷都獨立擁有存儲限額。
QuotaPath使用文件系統(tǒng)的Quota功能,將目錄進行切分,每個目錄擁有獨立的存儲限額。
功能介紹
QuotaPath數(shù)據卷生命周期管理:自動創(chuàng)建、刪除、掛載、卸載。
QuotaPath數(shù)據卷擴容功能。
節(jié)點本地存儲管理:自動運維QuotaPath根目錄。
QuotaPath卷的集群容量感知能力。
注意事項
QuotaPath為本地存儲類型,不適用于高可用數(shù)據場景。
QuotaPath根目錄運維、本地存儲容量感知為可選項(暫緩提供)。
若使用Root特權模式啟動容器,則Quota限制不會生效(Ext4特性)。
使用QuotaPath示例
使用CSI-Provisioner自動創(chuàng)建PV,有以下特點:
StorageClass中需要指定rootPath名字。
如果期望創(chuàng)建的PV在某個節(jié)點,需要給PVC添加Label:volume.kubernetes.io/selected-node: nodeName。
創(chuàng)建StorageClass。
使用以下內容創(chuàng)建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
參數(shù)
描述
volumeType
本地存儲類型,本示例中存儲類型為QuotaPath。
rootPath
可選,表示QuotaPath所在目錄名稱。
執(zhí)行以下命令創(chuàng)建StorageClass。
kubectl create -f alicloud-local-quota.yaml
創(chuàng)建PVC。
使用以下內容創(chuàng)建csi-quota.yaml文件。
默認CSI插件會使用/mnt/quotapath.namespacex.x作為QuotaPath的根目錄,所有的PV都將在這個目錄下面分配并創(chuàng)建子目錄。
可以在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
執(zhí)行以下命令創(chuàng)建PVC。
kubectl create -f csi-quota.yaml
使用以下模板創(chuàng)建應用。
使用以下內容創(chuàng)建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
執(zhí)行以下命令創(chuàng)建應用。
kubectl create -f web-quota.yaml
查看應用狀態(tài)。
執(zhí)行以下命令查看Pod信息。
kubectl get pod |grep quota
預期輸出:
NAME READY STATUS RESTARTS AGE web-quota-0 1/1 Running 0 16s
執(zhí)行以下命令查看PVC信息。
kubectl get pvc
預期輸出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE csi-quota Bound local-f4b129a5-**** 2Gi RWO alicloud-local-quota 48s
執(zhí)行以下命令查看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
執(zhí)行以下命令查看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
執(zhí)行以下命令列出/data下的目錄。
ls /data
預期輸出:
lost+found
執(zhí)行以下命令在/data下新增test目錄并查看。
touch /data/test ls /data
預期輸出:
lost+found test
擴容數(shù)據卷。
執(zhí)行以下命令查看PVC信息。
kubectl get pvc
預期輸出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE csi-quota Bound local-f4b129a5-**** 2Gi RWO alicloud-local-quota 42s
執(zhí)行以下命令將PVC擴容到3 GiB。
kubectl patch pvc csi-quota -p '{"spec":{"resources":{"requests":{"storage":"3Gi"}}}}'
預期輸出:
persistentvolumeclaim/csi-quota patched
執(zhí)行以下命令查看PVC信息。
kubectl get pvc
預期輸出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE csi-quota Bound local-f4b129a5-**** 3Gi RWO alicloud-local-quota 4m30s
執(zhí)行以下命令查看數(shù)據卷擴容到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