هذا المقال يتطلب مستوى: محترف
ليه الـ Pod بيتقتل بـ OOMKilled والعقدة نصها فاضي؟
لو الـ Pod بيتقتل ويرجع بـ OOMKilled رغم إن العقدة (Node) نصها ذاكرة فاضية، المشكلة مش في حجم العقدة. المشكلة في الـ memory limit اللي انت حاططه على الحاوية. المقال ده هيوريك بالظبط ليه بيحصل، وإزاي تظبط الـ Requests والـ Limits علشان الخدمة تثبت.
المشكلة باختصار
الـ limit مش بيتحسب على مستوى العقدة، بيتحسب على مستوى الحاوية لوحدها. يعني ممكن العقدة عندها 32 جيجا فاضية، ولسه الحاوية بتتقتل لأنها عدّت الـ 512 ميجا اللي انت سامحلها بيها. الـ kernel بيشوف الحاوية بس، مش الصورة الكبيرة.
الفكرة بمثال بسيط الأول
تخيّل مطعم مزحوم. الـ request هو عدد الكراسي المحجوزة باسمك، مضمونة مهما حصل. الـ limit هو أقصى عدد كراسي مسموح تسحبها لطاولتك. لو عدّيت الحد ده، البواب بيشيلك بره على طول من غير تفاوض. ولو المطعم كله اتزحم وقلّت الكراسي، المدير بيطرد الأول اللي قاعد من غير حجز أصلًا.
الـ kernel هو البواب، والـ kubelet هو المدير. تعالى نشوفها علميًا.
الفرق بين Request و Limit علميًا
الـ request بيستخدمه الـ scheduler وقت التوزيع. هو بيقول للعقدة "احجزلي القدر ده مضمون" وعلى أساسه بيتقرر الـ Pod ينزل على أنهي عقدة (bin-packing). الـ limit حاجة تانية خالص: ده سقف بيتفرض عبر الـ cgroup على مستوى الـ kernel. في cgroup v2 القيمة دي اسمها memory.max.
الفرق الجوهري: تجاوز الـ CPU limit بيعمل throttling يعني بطء مؤقت. تجاوز الـ memory limit مفيش فيه بطء، فيه قتل. الذاكرة مش قابلة للـ throttle، فالـ kernel بيطلّق الـ OOM killer اللي بيقتل العملية فورًا.
ليه Exit Code بيطلع 137؟
لما الـ OOM killer يقتل العملية، بيبعتلها SIGKILL (الإشارة رقم 9). الحاوية بتخرج بكود 128 + 9 = 137. ده مش رقم عشوائي، ده توقيعك إن السبب قتل بالذاكرة. تشوفه كده:
# شوف آخر حالة للحاوية وسبب موتها
kubectl describe pod my-app-7d9f | grep -A6 "Last State"
# المتوقع تشوف:
# Last State: Terminated
# Reason: OOMKilled
# Exit Code: 137
# قيس الاستهلاك الفعلي دلوقتي
kubectl top pod my-app-7d9fفئات الجودة (QoS) ومين بيتقتل الأول
وقت ضغط الذاكرة على العقدة، الـ kubelet بيطرد الـ Pods بترتيب حسب فئة الجودة بتاعتها. الترتيب ده بيتحدد أوتوماتيك من الـ Requests والـ Limits:
| الفئة | الإعداد | ترتيب الطرد عند الضغط |
|---|---|---|