مستوى المقال: مبتدئ — مناسب لك لو لسه في أول طريقك مع Kubernetes وحاويات Docker.
لو لقيت الـ Pod بتاعك بيموت ويرجع تاني كل شوية، وفي حالته مكتوب OOMKilled، المقال ده هيوريك السبب بالظبط، وإزاي تمنعه بإعداد من 4 أسطر. الافتراض إن عندك صلاحية تعدّل ملفات الـ Deployment وتشغّل أوامر kubectl على الـ cluster.
ليه الـ Pod بيموت بـ OOMKilled في Kubernetes وإزاي تمنعه
المشكلة باختصار
تخيّل خدمة تقارير في شركة fintech، شغّالة بـ 6 نسخ على نود ذاكرتها 8Gi، ومحدّش حاطط لها سقف ذاكرة. نسخة واحدة فيها تسريب ذاكرة بسيط. مع الوقت بتاكل لحد 6.8Gi على النود لوحدها.
اللي بيحصل فعلاً وقتها مش إنها هي بس اللي تقع. الـ kernel على مستوى النود بيبدأ يقتل عمليات تانية علشان يفضّي ذاكرة، فبتلاقي 4 خدمات تانية اترمت معاها بدون أي ذنب. النتيجة: حوالي 9 دقايق downtime و~12,000 طلب رجّع 5xx. المشكلة مش في حجم النود، المشكلة إن مفيش حد قايل للحاوية "متعديش الحد ده".
الذاكرة في Kubernetes: الفكرة بمثال، وبعدين بالتعريف الدقيق
تخيّل مطعم. لما تحجز ترابيزة، المطعم بيضمنلك إنها متاحة مهما اتأخرت — ده الـ request. لكن في حد أقصى لعدد الكراسي اللي تقدر تزوّدها على الترابيزة قبل ما الإدارة توقفك — ده الـ limit. لو فضلت تجيب كراسي أكتر من الحد، الأمن بيطلعك بره على طول، مش بيتفاوض معاك.
الحاوية بالظبط كده. الـ request ذاكرة محجوزة ليها مهما حصل، والـ limit سقف لو عدّاه، النظام بيقتل العملية فورًا.
بالتفاصيل دلوقتي: Kubernetes بيركّب على آلية في نواة لينكس اسمها cgroups (control groups). لكل حاوية بيتعمل cgroup بسقف ذاكرة يساوي الـ limit. أول ما الذاكرة المستخدمة فعليًا (الـ RSS أساسًا) تعدّي السقف، الـ OOM killer بتاع الـ kernel بيقتل العملية بإشارة SIGKILL. علشان كده بتلاقي كود الخروج 137 بالظبط، وهو 128 + 9، والـ 9 هي رقم إشارة SIGKILL.
أما الـ request فمالوش علاقة بالقتل خالص. الـ scheduler بيستخدمه علشان يقرر الـ Pod يتحط على أنهي نود — يعني هو "حجز" بيضمن مكان، مش سقف.
الحل: اضبط requests و limits على الحاوية
- اعرف الاستهلاك الطبيعي للخدمة تحت حمل حقيقي (الخطوة دي قبل أي رقم).
- حط
requests.memory= الاستهلاك الطبيعي تقريبًا. - حط
limits.memory= حوالي 1.5 ضعف الـ request علشان تسيب مساحة للـ burst المؤقت. - طبّق وراقب. لو شفت OOMKilled تحت الحمل العادي، الـ limit واطي.