تخطَّ إلى المحتوى

QoS و Eviction و Resources

ستتعلم كيف تؤثر requests و limits على scheduling و QoS، ولماذا قد يطرد kubelet بعض Pods عند ضغط memory أو disk.

requests تحدد الموارد التي يحجزها scheduler، وlimits تحدد الحد الأقصى. Kubernetes يصنف Pods إلى QoS classes تؤثر على أولوية الطرد عند ضغط الموارد.

QoSالشرطأولوية الطرد
Guaranteedكل container له CPU و memory request يساوي limitأقل عرضة للطرد
Burstableيوجد request أو limit، لكنها ليست متساويةمتوسط
BestEffortلا توجد requests ولا limitsأكثر عرضة للطرد

guaranteed.yaml:

apiVersion: v1
kind: Pod
metadata:
name: qos-guaranteed
spec:
containers:
- name: app
image: nginx:1.27
resources:
requests:
cpu: "200m"
memory: "128Mi"
limits:
cpu: "200m"
memory: "128Mi"

burstable.yaml:

apiVersion: v1
kind: Pod
metadata:
name: qos-burstable
spec:
containers:
- name: app
image: nginx:1.27
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "256Mi"
Terminal window
kubectl apply -f guaranteed.yaml
kubectl apply -f burstable.yaml
kubectl get pod qos-guaranteed qos-burstable -o custom-columns=NAME:.metadata.name,QOS:.status.qosClass
kubectl describe node

Expected output:

NAME QOS
qos-guaranteed Guaranteed
qos-burstable Burstable

عند ضغط الموارد، kubelet قد يطرد Pods حتى يحافظ على صحة Node. أمثلة على أسباب الضغط:

  • memory متاح قليل.
  • disk space قليل.
  • image filesystem ممتلئ.
  • PID pressure.
نوع التطبيقrequest كبدايةlimit كبداية
API خفيفp50 أو p70 من الاستخدام2x إلى 4x حسب السلوك
worker متغيرrequest واقعي للحد الأدنىlimit يحمي Node من spike خطير
databaseلا تخمن، استخدم قياسات وتوصيات المنتجتجنب memory limit ضيق

Lab: مقارنة QoS classes

المستوى: مبتدئ الوقت: 25 دقيقة الأدوات: kubectl

الهدف: إنشاء Pods بموارد مختلفة وقراءة qosClass.

  • Cluster محلي.
Terminal window
kubectl apply -f guaranteed.yaml
kubectl apply -f burstable.yaml
kubectl get pods -o custom-columns=NAME:.metadata.name,QOS:.status.qosClass
kubectl describe pod qos-guaranteed | Select-String -Pattern QoS

على Linux أو macOS استخدم:

Terminal window
kubectl describe pod qos-guaranteed | grep QoS
QoS Class: Guaranteed
QoS Class: Burstable
Terminal window
kubectl delete -f guaranteed.yaml
kubectl delete -f burstable.yaml
الخطأالنتيجة
لا توجد requestsscheduling غير دقيق وBestEffort
limit منخفض جدا للذاكرةOOMKilled
CPU limit ضيق جداlatency أعلى بسبب throttling
requests مبالغ فيهاcluster يبدو ممتلئا رغم وجود موارد فعلية