Kubernetes Resource Quotas
Introduction
Kubernetes Resource Quotas เป็นฟีเจอร์ที่ช่วยให้คุณสามารถจำกัดการใช้งานทรัพยากรในแต่ละ Namespace ได้ โดยสามารถควบคุมการใช้งาน CPU, Memory, Storage, และทรัพยากรอื่น ๆ ภายใน Kubernetes Cluster การใช้ Resource Quotas ช่วยให้การบริหารจัดการทรัพยากรในคลัสเตอร์มีความยุติธรรมและมีประสิทธิภาพ โดยเฉพาะในกรณีที่มีหลายทีม หรือหลายแอปพลิเคชันที่ทำงานในคลัสเตอร์เดียวกัน
Key Concepts
-
Resource Quota:
- Resource Quota ใช้เพื่อกำหนดขีดจำกัดของการใช้งานทรัพยากรใน Namespace
- การใช้ Resource Quota จะช่วยให้แต่ละทีมหรือแอปพลิเคชันสามารถจำกัดการใช้งานทรัพยากรในระบบ และป้องกันไม่ให้แอปพลิเคชันใด ๆ ใช้ทรัพยากรมากเกินไปจนกระทบกับแอปพลิเคชันอื่น
-
Resource Types:
- คุณสามารถกำหนดขีดจำกัดของทรัพยากรประเภทต่าง ๆ ใน Resource Quotas เช่น:
- CPU: ใช้เพื่อจำกัดการใช้งาน CPU โดยระบุเป็นค่า
cpu(เช่น1,500m) - Memory: ใช้เพื่อจำกัดการใช้งาน Memory โดยระบุเป็นค่า
memory(เช่น1Gi,512Mi) - Storage: ใช้เพื่อจำกัดการใช้ Persistent Volume (PV) โดยระบุเป็น
storage - Pod: ใช้เพื่อจำกัดจำนวน Pod ที่สามารถสร้างใน Namespace
- Service: ใช้เพื่อจำกัดจำนวน Services ใน Namespace
- CPU: ใช้เพื่อจำกัดการใช้งาน CPU โดยระบุเป็นค่า
- คุณสามารถกำหนดขีดจำกัดของทรัพยากรประเภทต่าง ๆ ใน Resource Quotas เช่น:
-
Hard and Soft Limits:
- Hard Limits: เป็นข้อกำหนดที่ไม่สามารถเกินได้ เช่น ขีดจำกัดจำนวน Pod หรือการใช้ CPU
- Soft Limits: เป็นขีดจำกัดที่ Kubernetes สามารถให้การเตือนเมื่อถึงหรือเกินขีดจำกัด แต่จะไม่ปฏิเสธการสร้างทรัพยากร
Creating Resource Quotas
Resource Quota YAML Example
คุณสามารถสร้าง Resource Quota โดยการใช้ไฟล์ YAML ดังนี้:
apiVersion: v1
kind: ResourceQuota
metadata:
name: my-quota
namespace: my-namespace
spec:
hard:
requests.cpu: "4"
requests.memory: 8Gi
limits.cpu: "10"
limits.memory: 16Gi
pods: "10"
services: "5"
persistentvolumeclaims: "5"
configmaps: "10"
secrets: "20"
ในตัวอย่างนี้:
requests.cpu: กำหนดขีดจำกัดของการใช้งาน CPU โดยใช้ค่าrequestsและlimitsสำหรับ CPUrequests.memory: กำหนดขีดจำกัดการใช้งาน Memorypods: จำนวน Pod สูงสุดที่สามารถสร้างใน Namespaceservices: จำนวน Services สูงสุดที่สามารถสร้างใน Namespacepersistentvolumeclaims: จำนวน PVC ที่สามารถสร้างใน Namespaceconfigmaps,secrets: จำนวน ConfigMaps และ Secrets ที่สามารถสร้างใน Namespace
Applying the Resource Quota
หลังจากที่คุณสร้างไฟล์ YAML สำหรับ Resource Quota แล้ว, คุณสามารถนำไปใช้ใน Kubernetes Cluster ได้ด้วยคำสั่ง:
kubectl apply -f resource-quota.yaml
Checking Resource Quota Usage
คุณสามารถตรวจสอบการใช้งาน Resource Quota ใน Namespace ได้ด้วยคำสั่ง:
kubectl get resourcequota -n my-namespace
การใช้คำสั่งนี้จะแสดงข้อมูลเกี่ยวกับการใช้ทรัพยากรใน Namespace ที่คุณเลือก รวมถึงการใช้ CPU, Memory, และทรัพยากรอื่น ๆ
Resource Quotas with LimitRange
LimitRange เป็นอีกหนึ่งทรัพยากรที่ช่วยกำหนดขีดจำกัดการใช้งานทรัพยากรในแต่ละ Pod ใน Namespace เพื่อให้มั่นใจว่า Pod ทุกตัวมีการตั้งค่าขีดจำกัดในการใช้ทรัพยากร
Example of LimitRange
apiVersion: v1
kind: LimitRange
metadata:
name: my-limit-range
namespace: my-namespace
spec:
limits:
- max:
memory: 2Gi
cpu: "2"
min:
memory: 128Mi
cpu: "250m"
type: Container
ในตัวอย่างนี้:
max: กำหนดขีดจำกัดสูงสุดของการใช้ CPU และ Memorymin: กำหนดขีดจำกัดต่ำสุดของการใช้ CPU และ Memorytype: Container: กำหนดขีดจำกัดสำหรับ Container ใน Pod
การใช้ LimitRange และ Resource Quota ร่วมกันช่วยให้คุณสามารถควบคุมทรัพยากรได้ทั้งในระดับ Namespace และระดับ Pod
Best Practices for Resource Quotas
-
Define Quotas Based on Application Needs:
- ตั้งค่าขีดจำกัดที่เหมาะสมกับการใช้งานของแอปพลิเคชันในแต่ละ Namespace เช่น จำนวน Pod, CPU, และ Memory
- คำนึงถึงความต้องการทรัพยากรที่แตกต่างกันระหว่างแอปพลิเคชันที่ทำงานในคลัสเตอร์เดียวกัน
-
Monitor Quota Usage:
- คอยตรวจสอบการใช้ทรัพยากรในแต่ละ Namespace อย่างสม่ำเสมอ เพื่อให้แน่ใจว่าไม่มีการใช้งานเกินขีดจำกัดที่กำหนด
- ใช้เครื่องมือเช่น Prometheus หรือ Grafana ในการติดตามการใช้ทรัพยากรใน Kubernetes
-
Avoid Over-Provisioning:
- อย่ากำหนดขีดจำกัดที่สูงเกินไปเพื่อหลีกเลี่ยงการที่ระบบจะไม่สามารถรองรับการทำงานที่มีประสิทธิภาพได้
- ควรคำนึงถึงการใช้ทรัพยากรของทุกทีมในคลัสเตอร์
-
Set Default Resource Requests and Limits:
- การตั้งค่า default requests และ limits สำหรับ CPU และ Memory ช่วยให้ Pods ทุกตัวมีการตั้งค่าขีดจำกัดทรัพยากรอย่างเหมาะสม
Conclusion
Kubernetes Resource Quotas เป็นเครื่องมือที่มีประสิทธิภาพในการจำกัดและจัดการการใช้ทรัพยากรในคลัสเตอร์ Kubernetes โดยสามารถป้องกันไม่ให้แอปพลิเคชันใดๆ ใช้ทรัพยากรมากเกินไป การใช้ Resource Quotas ร่วมกับ LimitRange จะช่วยให้การควบคุมการใช้งานทรัพยากรทั้งในระดับ Namespace และ Pod เป็นไปอย่างราบรื่นและมีประสิทธิภาพ