CSI组件支持为通用型NAS存储卷的子目录设置配额限制。使用subPath方式挂载NAS子目录时,可启用目录配额功能,限制子目录容量,提升资源利用率。当子目录存储卷达到配额上限时,可通过更新PVC的storage实现在线扩容,无需中断业务。
使用场景
默认情况下,在ACK集群中挂载NAS存储卷时,PVC中声明的storage并不会生效,PV中实际可用的容量为NAS文件系统的所有容量,您可根据NAS文件系统的容量限制确认NAS存储卷实际可用容量。
如您的NAS文件系统被多个应用共享挂载,建议使用subPath方式挂载子目录,并启用目录配额功能。启用后,动态创建的子目录PV容量将受PVC中声明的storage限制。当容量达到上限时,可通过更新PVC的storage来实现在线扩容,无需中断业务。 目录配额功能允许您为不同应用挂载独立子目录并设置容量限制,从而更好地管理NAS文件系统的资源分配,提升管理效率与资源利用率,同时有效控制存储成本。
如果通过CNFS托管NAS,默认已开启目录配额功能。更多信息,请参见使用CNFS自动扩容NAS存储卷。
前提条件
集群中已安装CSI组件,且组件版本为v1.18.8.45及以上。如需升级,请参见升级csi-plugin和csi-provisioner。
已创建NAS文件系统和挂载点,且满足以下条件:
NAS类型为通用型NAS,协议类型为NFS。如不满足,请重新创建通用型NAS文件系统。
挂载点和集群节点在同一VPC内,且状态为可用。如不满足,请重新创建挂载点,具体请参见管理挂载点。
使用限制
仅NFS协议的通用型NAS,且通过subpath方式挂载的NAS动态存储卷支持目录配额功能,NAS静态存储卷,以及通过sharepath或filesystem方式挂载的NAS动态存储卷不支持。
更多关于目录配额功能的限制信息,请参见目录配额。
使用NAS动态存储卷并设置目录配额
步骤一:创建StorageClass并开启目录配额功能
修改以下YAML内容,并保存为alicloud-nas-quota-sc.yaml。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas-quota-sc mountOptions: - nolock,tcp,noresvport - vers=3 parameters: volumeAs: subpath # 此处必须为subpath挂载方式。 server: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com" # NFS协议的通用型NAS的挂载点。 archiveOnDelete: "false" path: "/test" volumeCapacity: "true" # 创建的动态卷支持目录配额功能。 provisioner: nasplugin.csi.alibabacloud.com reclaimPolicy: Delete allowVolumeExpansion: true # 开启目录配额功能,允许动态卷扩容。
说明将
allowVolumeExpansion
或volumeCapacity
配置为true
均可开启目录配额功能。如果allowVolumeExpansion
参数配置为true
,volumeCapacity
的参数配置将不会生效,目录配额会始终开启。需要注意的参数如下,更多信息,请参见使用NAS动态存储卷。
参数
说明
parameters
volumeAs
使用目录配额功能时,必须配置为
subpath
,表示创建子目录类型的PV。server
NAS文件系统的挂载点地址。关于如何查看挂载点地址,请参见管理挂载点。
path
挂载NAS文件系统的子目录,默认为
/
,极速型NAS需要以/share
开头。volumeCapacity
是否开启目录配额功能。
若同时配置了
allowVolumeExpansion
为true
,则该参数配置不会生效,配额会始终开启。allowVolumeExpansion
仅通用型NAS文件系统支持设置此参数。开启时,该StorageClass动态创建的PV将会被设置配额。
创建StorageClass。
kubectl apply -f alicloud-nas-quota-sc.yaml
步骤二:创建应用并挂载NAS存储卷
使用以下YAML内容,创建nas-sts.yaml文件。
以下YAML将创建一个StatefulSet,包含1个Pod,Pod中关联了开启目录配额功能的StorageClass,系统会自动创建对应的NAS动态存储卷并挂载到Pod上,该NAS存储卷的容量为20 GiB。
apiVersion: apps/v1 kind: StatefulSet metadata: name: nas-sts spec: selector: matchLabels: app: nginx replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 volumeMounts: - name: nas-pvc mountPath: /data volumeClaimTemplates: - metadata: name: nas-pvc spec: accessModes: [ "ReadWriteMany" ] storageClassName: "alicloud-nas-quota-sc" resources: requests: storage: 20Gi
创建StatefulSet。
kubectl apply -f nas-sts.yaml
查看StatefulSet中Pod的部署情况。
kubectl get pod -l app=nginx
预期返回:
NAME READY STATUS RESTARTS AGE nas-sts-0 1/1 Running 0 24s
查看PV,并确认目录配额已经生效。
查看PV。
kubectl get pv
预期返回如下,可以已动态创建PV,PV的容量为20 GiB。
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE nas-****-c72c-497f-ab13-****** 20Gi RWX Delete Bound default/nas-pvc-nas-sts-0 alicloud-nas-quota-sc <unset> 15m
在NAS控制台查看目录配额详情。
在NAS控制台的文件系统列表页面,单击目标文件系统对应的操作列下的
,然后单击配额管理。在配额管理页面可以看到已自动生成对应的目录配额,单击管理配额可查看详细信息。
示例如下,可以看到目录的容量限制为20 GiB。
验证目录配额限制
由于以subpath方式挂载的NAS动态存储卷开启了目录配额功能,且声明容量为20 GiB,因此当挂载目录下写入的数据超过20 GiB时,系统会提示磁盘超出配额。
向挂载目录写入数据。
命令示例如下,表示向挂载目录
/data
写入20000 MiB(约19.53 GiB)的数据。kubectl exec -it nas-sts-0 -- dd if=/dev/zero of=/data/20G.txt bs=1M count=20000
等待5~15分钟后,在NAS控制台查看目录配额详情。
在NAS控制台的文件系统列表页面,单击目标文件系统对应的操作列下的
,然后单击配额管理。在配额管理页面,单击目录对应的管理配额可查看详细信息。
示例如下,可以看到目录的当前容量显示为19 GiB。
再次向挂载目录写入数据,使其容量达到目录配额限制,将触发磁盘超出配额的报错。
命令示例如下,向挂载目录
/data
写入1 GiB的数据时,将超出目录配额限制。kubectl exec -it nas-sts-0 -- dd if=/dev/zero of=/data/1G.txt bs=1M count=1024
预期返回如下,提示超出磁盘配额。
dd: closing output file '/data/1G.txt': Disk quota exceeded
说明如需扩容,请参见扩容设置了目录配额的NAS动态存储卷。
扩容设置了目录配额的NAS动态存储卷
通过更新PVC的storage的方式,您可以对动态创建的PV进行容量扩容,并查看目录配额确认NAS存储卷容量是否扩容成功。此扩容操作不影响在线业务,不会中断业务。
查看扩容前的PVC。
kubectl get pvc
预期返回:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE nas-pvc-nas-sts-0 Bound nas-****-c72c-497f-ab13-****** 20Gi RWX alicloud-nas-quota-sc <unset> 23m
修改PVC,扩容NAS存储卷的容量。
kubectl patch pvc nas-pvc-nas-sts-0 -p '{"spec":{"resources":{"requests":{"storage":"30Gi"}}}}'
重要NAS目录配额的单位为GiB,CSI将按照扩容后的PVC容量为NAS目录设置配额,实际设置的容量上限为将PVC容量按GiB单位向上取整后的值。
查看扩容后的PV和PVC。
从返回信息中的
CAPACITY
字段可以确认NAS存储卷对应的目录配额已由20 GiB扩容为30 GiB。查看PV。
kubectl get pv
预期返回:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE nas-****-c72c-497f-ab13-****** 30Gi RWX Delete Bound default/nas-pvc-nas-sts-0 alicloud-nas-quota-sc <unset> 25m
查看PVC。
kubectl get pvc
预期返回:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE nas-pvc-nas-sts-0 Bound nas-****-c72c-497f-ab13-****** 30Gi RWX alicloud-nas-quota-sc <unset> 26m
在NAS控制台查看目录配额详情。
在NAS控制台的文件系统列表页面,单击目标文件系统对应的操作列下的
,然后单击配额管理。在配额管理页面,单击目录对应的管理配额可查看详细信息。
示例如下,可以看到目录的容量限制已扩容到30 GiB。
常见问题
在挂载和使用NAS存储卷的过程中,如果遇到问题,可参考以下文档进行排查。
相关文档
如需了解更多关于NAS目录配额功能的信息,请参见目录配额。
对NAS存储卷设置目录配额后,如需监控NAS存储卷使用情况,您可以通过node_volume_capacity_bytes_used存储指标,参见创建Prometheus告警规则配置告警进行存储容量监控。