限制存储消耗
本实验展示了如何在一个命名空间里限制存储的消耗。
一,实验目的
1,希望通过限制单个命名空间的存储消耗来控制成本。
2,限制的方面:
- 单个命名空间里申请持久卷的数量(PVC 数量);
- 每个声明可以请求的存储量;
- 一个命名空间里积累的总存储消耗量。
二,实验内容
1, 使用 LimitRange 来限制对存储的请求。样例如下:
- 创建 LimitRange 类型的 yaml 文件:
apiVersion: v1
kind: LimitRange
metadata:
name: storagelimits
spec:
limits:
- type: PersistentVolumeClaim
max:
storage: 2Gi
min:
storage: 1Mi
// limits.type 为限制的对象 —— PVC
// 此处的存储请求设置为 x (1Mi < x < 2Gi)
- 尝试创建申请内存 1Gi 的 PVC :
[centos@ml-k8s-1 ~]$ touch pvc1.yaml
[centos@ml-k8s-1 ~]$ vim pvc1.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
[centos@ml-k8s-1 ~]$ kubectl apply -f pvc1.yaml
persistentvolumeclaim/pvc1 created
[centos@ml-k8s-1 ~]$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc1 Bound pvc-a0f522d8-5977-4c72-83bb-d57df46ffec5 1Gi RWX managed-nfs-storage 14s
// 因为申请的内存在合理范围,创建成功
- 尝试创建申请内存 2.2Gi 的 PVC :
[centos@ml-k8s-1 ~]$ vim pvc2.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc2
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2.2Gi
[centos@ml-k8s-1 ~]$ kubectl apply -f pvc2.yaml
Error from server (Forbidden): error when creating "pvc2.yaml": persistentvolumeclaims "pvc2" is forbidden: maximum storage usage per PersistentVolumeClaim is 2Gi, but request is 2362232012800m
// 因为申请的内存超出范围,创建失败
2, 使用 StorageQuota 限制 PVC 数目和累计存储容量 。样例如下:
- 创建 StorageQuota 类型的 yaml 文件:
apiVersion: v1
kind: ResourceQuota
metadata:
name: storagequota
spec:
hard:
persistentvolumeclaims: "2"
requests.storage: "2Gi"
// 此处规定了 PVC 的数量不能超过 2 个,且所有 PVC 申请的总内存量不能超过 2Gi
- 尝试创建申请内存 2Gi 的 PVC :
[centos@ml-k8s-1 ~]$ vim pvc2.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc2
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
[centos@ml-k8s-1 ~]$ kubectl apply -f pvc2.yaml
Error from server (Forbidden): error when creating "pvc2.yaml": persistentvolumeclaims "pvc2" is forbidden: exceeded quota: storagequota, requested: persistentvolumeclaims=1,requests.storage=2Gi, used: persistentvolumeclaims=2,requests.storage=1025Mi, limited: persistentvolumeclaims=2,requests.storage=2Gi
// 以为已经存在的 pvc1 申请了 1Gi 的存储,pvc2 再申请 2Gi 就会超过规定的总存储量 2Gi,所有执行失败
- 尝试创建两个均申请内存 1Mi 的 PVC2 和 PVC3 :
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc2
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Mi
[centos@ml-k8s-1 ~]$ kubectl apply -f pvc2.yaml
persistentvolumeclaim/pvc2 created
[centos@ml-k8s-1 ~]$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc1 Bound pvc-a0f522d8-5977-4c72-83bb-d57df46ffec5 1Gi RWX managed-nfs-storage 2d16h
pvc2 Bound pvc-796555a7-5826-4ce1-9a2c-493cd83e4a0f 1Mi RWX managed-nfs-storage 12s
// pvc2 在合理范围,创建成功,再创建一个 pvc3 如下:
[centos@ml-k8s-1 ~]$ kubectl apply -f pvc3.yaml
Error from server (Forbidden): error when creating "pvc3.yaml": persistentvolumeclaims "pvc3" is forbidden: exceeded quota: storagequota, requested: persistentvolumeclaims=1, used: persistentvolumeclaims=2, limited: persistentvolumeclaims=2
// 因为已存在两个 pvc ,所以 pvc3 的创建不会成功
总结
- LimitRange 和 StorageQuota 的效果是相互叠加的,只要不符合其中一条规则就无法成功创建 pvc 。
- 若重新修改 LimitRange.yaml 文件,不影响已存在的但不符合新限制的 pvc 。
- 若无特意标明,以上操作均在 default 命名空间里。