您可以在本地盘上通过文件系统(如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