Back

K8s_存储限制

限制存储消耗

本实验展示了如何在一个命名空间里限制存储的消耗。

一,实验目的

1,希望通过限制单个命名空间的存储消耗来控制成本。
2,限制的方面:

  1. 单个命名空间里申请持久卷的数量(PVC 数量);
  2. 每个声明可以请求的存储量;
  3. 一个命名空间里积累的总存储消耗量。

二,实验内容

1, 使用 LimitRange 来限制对存储的请求。样例如下:

  1. 创建 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)
  1. 尝试创建申请内存 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

// 因为申请的内存在合理范围,创建成功
  1. 尝试创建申请内存 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 数目和累计存储容量 。样例如下:

  1. 创建 StorageQuota 类型的 yaml 文件:
apiVersion: v1
kind: ResourceQuota
metadata:
  name: storagequota
spec:
  hard:
    persistentvolumeclaims: "2"
    requests.storage: "2Gi"

// 此处规定了 PVC 的数量不能超过 2 个,且所有 PVC 申请的总内存量不能超过 2Gi
  1. 尝试创建申请内存 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,所有执行失败
  1. 尝试创建两个均申请内存 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 的创建不会成功

总结

  1. LimitRange 和 StorageQuota 的效果是相互叠加的,只要不符合其中一条规则就无法成功创建 pvc 。
  2. 若重新修改 LimitRange.yaml 文件,不影响已存在的但不符合新限制的 pvc 。
  3. 若无特意标明,以上操作均在 default 命名空间里。
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy