المستوى: متوسط — مناسب لمهندسين DevOps عندهم خبرة Kubernetes أساسية وشغّالين على AWS EKS.
لو فاتورة EC2 الشهرية على cluster Kubernetes عندك تعدّت $4,800 رغم إن متوسط الـ vCPU utilization تحت 30%، المشكلة مش في Kubernetes — انت بتدفع تكلفة Cluster Autoscaler اللي مجبر على instance type واحد محدد مسبقاً في الـ Auto Scaling Group.
Karpenter وانفجار تكاليف Kubernetes في AWS
المشكلة باختصار
Cluster Autoscaler (اختصاره CA) بياخد قراره من Auto Scaling Group واحدة معرّفة سلفاً. لما pod جديد يطلب 4 vCPU و 8GB ذاكرة، CA بيشغّل instance من نفس الـ ASG حتى لو الـ instance ده مقاسه c5.4xlarge بـ 16 vCPU و 32GB. النتيجة المباشرة: 73% من الـ vCPU بيقعد فاضي، وانت بتدفع $0.68/ساعة لـ instance بتستخدم منه ربعه.
المثال البسيط: مدير محطة الباصات
قبل ما ندخل في التفاصيل التقنية، تخيّل محطة باصات في الزمالك. الراكب بيقف وعايز يروح وسط البلد. الموظف عنده باص واحد متاح، حجمه 50 راكب. لو في 4 ركاب بس واقفين، الموظف بيقولهم استنوا أو يبعت الباص الكبير اللي هيمشي فاضي.
ده بالظبط Cluster Autoscaler. عنده "موديل باص واحد" (instance type واحد في الـ ASG)، ولما يحتاج يشغّل واحد، بيشغّل اللي عنده مهما كان الطلب صغير.
Karpenter بالعكس: زي مدير محطة عنده 380 موديل عربية مختلف (من ميكروباص 6 ركاب لباص 50). لما يشوف 4 ركاب، بيختار الميكروباص. لما يشوف 35، بيختار باص 40. ولو سعر باص ARM أرخص بـ 40% من باص x86، بياخده طول ما الركاب مش هيشتكوا.
التفسير التقني: ازاي Karpenter بياخد قراره
Karpenter بيستبدل الـ ASG بـ Custom Resource اسمه NodePool. لما يلاقي pod في حالة Pending لأكتر من 15 ثانية، بيشغّل الـ scheduler الداخلي بتاعه ويحلّل أربع حاجات بالتوازي:
- المتطلبات الفعلية للـ pod: CPU، ذاكرة، GPU، ephemeral storage
- قيود الـ scheduling:
nodeAffinity،tolerations،topologySpreadConstraints - الـ instance types المتاحة: بيستعلم EC2 Fleet API عن كل الأسعار اللحظية في كل الـ Availability Zones
- سياسة الـ capacity-type: spot أو on-demand حسب احتمال الـ interruption
بعد ما يحسب الحل الأمثل، بيطلب الـ instance مباشرةً من EC2 Fleet API. متوسط زمن الـ scale-up: 28 ثانية، مقارنة بـ 4 دقايق و 12 ثانية مع CA + ASG، لأن CA بيمر على Auto Scaling Service الأول.
التركيب الفعلي في 25 سطر YAML
الافتراض: عندك EKS 1.30 أو أعلى، و IAM Role بصلاحية ec2:CreateFleet و iam:PassRole. بعد helm install karpenter karpenter-oci/karpenter بـ values.yaml بسيط، الـ NodePool نفسه ده الـ 25 سطر: