จำกัดขนาดของ Storage ที่ใช้ใน Namespace
Tags: kubernetes, persistentvolumeclaim, limtrange, resourcequota
Published: 2021-01-24 17:55:41

ผมเขียนเรื่อง ["จำกัดขนาดของ PersistentVolumeClaim ไม่ให้เกินกว่าที่กำหนด"](https://damrongs.medium.com/%E0%B8%88%E0%B8%B3%E0%B8%81%E0%B8%B1%E0%B8%94%E0%B8%82%E0%B8%99%E0%B8%B2%E0%B8%94%E0%B8%82%E0%B8%AD%E0%B8%87-persistentvolumeclaim-%E0%B9%84%E0%B8%A1%E0%B9%88%E0%B9%83%E0%B8%AB%E0%B9%89%E0%B9%80%E0%B8%81%E0%B8%B4%E0%B8%99%E0%B8%81%E0%B8%A7%E0%B9%88%E0%B8%B2%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%81%E0%B8%B3%E0%B8%AB%E0%B8%99%E0%B8%94-28f2b790c203) ที่สามารถกำหนดขนาดของการสร้าง Persistent Volume Claim ไม่ให้มีขนาดใหญ่เกินกว่าที่กำหนด หรือไม่ให้เล็กกว่าที่กำหนดได้ด้วย Kubernetes Object ที่ชื่อว่า LimitRange ... ก็คิดต่อว่า ถ้าผู้ใช้งานสร้าง PersistentVolumeClaim จำนวนมากล่ะ !!! การใช้ storage ก็อาจจะเกินความจำเป็นในการใช้งาน  หรือไม่ก็อาจจะทำให้ Persistent Volume ไม่เพียงพอสำครับผู้ใช้งานทุกคน
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/tqkipg4pyv3xvo594c8f.png)
ยังมี Kubernetes Object อีกชนิดที่สามารถจำกัดทั้งจำนวนและขนาด PersistentVolumeClaim รวมแต่ละ namespace ได้ สามารถใช้ ResourceQouta จำกัดจำนวนและขนาด PersistentVolumeClaim ที่สามารถสร้างได้ใน Namespace นั้น ๆ หน้าตาของ ResourceQuota ที่สามารถจำกัดจำนวนนวนและขนาดของ storage ใน Namespace คงประมาณนี้ ...   
```yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: max-storage
  namepsace: default
spec:
  hard:
    persistentvolumeclaims: "3"
    requests.storage: "6Gi"
```
> ถ้าสร้าง ResourceQuota ตาม YAML ทางด้านบน ผลที่ได้ ผู้ใช้ทุกคนที่จะสร้าง storage ใน Namespace default จะสร้าง PersistentVolumeClaim ได้ไม่เกิน 3 PersistentVolumeClaim หรือ มีขนาดรวมกันได้ไม่เกิน 6 GB
```
]# kubectl apply -f storage-resourcequota.yaml
resourcequota/max-storage created

]# kubectl get resourcequotas
NAME          AGE   REQUEST                                                LIMIT
max-storage   41s   persistentvolumeclaims: 0/3, requests.storage: 0/6Gi
```
**ทดสอบ ร้องขอ PersistentVolumeClaim ที่มีขนาด 10 GB** พบว่าไม่สามารถสร้างได้ และมีข้อความแสดงว่า ไม่สามารถสร้างได้เพราะเกินโควต้า `Error from server (Forbidden): error when creating "pvc10G.yaml": persistentvolumeclaims "pvc-10g" is forbidden: exceeded quota: max-storage, requested: requests.storage=10Gi, used: requests.storage=0, limited: requests.storage=6G`
```
]# kubectl apply -f pvc10G.yaml 
Error from server (Forbidden): error when creating "pvc10G.yaml": persistentvolumeclaims "pvc-10g" is forbidden: exceeded quota: max-storage, requested: requests.storage=10Gi, used: requests.storage=0, limited: requests.storage=6G
```
**ทดสอบ ร้องขอ PersistentVolumeClaim ที่มีขนาด 1 GB ตัวที่ 4** พบว่าไม่สามารถสร้างได้ และมีข้อความแสดงว่า ไม่สามารถสร้างได้เพราะเกินโควต้า `rror from server (Forbidden): error when creating "pvc1G.yaml": persistentvolumeclaims "pvc-1g" is forbidden: exceeded quota: max-storage, requested: persistentvolumeclaims=1, used: persistentvolumeclaims=3, limited: persistentvolumeclaims=3`
```
]# kubectl get persistentvolumeclaim
NAME       STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-1g-1   Bound    data1    1Gi        RWO            slow           3m33s
pvc-1g-2   Bound    data0    1Gi        RWO            slow           3m28s
pvc-1g-3   Bound    data2    2Gi        RWO            slow           3m25s

]# kubectl apply -f pvc1G.yaml
Error from server (Forbidden): error when creating "pvc1G.yaml": persistentvolumeclaims "pvc-1g" is forbidden: exceeded quota: max-storage, requested: persistentvolumeclaims=1, used: persistentvolumeclaims=3, limited: persistentvolumeclaims=3
```
พบว่า ​​​ResourceQuota สามารถจำกัดจำนวนและขนาด PersistentVolumeClaim รวมแต่ละ namespace ได้ ถ้านำมาประยุกต์ใช้ร่วมกับ LimitRange ที่จำกัดขนาดของการสร้าง PersistentVolumeClaim ไม่ให้มีขนาดใหญ่เกินกว่าที่กำหนด หรือไม่ให้เล็กกว่าที่กำหนดเป็นราย PersistentVolumeClaim สามารถช่วยให้ Kubernetes Administrator บริการจัดการ storage ใน Kubernetes Administrator ได้อย่างมีประสิทธิภาพ

#มูลค่าความสุข