您可以在本地碟上通過檔案系統(如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。
建立StorageClass。
使用以下內容建立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所在目錄名稱。
執行以下命令建立StorageClass。
kubectl create -f alicloud-local-quota.yaml
建立PVC。
使用以下內容建立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
執行以下命令建立PVC。
kubectl create -f csi-quota.yaml
使用以下模板建立應用。
使用以下內容建立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
執行以下命令建立應用。
kubectl create -f web-quota.yaml
查看應用狀態。
執行以下命令查看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
擴容資料卷。
執行以下命令查看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