如何对PV/PVC设置存储使用硬限制?
如何对PV/PVC设置实际存储使用的硬限制?
场景回顾
- 同一节点上两个Deployment,各使用独立PV/PVC:Pod1申请10Gi,Pod2申请15Gi
- 节点预留的存储卷可用空间为25Gi
- StorageClass由Rancher提供,PV的volumeMode为Filesystem
需求:限制Pod1最多使用10Gi持久卷空间,超量时允许Pod被驱逐
可行解决方案
1. 借助Rancher存储供应方的动态配额配置
如果使用Rancher自带的存储插件(比如Local Path Provisioner),可以在StorageClass中配置参数,让动态创建的PV自动带上文件系统级别的容量限制:
- 编辑StorageClass,在
parameters中添加存储配额相关参数,例如针对Local Path Provisioner:apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: rancher-local-path provisioner: rancher.io/local-path parameters: sizeLimit: "10Gi" # 对应PVC申请的容量,动态创建PV时自动设置配额 volumeBindingMode: WaitForFirstConsumer - 原理:存储供应方会在创建PV时对底层文件系统设置配额,当Pod写入超量时,会触发文件系统空间不足错误,进而导致Pod被驱逐(取决于应用的错误处理逻辑)。
2. 手动配置文件系统组配额
针对已存在的PV,可以直接在节点的存储卷上配置用户组配额:
- 找到PV在节点上的挂载路径:通常位于
/var/lib/kubelet/pods/<Pod-ID>/volumes/kubernetes.io~<存储类型>/<PV名称> - 确保底层文件系统已启用配额功能:
- 对于ext4:挂载时添加
usrquota,grpquota参数(需重新挂载存储卷) - 对于xfs:启用项目配额(需执行
xfs_quota -x -c 'project -s <项目ID>')
- 对于ext4:挂载时添加
- 给Pod的
fsGroup设置配额:- 先在Pod的
spec.securityContext中指定fsGroup,例如:securityContext: fsGroup: 1000 - 在节点的PV挂载点执行配额设置命令:
(注:10737418240字节等于10Gi,软限制和硬限制设为相同值)setquota -g 1000 10737418240 10737418240 /path/to/pv/mount
- 先在Pod的
- 效果:Pod以指定组身份写入数据时,超过配额会被阻止,写入失败可能导致Pod重启或被驱逐。
3. 利用CSI驱动的容量限制功能
如果Rancher使用的存储插件基于CSI实现且支持容量监控,可以通过PVC的resources.limits.storage配置强制限制:
- 编辑PVC,添加存储限制:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pod1-pvc spec: resources: requests: storage: 10Gi limits: storage: 10Gi # 设置硬限制 storageClassName: rancher-csi-storage accessModes: - ReadWriteOnce - 注意:该功能需要CSI驱动本身支持,需确认Rancher对应的存储插件是否具备此能力。
关键注意事项
- 不同存储供应方的实现逻辑不同,需参考Rancher对应存储插件的官方文档;
- 文件系统级别的配额是最可靠的硬限制方式,不受Pod重启或重建影响;
- 手动配置配额时,需避免影响节点上其他PV的正常使用。
内容的提问来源于stack exchange,提问作者bulmust
相关产品推荐
相关产品推荐

