IV.3
بروتوكول تقني — حصص cgroups ونطاق Kubernetes في خطّ أنابيب CI/CD
قيد غير قابل للتحايل، تفرضه النواة، لا ممارسة جيّدة موثَّقة
يُصيغ هذا البروتوكول التنفيذ التقني للحدّ الصارم المُعلَن في IV.2، ليكون قابلًا للتحقّق وغير قابل للتحايل — مُستجيبًا للمتطلّب المنهجي المطروح عند تأطير هذه الأطروحة: يجب على استرداد معماري إنتاج دليل تنفيذ، لا مجرَّد توصية.
◆ الخطوة 1 — إعلان الميزانية في بيان النشر
تُعلِن كل خدمة، في بيان Kubernetes الخاصّ بها، كائن ResourceQuota على مستوى النطاق (namespace) المُستضيف لها، يُحدِّد سقفًا إجماليًّا للحوسبة والذاكرة لكل حاويات هذا النطاق، وكائن LimitRange يُحدِّد السقوف الافتراضية والقصوى المُطبَّقة على كل حاوية فردية — كائنان أصليّان من واجهة برمجة Kubernetes، تُطبِّقهما خطّة تحكّم العنقود نفسها.
◆ الخطوة 2 — التحقّق المُسبَق في خطّ أنابيب CI/CD
قبل أي دمج كود نحو فرع النشر، تُقارِن مرحلة آلية من خطّ أنابيب التكامل المستمرّ الموارد المطلوبة في البيان بالسقوف المُحدَّدة في IV.1 وIV.2، وتُفشِل عملية البناء إن تجاوز هذا الطلب الميزانية المُعلَنة — مُحوِّلة تجاوز سَعة لفشل بناء مرئي فورًا لفريق التطوير، قبل أي نشر في الإنتاج.
◆ الخطوة 3 — التطبيق على مستوى النواة عبر cgroups
بمجرَّد النشر، تُطبَّق حدود موارد كل حاوية عبر مجموعات التحكّم (cgroups) لنواة Linux، الآلية التي تعتمد عليها Kubernetes نفسها لعزل الموارد بين الحاويات. تُنهى عملية تتجاوز حدّ ذاكرتها المُعلَن من قِبل النواة (OOM Killer، الموثَّق في مكان آخر من هذه المجموعة البحثية)، مُعيدةً إنتاج إشارة الإنذار الصارمة الموثَّقة كمُختفية في الفصل الثاني — لا كحادث هذه المرّة، بل كقيد مُعاد تقديمه عمدًا.
◆ ما يضمنه هذا البروتوكول، وما لا يضمنه
يضمن هذا البروتوكول أن تجاوز ميزانية معمارية يُنتِج إشارة تقنية صارمة وفورية — فشل بناء أو إنهاء عملية — بدل انزلاق ميزاني صامت. لا يضمن وحده أن يختار فريق التطوير تحسين كوده بدل التفاوض على رفع ميزانيته — يبقى هذا الخيار الأخير قرارًا تنظيميًّا شرعيًّا، يجعله هذا البروتوكول مرئيًّا ومُتعمَّدًا فقط بدل صامت وافتراضي.