QoS و Eviction و Resources
الهدف من الدرس
Section titled “الهدف من الدرس”ستتعلم كيف تؤثر requests و limits على scheduling و QoS، ولماذا قد يطرد kubelet بعض Pods عند ضغط memory أو disk.
الفكرة ببساطة
Section titled “الفكرة ببساطة”requests تحدد الموارد التي يحجزها scheduler، وlimits تحدد الحد الأقصى. Kubernetes يصنف Pods إلى QoS classes تؤثر على أولوية الطرد عند ضغط الموارد.
QoS classes
Section titled “QoS classes”| QoS | الشرط | أولوية الطرد |
|---|---|---|
Guaranteed | كل container له CPU و memory request يساوي limit | أقل عرضة للطرد |
Burstable | يوجد request أو limit، لكنها ليست متساوية | متوسط |
BestEffort | لا توجد requests ولا limits | أكثر عرضة للطرد |
YAML أمثلة
Section titled “YAML أمثلة”guaranteed.yaml:
apiVersion: v1kind: Podmetadata: name: qos-guaranteedspec: containers: - name: app image: nginx:1.27 resources: requests: cpu: "200m" memory: "128Mi" limits: cpu: "200m" memory: "128Mi"burstable.yaml:
apiVersion: v1kind: Podmetadata: name: qos-burstablespec: containers: - name: app image: nginx:1.27 resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "500m" memory: "256Mi"أوامر الفحص
Section titled “أوامر الفحص”kubectl apply -f guaranteed.yamlkubectl apply -f burstable.yamlkubectl get pod qos-guaranteed qos-burstable -o custom-columns=NAME:.metadata.name,QOS:.status.qosClasskubectl describe nodeExpected output:
NAME QOSqos-guaranteed Guaranteedqos-burstable BurstableEviction
Section titled “Eviction”عند ضغط الموارد، kubelet قد يطرد Pods حتى يحافظ على صحة Node. أمثلة على أسباب الضغط:
- memory متاح قليل.
- disk space قليل.
- image filesystem ممتلئ.
- PID pressure.
قرارات عملية
Section titled “قرارات عملية”| نوع التطبيق | request كبداية | limit كبداية |
|---|---|---|
| API خفيف | p50 أو p70 من الاستخدام | 2x إلى 4x حسب السلوك |
| worker متغير | request واقعي للحد الأدنى | limit يحمي Node من spike خطير |
| database | لا تخمن، استخدم قياسات وتوصيات المنتج | تجنب memory limit ضيق |
Lab: مقارنة QoS classes
الهدف: إنشاء Pods بموارد مختلفة وقراءة qosClass.
Prerequisites
Section titled “Prerequisites”- Cluster محلي.
kubectl apply -f guaranteed.yamlkubectl apply -f burstable.yamlkubectl get pods -o custom-columns=NAME:.metadata.name,QOS:.status.qosClasskubectl describe pod qos-guaranteed | Select-String -Pattern QoSعلى Linux أو macOS استخدم:
kubectl describe pod qos-guaranteed | grep QoSExpected output
Section titled “Expected output”QoS Class: GuaranteedQoS Class: BurstableCleanup
Section titled “Cleanup”kubectl delete -f guaranteed.yamlkubectl delete -f burstable.yamlأخطاء شائعة
Section titled “أخطاء شائعة”| الخطأ | النتيجة |
|---|---|
| لا توجد requests | scheduling غير دقيق وBestEffort |
| limit منخفض جدا للذاكرة | OOMKilled |
| CPU limit ضيق جدا | latency أعلى بسبب throttling |
| requests مبالغ فيها | cluster يبدو ممتلئا رغم وجود موارد فعلية |