مقدمة: لماذا تكاليف Kubernetes خارجة عن السيطرة؟
في 2026، أصبح Kubernetes المعيار الفعلي لتنسيق الحاويات (Container Orchestration) في المؤسسات حول العالم. لكن مع هذا الانتشار الواسع جاءت مفاجأة غير سارة — وصراحةً، مفاجأة مؤلمة لكثير من الفرق التقنية: أكثر من 68% من المؤسسات تنفق على Kubernetes أكثر مما يجب بنسبة تتراوح بين 20% و40%. والسبب؟ سوء تكوين الموارد، غياب الحوكمة المستمرة، وتراكم الموارد المهملة التي لا يلتفت إليها أحد.
الفرصة الأكبر للتوفير تكمن في الحوسبة — يعني ببساطة الآلات الافتراضية التي تشكّل عُقد (Nodes) مجموعتك. معظم المجموعات تعمل بمعدل استخدام يتراوح بين 30% و50% فقط، مما يعني أن نصف إنفاقك على الحوسبة يذهب هدرًا. أضف إلى ذلك تكاليف التخزين، ونقل البيانات بين المناطق، وأحمال عمل الذكاء الاصطناعي التي تستهلك وحدات GPU باهظة الثمن — وستجد نفسك أمام فاتورة سحابية متضخمة بشكل مخيف.
في هذا الدليل، سنستعرض استراتيجيات عملية مُجرَّبة لخفض تكاليف Kubernetes، مع أمثلة شيفرة برمجية حقيقية وأدوات يمكنك تطبيقها مباشرة. الفرق التي تتبنى هذه الاستراتيجيات تحقق توفيرًا يتراوح بين 40% و70% على بنيتها التحتية — وهذه ليست أرقامًا تسويقية، بل نتائج موثقة.
الخطوة الأولى: احصل على رؤية كاملة لتكاليفك باستخدام Kubecost أو OpenCost
القاعدة الأساسية في تحسين التكاليف: لا يمكنك تحسين ما لا تستطيع قياسه. قبل أن تبدأ بأي عملية تحسين، تحتاج أولًا إلى رؤية واضحة لأين يذهب إنفاقك بالضبط — على مستوى كل Namespace وكل Deployment وكل Service.
تثبيت OpenCost: الحل المفتوح المصدر المجاني
OpenCost هو مشروع مفتوح المصدر تابع لمؤسسة CNCF، يوفر قياسًا وتخصيصًا دقيقًا لتكاليف البنية التحتية السحابية والحاويات في الوقت الفعلي. والجميل فيه أنه محايد من حيث المُزوّد — يعمل مع AWS وAzure وGCP على حدٍّ سواء.
لتثبيته، تحتاج أولًا إلى Prometheus كمتطلب أساسي:
# تثبيت Prometheus
helm install prometheus --repo https://prometheus-community.github.io/helm-charts prometheus \
--namespace prometheus-system --create-namespace \
--set prometheus-pushgateway.enabled=false \
--set alertmanager.enabled=false \
-f https://raw.githubusercontent.com/opencost/opencost/develop/kubernetes/prometheus/extraScrapeConfigs.yaml
# تثبيت OpenCost
helm repo add opencost https://opencost.github.io/opencost-helm-chart
helm repo update
helm install opencost opencost/opencost --namespace opencost --create-namespace
تثبيت Kubecost: الحل التجاري الأكثر تقدمًا
Kubecost مبني على أساس OpenCost لكنه يضيف ميزات متقدمة مثل التنبؤ بالتكاليف، اكتشاف الشذوذ، والتكامل مع خصومات الفواتير الحقيقية (Spot، Reserved Instances، إلخ). التثبيت عبر Helm أيضًا:
# تثبيت Kubecost
helm repo add kubecost https://kubecost.github.io/cost-analyzer/
helm repo update
kubectl create namespace kubecost
helm install kubecost kubecost/cost-analyzer \
--namespace kubecost \
--set kubecostToken="YOUR_TOKEN_HERE"
بعد التثبيت، ستحصل على لوحة تحكم تعرض التكاليف مُقسَّمة حسب: Namespace (مفيد جدًا لمحاسبة الفرق)، Deployment (لتحديد التطبيقات الأكثر تكلفة)، Service، وLabel (لتخصيص مخصص باستخدام وسوم مثل cost-center أو project).
نصيحة مهمة: OpenCost لا يأخذ بالاعتبار الخصومات وأسعار Spot والائتمانات — هذه الميزات متاحة فقط في Kubecost. إذا كنت تستخدم خصومات مخصصة من مُزوّد السحابة، فـ Kubecost سيعطيك أرقامًا أدق بكثير.
ضبط حجم الـ Pods: المفتاح الأول لخفض التكاليف
خلّيني أكون صريح معك — أكثر مصادر الهدر شيوعًا في Kubernetes هو تخصيص موارد مبالغ فيه للـ Pods. كثير من الفرق تحدد طلبات الموارد (Resource Requests) عند أول نشر ولا تعود لمراجعتها أبدًا. والنتيجة؟ مجموعات مُفرطة التزويد تستهلك ضعف أو ثلاثة أضعاف ما تحتاجه فعلًا.
فهم الفرق بين Requests و Limits
قبل الحديث عن الضبط، لازم نفهم المفاهيم الأساسية:
- Requests: الحد الأدنى المضمون من الموارد للحاوية. يستخدمها المُجدوِل (Scheduler) لتحديد أي عقدة لديها موارد كافية لتشغيل الـ Pod.
- Limits: الحد الأقصى من الموارد التي يمكن للحاوية استخدامها. إذا تجاوزت الحاوية حد الذاكرة، يتم إنهاؤها (OOMKilled). أما تجاوز حد المعالج فيؤدي إلى خنق الأداء (Throttling).
مثال على تكوين الموارد:
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: my-container
image: nginx:latest
resources:
requests:
cpu: "250m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "256Mi"
تحذير: عندما تكون قيم Requests أقل بكثير من Limits، يحصل الـ Pod على فئة جودة الخدمة "Burstable". يبدو هذا فعّالًا نظريًا — تحجز القليل وتسمح بالانفجار عند الحاجة — لكنه في الواقع دَين تقني: فرضية ثابتة عن سلوك عبء العمل قد لا تصمد أمام الواقع.
استخدام VPA لضبط الموارد تلقائيًا
بدلًا من التخمين — ومن تجربتي، التخمين دائمًا يكلّفك أكثر مما تتوقع — استخدم Vertical Pod Autoscaler (VPA) لمراقبة الاستخدام الفعلي وتقديم توصيات دقيقة. الأفضل البدء بوضع "Off" (التوصيات فقط) ثم التطبيق يدويًا:
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: my-app-vpa
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
updatePolicy:
updateMode: "Off" # وضع التوصيات فقط — لا تغييرات تلقائية
resourcePolicy:
containerPolicies:
- containerName: my-container
minAllowed:
cpu: "100m"
memory: "50Mi"
maxAllowed:
cpu: "1"
memory: "500Mi"
بعد أسبوع أو اثنين من المراقبة، راجع التوصيات وطبّقها يدويًا. هذا النهج أكثر أمانًا خصوصًا للتطبيقات الحساسة التي لا تتحمل إعادة تشغيل مفاجئة — لأن VPA يحتاج لإنهاء الـ Pod وإعادة إنشائه لتطبيق التغييرات.
التوسع الأفقي الذكي: HPA بالشكل الصحيح
الـ Horizontal Pod Autoscaler (HPA) يزيد أو ينقص عدد الـ Pods تلقائيًا بناءً على مقاييس محددة. لكن كثير من الفرق تضبطه بشكل خاطئ مما يؤدي إلى إفراط أو نقص في التوسع — وكلا الحالتين تكلّفك مالًا.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
behavior:
scaleDown:
stabilizationWindowSeconds: 300 # انتظر 5 دقائق قبل تقليص العدد
policies:
- type: Percent
value: 10
periodSeconds: 60 # قلّص 10% كحد أقصى كل دقيقة
أفضل الممارسات لضبط HPA:
- تجنب استخدام الذاكرة كمقياس أساسي لـ HPA — الذاكرة بطيئة الاستجابة وقد تسبب توسعًا مدمرًا. استخدم المعالج (CPU) أو مقاييس مخصصة مثل معدل الطلبات.
- حدد نافذة استقرار للتقليص (stabilizationWindowSeconds) لمنع التذبذب السريع بين التوسع والتقليص.
- لا تستخدم VPA و HPA على نفس المقياس — إذا كلاهما يراقب CPU، سيتعارضان. استخدم VPA للذاكرة والمعالج، و HPA لمقاييس الحركة المخصصة.
Karpenter مقابل Cluster Autoscaler: أيهما يوفر أكثر؟
توسيع العُقد (Node Scaling) هو المستوى الثاني من التوسع — بعد توسيع الـ Pods. وهنا تبرز مقارنة يسألني عنها كثيرون بين الأداتين الرئيسيتين:
Cluster Autoscaler: الخيار التقليدي
Cluster Autoscaler هو المشروع الرسمي من Kubernetes SIG-Autoscaling. يعمل عن طريق فحص المجموعة كل 10 ثوانٍ ومحاكاة الجدولة لكل مجموعة عُقد (Node Group)، ثم تعديل حجم Auto Scaling Group عندما تكون هناك Pods غير قابلة للجدولة أو عُقد غير مستغلة.
Karpenter: الجيل الجديد من AWS
Karpenter أداة مفتوحة المصدر طوّرتها AWS في 2021. الموضوع بسيط — تعمل بمنهج مختلف تمامًا: بدلًا من الاعتماد على Auto Scaling Groups المحددة مسبقًا، تتواصل مباشرة مع EC2 Fleet API لتوفير العُقد ديناميكيًا واختيار أنسب أنواع المثيلات من حيث التكلفة والأداء.
مقارنة تفصيلية
| المعيار | Cluster Autoscaler | Karpenter |
|---|---|---|
| آلية التفعيل | مسح دوري كل 10 ثوانٍ | مبني على الأحداث (Event-driven) |
| توفير العُقد | عبر Auto Scaling Groups | مباشرة عبر EC2 Fleet API |
| اختيار نوع المثيل | محدد مسبقًا في Node Groups | ديناميكي — أي نوع مثيل متاح |
| دمج العُقد (Consolidation) | تفاعلي فقط — يحذف العُقد الخاملة | استباقي — ينقل الـ Pods لعُقد أرخص |
| سرعة التوسع | 3-4 دقائق | ~55 ثانية |
| دعم Spot Instances | أساسي | متقدم مع تنويع تلقائي |
| دعم متعدد السحابات | نعم (AWS, GCP, Azure) | AWS فقط (حاليًا) |
نتائج حقيقية
الأرقام تتحدث عن نفسها:
- فرق تقنية أبلغت عن خفض 20% في تكاليف المجموعة بالكامل و90% على أحمال CI/CD بعد الانتقال إلى Karpenter مع تنويع Spot.
- في شركة Paytm Money، حققت الفرق توفير 30% مع Spot + تحسين التعبئة (bin packing) — أي أكثر من 50,000 دولار توفير في تكاليف EC2 في ربع واحد فقط.
مثال على تكوين Karpenter NodePool:
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: default
spec:
template:
spec:
requirements:
- key: kubernetes.io/arch
operator: In
values: ["amd64", "arm64"] # السماح بمعالجات Graviton أيضًا
- key: karpenter.sh/capacity-type
operator: In
values: ["spot", "on-demand"] # تفضيل Spot مع fallback
- key: karpenter.k8s.aws/instance-category
operator: In
values: ["c", "m", "r"]
- key: karpenter.k8s.aws/instance-generation
operator: Gt
values: ["5"]
nodeClassRef:
group: karpenter.k8s.aws
kind: EC2NodeClass
name: default
limits:
cpu: "1000"
memory: "1000Gi"
disruption:
consolidationPolicy: WhenEmptyOrUnderutilized
consolidateAfter: 30s
النقطة الجوهرية: إذا كنت تعمل حصريًا على AWS EKS، انتقل إلى Karpenter — شخصيًا أعتبره من أفضل القرارات التقنية التي تستطيع اتخاذها اليوم. أما إذا كنت تعمل على بيئات متعددة السحابات أو تحتاج لأحمال GPU ثقيلة مع Node Groups محددة، فقد يكون Cluster Autoscaler الخيار الأنسب.
استغلال Spot Instances: توفير 70-90% على الحوسبة
Spot Instances (أو Preemptible VMs في GCP) توفر خصومات تتراوح بين 70% و90% مقارنة بالأسعار العادية. في 2026، تحسّنت آليات التعامل مع الانقطاعات بشكل كبير، مما يجعلها أكثر موثوقية من أي وقت مضى — وصراحةً، من كان يتجنبها قبل سنوات بسبب عدم الاستقرار، الوضع الآن مختلف تمامًا.
الاستراتيجية المثالية: نموذج هجين — غطِّ الحمل الأساسي المتوقع بـ Reserved Instances أو Savings Plans، وتعامل مع الذروات غير المتوقعة بـ Spot Instances.
أحمال العمل المناسبة لـ Spot:
- خوادم الويب عديمة الحالة (Stateless) خلف Load Balancer
- وظائف المعالجة الدُّفعية (Batch Processing)
- خطوط CI/CD
- أحمال تدريب نماذج الذكاء الاصطناعي (مع نقاط تفتيش - Checkpointing)
أحمال العمل التي يجب تجنب Spot معها:
- قواعد البيانات ذات الحالة (Stateful Databases)
- الأنظمة التي لا تتحمل أي انقطاع
- الخدمات ذات عملية إيقاف طويلة (Long Graceful Shutdown)
القضاء على الموارد المهملة: الأموات الأحياء في مجموعتك
المجموعات تراكم نفايات بمرور الوقت — هذه حقيقة لا مفر منها. أقراص تخزين دائمة منفصلة (Detached Persistent Volumes)، موازنات حِمل غير مستخدمة (Unused Load Balancers)، Pods عالقة في حالة CrashLoopBackOff، لقطات منسية (Forgotten Snapshots)، ومجموعات عُقد خاملة. كل هذه تظهر في فاتورتك كل شهر بصمت.
سكريبت سريع لاكتشاف الموارد المهدرة:
#!/bin/bash
# اكتشاف PVCs غير مرتبطة بأي Pod
echo "=== Unbound PVCs ==="
kubectl get pvc --all-namespaces -o json | jq -r '.items[] | select(.status.phase != "Bound") | "\(.metadata.namespace)/\(.metadata.name)"'
# اكتشاف Deployments بدون Pods
echo "=== Deployments with 0 replicas ==="
kubectl get deployments --all-namespaces -o json | jq -r '.items[] | select(.spec.replicas == 0) | "\(.metadata.namespace)/\(.metadata.name)"'
# اكتشاف Services بدون Endpoints
echo "=== Services with no endpoints ==="
kubectl get endpoints --all-namespaces -o json | jq -r '.items[] | select((.subsets == null) or (.subsets | length == 0)) | "\(.metadata.namespace)/\(.metadata.name)"'
# اكتشاف Pods فاشلة
echo "=== Failed/CrashLoopBackOff Pods ==="
kubectl get pods --all-namespaces --field-selector=status.phase=Failed -o json | jq -r '.items[] | "\(.metadata.namespace)/\(.metadata.name)"'
أتمت عمليات التنظيف: لا تعتمد على التنظيف اليدوي — من تجربتي، التنظيف اليدوي يحدث مرة واحدة ثم يُنسى. استخدم أدوات مثل Kube-Green لإيقاف بيئات التطوير والاختبار تلقائيًا خارج ساعات العمل، أو أنشئ CronJobs تفحص وتنظف الموارد المهملة أسبوعيًا.
تقليل تكاليف نقل البيانات بين المناطق
تكاليف نقل البيانات (Data Transfer) هي المفاجأة التي تظهر في الفاتورة بعد ثلاثة أشهر من الإطلاق — ويصطدم بها كل فريق تقريبًا في مرحلة ما. في AWS مثلًا:
- نقل بين مناطق التوفر (Cross-AZ): 0.01-0.02 دولار لكل جيجابايت
- نقل بين المناطق (Cross-Region): 0.02-0.09 دولار لكل جيجابايت
- خروج إلى الإنترنت (Egress): 0.09 دولار لكل جيجابايت
في معمارية الخدمات المصغرة القائمة على Kubernetes — حيث عشرات الخدمات تتواصل مع بعضها — هذه التكاليف تتراكم بسرعة مرعبة.
الحل: التوجيه الواعي بالطوبولوجيا (Topology-Aware Routing)
Kubernetes يدعم التوجيه الذي يفضل النقاط النهائية المحلية، مما يحافظ على حركة المرور داخل نفس المنطقة عند توفر نسخ قريبة:
apiVersion: v1
kind: Service
metadata:
name: my-service
annotations:
service.kubernetes.io/topology-mode: Auto
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
نصائح إضافية:
- أبقِ الخدمات المترابطة في نفس المنطقة ومنطقة التوفر قدر الإمكان.
- استخدم VPC Endpoints من نوع Gateway لخدمات S3 و DynamoDB — فهي مجانية وتتجنب رسوم NAT Gateway.
- فعّل ضغط البيانات (gRPC compression) للتواصل بين الخدمات الداخلية.
مشاركة GPU للذكاء الاصطناعي: خفض أغلى بند في فاتورتك
في 2026، أصبحت تكاليف الاستدلال (Inference) بالذكاء الاصطناعي تمثل أكثر من نصف الإنفاق السحابي المتعلق بالـ AI في كثير من المؤسسات. المشكلة واضحة: كل خدمة AI صغيرة تحصل على GPU كامل خاص بها — حتى لو كانت لا تستغل إلا 15% منه. يعني ببساطة أنت تدفع ثمن GPU كامل لاستخدام سُبعه.
الحل: Kubernetes يدعم الآن تقسيم GPU فعلي واحد إلى عدة مثيلات افتراضية باستخدام تقنية NVIDIA Multi-Instance GPU (MIG). هذا يسمح لعدة خدمات AI صغيرة بمشاركة بطاقة واحدة قوية بدلًا من امتلاك كل منها GPU غير مستغل بالكامل.
apiVersion: v1
kind: Pod
metadata:
name: ai-inference
spec:
containers:
- name: inference
image: my-ai-model:latest
resources:
limits:
nvidia.com/mig-1g.5gb: 1 # شريحة واحدة من GPU بدلًا من GPU كامل
الالتزامات المالية: متى تستخدم Reserved Instances أو Savings Plans
بعد أن تنتهي من عمليات ضبط الحجم وتنظيف الموارد، الخطوة التالية هي تأمين أسعار مخفضة لحمل العمل الأساسي المُحسَّن. القاعدة الذهبية التي أؤمن بها: حسِّن أولًا، ثم التزم — لا تشترِ التزامات على بنية تحتية مُبالَغ فيها، وإلا تكون قد قفلت نفسك على هدر مدفوع مسبقًا.
- Savings Plans (AWS): وفّر حتى 72% مع مرونة في تغيير أنواع المثيلات. الالتزام يكون بمبلغ ثابت بالساعة وليس بنوع مثيل محدد.
- Reserved Instances: وفّر حتى 75%، لكن مع التزام بنوع مثيل ومنطقة محددة. الأفضل لأحمال العمل الثابتة المتوقعة.
- Committed Use Discounts (GCP): خصم 28% لسنة و46% لثلاث سنوات.
أفضل نهج: استراتيجية هجينة — Reserved Instances للحمل الأساسي الثابت الذي لا يتغير، و Savings Plans للاستخدام المرن عبر خدمات متعددة.
استراتيجية الوسم: الأساس المفقود لمحاسبة التكاليف
بدون وسوم (Labels) منظمة ومتسقة، يستحيل معرفة أي فريق أو مشروع أو بيئة تستهلك أي جزء من الإنفاق. الوسم ليس ترفًا — هو الأساس الذي تُبنى عليه كل عمليات التحسين. وللأسف هذا ما يُهمل في كثير من الفرق حتى يصبح الوضع فوضويًا.
الوسوم الأساسية المطلوبة:
metadata:
labels:
team: "backend"
app: "payment-service"
environment: "production" # أو staging أو dev
cost-center: "engineering"
project: "checkout-v2"
لضمان عدم نشر أي Pod بدون الوسوم المطلوبة، استخدم Admission Controllers أو أدوات السياسات مثل OPA Gatekeeper أو Kyverno:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-cost-labels
spec:
validationFailureAction: Enforce
rules:
- name: check-labels
match:
any:
- resources:
kinds:
- Pod
validate:
message: "يجب أن تحتوي جميع الـ Pods على وسوم: team, app, environment, cost-center"
pattern:
metadata:
labels:
team: "?*"
app: "?*"
environment: "?*"
cost-center: "?*"
إيقاف بيئات التطوير والاختبار خارج ساعات العمل
بيئات التطوير والاختبار والـ Staging لا تحتاج أن تعمل 24 ساعة في اليوم — هذه حقيقة بسيطة يتجاهلها كثيرون. إذا كانت ساعات العمل الفعلية 10 ساعات يوميًا لخمسة أيام في الأسبوع، فأنت تدفع ثمن 118 ساعة إضافية أسبوعيًا بلا أي استخدام.
أداة Kube-Green تسمح بجدولة إيقاف وتشغيل أحمال العمل تلقائيًا:
apiVersion: kube-green.com/v1alpha1
kind: SleepInfo
metadata:
name: dev-sleep-schedule
namespace: development
spec:
weekdays: "1-5" # من الاثنين إلى الجمعة
sleepAt: "19:00" # إيقاف الساعة 7 مساءً
wakeUpAt: "07:00" # تشغيل الساعة 7 صباحًا
timeZone: "Asia/Riyadh"
suspendDeployments: true
suspendCronjobs: true
هذا وحده يمكن أن يوفر حتى 65% من تكاليف بيئات التطوير — بدون أي تأثير على الإنتاجية. سهل التطبيق ونتائجه فورية.
الانتقال إلى معالجات Graviton: توفير هيكلي 20-40%
معالجات AWS Graviton المبنية على معمارية ARM توفر سعر أقل بـ 20% من معالجات x86 المكافئة مع أداء أفضل بنسبة تصل إلى 40%. في 2026، أصبح Graviton في جيله الخامس مع دعم أكثر من 150 نوع مثيل مختلف وأكثر من 90,000 عميل يستخدمه — الموضوع بسيط: هذه ليست تجربة، هذا خيار إنتاجي ناضج.
أسهل طريقة للبدء: إذا كانت حاوياتك تعمل على صور multi-arch أو Linux/ARM، يمكنك إضافة arm64 كمعمارية مسموح بها في Karpenter (كما في المثال أعلاه) ودع Karpenter يختار مثيلات Graviton تلقائيًا عندما تكون أرخص.
لخدمات RDS، التبديل أسهل: غيّر نوع المثيل من db.m5.large إلى db.m7g.large ولا تحتاج تغيير أي شيء في قاعدة البيانات أو التطبيق.
ملخص: خارطة طريق التوفير
| الاستراتيجية | التوفير المتوقع | صعوبة التنفيذ | الأولوية |
|---|---|---|---|
| رؤية التكاليف (Kubecost/OpenCost) | الأساس لكل شيء | سهلة | فورية |
| ضبط حجم الـ Pods (VPA) | 20-40% | متوسطة | عالية |
| القضاء على الموارد المهملة | 10-25% | سهلة | عالية |
| Karpenter + Spot Instances | 30-70% | متوسطة | عالية |
| إيقاف بيئات Dev/Staging ليلًا | حتى 65% | سهلة | متوسطة |
| تقليل نقل البيانات | 10-30% | متوسطة | متوسطة |
| الانتقال إلى Graviton | 20-40% | متوسطة-عالية | متوسطة |
| التزامات مالية (RI/SP) | حتى 72% | سهلة | بعد التحسين |
الأسئلة الشائعة
كيف أبدأ في تحسين تكاليف Kubernetes إذا لم يكن لدي خبرة سابقة؟
ابدأ بتثبيت أداة رؤية التكاليف مثل OpenCost (مجانية) أو Kubecost. هذا سيعطيك صورة واضحة عن أين يذهب إنفاقك. بعد أسبوع من جمع البيانات، ابدأ بتنظيف الموارد المهملة (الأسهل) ثم انتقل إلى ضبط حجم الـ Pods. لا تحاول تنفيذ كل شيء دفعة واحدة — هذا طريق مختصر للإرهاق وعدم إتمام أي شيء.
هل يمكن استخدام Spot Instances لأحمال العمل الإنتاجية؟
نعم، لكن مع شروط. أحمال العمل عديمة الحالة (Stateless) التي تعمل خلف Load Balancer مثالية لـ Spot. استخدم تنويع أنواع المثيلات (Instance Diversification) لتقليل احتمالية الانقطاع المتزامن، وتأكد من أن تطبيقك يتعامل بأمان مع إشعارات الإنهاء (Termination Notices) التي تصل قبل دقيقتين من الاسترداد.
ما الفرق بين OpenCost و Kubecost، وأيهما أختار؟
OpenCost مفتوح المصدر بالكامل ومجاني ومحايد للمُزوّد — مثالي للبداية. Kubecost مبني على OpenCost ويضيف ميزات تجارية مثل مطابقة الفواتير الحقيقية (بما فيها خصومات Spot والائتمانات)، التنبؤ، والتنبيهات. إذا كنت تستخدم خصومات مخصصة من مُزوّد السحابة، فـ Kubecost سيعطيك أرقامًا أدق.
كم يستغرق رؤية نتائج فعلية بعد تطبيق استراتيجيات التحسين؟
تنظيف الموارد المهملة وإيقاف بيئات التطوير ليلًا يعطي نتائج فورية في الدورة الفاتورية التالية (خلال شهر). ضبط حجم الـ Pods والانتقال إلى Spot Instances يحتاج 2-4 أسابيع لجمع البيانات وتطبيق التغييرات. الالتزامات المالية (Reserved Instances/Savings Plans) تحتاج تحليلًا لأنماط الاستخدام على مدى 1-3 أشهر قبل الشراء.
هل Karpenter متاح لـ Azure و GCP أم فقط لـ AWS؟
حاليًا Karpenter يعمل بشكل أساسي على AWS EKS. هناك جهود مجتمعية لدعم Azure (AKS) ومُزوّدين آخرين لكنها لم تصل بعد لمرحلة الإنتاج. إذا كنت على Azure استخدم AKS Node Autoprovision، وعلى GCP استخدم GKE Autopilot أو Cluster Autoscaler.