تعدد المستأجرين والضمانات في المنصات
تعدد المستأجرين والضمانات في المنصات
عندما تخدم فرقة المنصة عشرات أو مئات من الفرق المنتجة على بنية تحتية مشتركة، فإن كل قرار تصميمي يتعلق بـعزل المستأجرين والحصص والإعدادات الافتراضية الآمنة له تداعيات على نطاق الكارثة. فالنيمسبيس المُهيَّأ بشكل خاطئ قد يحرم خدمة حيوية من المعالج؛ وغياب NetworkPolicy قد يسمح لـ Pod مخترق بسرقة الأسرار عبر حدود الفرق؛ ومن دون LimitRange، قد يُحجب حاوية مفلتة ذاكرة العقدة بأكملها. هذا الدرس يغطي كيفية بناء هذا الانضباط داخل منصتك.
نماذج عزل المستأجرين
يُخصَّص المستأجرون في المنصة عادةً لأحد حدود العزل الثلاثة، ولكل منها مقايضة مختلفة بين العزل والتكلفة:
- Namespace لكل فريق — النموذج الأكثر شيوعاً في Kubernetes. تتشارك الفرق العنقود ذاته لكنها مفصولة بـ RBAC وNetworkPolicy وResourceQuota. كفؤ من حيث التكلفة؛ العزل منطقي وليس مادياً.
- Node Pool لكل مستأجر — تُنشر أعباء عمل الفرق الحساسة على node pools مخصصة عبر
nodeSelectorوTaint/Toleration. يزول خطر الجار الصاخب، لكن التكلفة أعلى. شائع للمستأجرين الخاضعين لـ PCI/HIPAA. - Cluster لكل مستأجر — عزل كامل. يُستخدم للمجالات الخاضعة لمتطلبات الامتثال. أدوات مثل vCluster تجلب هذا النموذج داخل عنقود واحد بتكلفة قريبة من النيمسبيس.
ResourceQuota وLimitRange في Kubernetes
كل نيمسبيس تُنشئها المنصة يجب أن يحصل على ResourceQuota (حدود صارمة على مستوى العنقود) وLimitRange (الإعدادات الافتراضية والحدود القصوى لكل حاوية). حذف LimitRange يعني أن Pod بدون requests/limits صريح يعمل بدون قيود على المعالج/الذاكرة — وهو أكثر أسباب حوادث الجار الصاخب شيوعاً.
أضف تنبيهات استنفاد الحصة: قاعدة Prometheus على kube_resourcequota{type="used"} / kube_resourcequota{type="hard"} > 0.85 ترسل تحذيراً قبل امتلاء النيمسبيس وبدء الـ Pods في الانتظار. بدون هذا التنبيه، يكتشف المهندسون حد الحصة فقط حين يفشل نشرهم بصمت خلال حادثة.
عزل الشبكة بـ NetworkPolicy
Kubernetes يسمح افتراضياً بكل حركة المرور بين الـ Pods. في منصة متعددة المستأجرين يجب عكس ذلك: رفض كل شيء افتراضياً، ثم إضافة قواعد سماح صريحة. السياسة الأساسية أدناه مُدرجة في كل نيمسبيس جديدة.
التحكم في القبول: السياسة كضمانات
ResourceQuota وNetworkPolicy تعمل بأثر رجعي — تقيد ما هو موجود. سياسات القبول استباقية: تحجب أو تعدِّل أعباء العمل وقت الإنشاء. المنصة الناضجة تستخدم Kyverno أو OPA/Gatekeeper لتطبيق القواعد التي كانت تتطلب مراجعة يدوية بشرية على نطاق واسع.
السياسات الأساسية التي يجب أن تشحنها كل منصة:
- اشترط تشغيل الحاويات بمستخدم غير root — ارفض أي Pod لا يحمل
securityContext.runAsNonRoot: true. - احظر الحاويات ذات الامتيازات — ارفض
securityContext.privileged: true. - اشترط ديجست الصورة أو السجل المسموح به — ارفض وسم
latest. - اشترط طلبات الموارد وحدودها — ارفض Pods التي ستتجاوز LimitRange.
- اشترط تسميات الفريق — ارفض أي عبء عمل يفقد
app.kubernetes.io/team(يُمكِّن تخصيص التكلفة وتوجيه المناوبة).
الإعدادات الافتراضية الآمنة: سياق الأمان الأساسي
بدلاً من الاعتماد على المطورين لكتابة سياق أمان صحيح، يجب أن تُعدِّل المنصة مواصفات الـ Pod وقت القبول لحقن الإعدادات الافتراضية الآمنة. كل أساس عمل يجب أن يشمل:
runAsNonRoot: truereadOnlyRootFilesystem: trueallowPrivilegeEscalation: falseseccompProfile.type: RuntimeDefaultcapabilities.drop: [ALL]— أضف فقط ما هو مطلوب صراحةً
تخصيص التكاليف والمحاسبة
تعدد المستأجرين بدون رؤية للتكاليف يخلق مأساة الموارد المشتركة: الفرق تُضخِّم المطالبات لأنها لا ترى الفاتورة. يجب أن تُصدر المنصة بيانات التكلفة لكل نيمسبيس. OpenCost (CNCF) أو Kubecost يمكن نشرهما كخدمة منصة لإنتاج تقارير الإنفاق لكل فريق. تسمية app.kubernetes.io/team التي تفرضها سياسة Kyverno هي مفتاح الربط.
vCluster للعزل الأقوى بدون تكلفة عنقود كاملة
عندما يحتاج فريق إلى عزل على مستوى العنقود — خادم API منفصل، عالم RBAC منفصل — لكن توفير EKS/GKE كامل لكل فريق مكلف جداً، يُوفِّر vcluster (من Loft Labs) virtualisation لـ control plane داخل نيمسبيس بالعنقود المضيف. يرى المستأجر خادم API حقيقي؛ العنقود المضيف يرى فقط Pods. هذا هو النمط الذي تستخدمه Datadog وعدة منصات SaaS كبيرة.
حوكمة الضمانات: التدقيق والتجاوز ومخارج الطوارئ
السياسات الصارمة التي تحجب العمل المشروع تولِّد IT الظل: المهندسون يتحايلون على المنصة بدلاً من العمل معها. كل ضمان يجب أن يكون له مخرج طوارئ موثَّق ومُدقَّق. في Kyverno، يمكن للسياسات أن تعمل في وضع Audit (تُسجَّل الانتهاكات دون حجب) قبل الترقية إلى Enforce. كائن Kyverno PolicyException يوفر تجاوزاً مُدقَّقاً دون إزالة السياسة من العنقود بأكمله.