البنية التحتية ذاتية الخدمة
البنية التحتية ذاتية الخدمة
في عام 2010 كان المطور الذي يحتاج قاعدة بيانات ينتظر تذكرة دعم. كان فريق DBA يوفرها في أسبوعين. في عام 2025 يفتح المطور ذاته بوابة المطور الداخلية، يملأ نموذجاً — المحرك، الإصدار، فئة التخزين، جدول النسخ الاحتياطي — يضغط إنشاء، ويحصل على قاعدة بيانات جاهزة ومتوافقة مع السياسات في أربع دقائق. البنية التحتية لا تزال تُوفَّر عبر نفس واجهات برمجة السحابة. الفرق هو من يقودها، وما إذا كانت الحواجز تمنع النتائج السيئة لحظة اتخاذ القرار بدلاً من بعد مراجعة ما بعد الحادثة.
البنية التحتية ذاتية الخدمة هي القلب التشغيلي لمنصة المطور الداخلية (IDP) الناضجة. يتناول هذا الدرس النموذج ذا الثلاث طبقات الذي يجعلها تعمل: واجهات برمجة المنصة التي تجرّد التعقيد، ومستوى التحكم الذي يُوافق الحالة المطلوبة، والحواجز المُطبَّقة قبل إنشاء أي موارد. Crossplane يقع في مركز التطبيق المفتوح المصدر الأكثر تأثيراً لهذا النمط اليوم.
لماذا واجهات برمجة المنصة لا واجهات السحابة المباشرة
تكشف كل سحابة رئيسية عن آلاف أنواع الموارد عبر مئات أسطح واجهات برمجة التطبيقات. مثيل RDS واحد يتطلب قرارات حول مجموعات الشبكات الفرعية، ومجموعات المعاملات، وأدوار IAM، ومفاتيح KMS، وقواعد مجموعة الأمان، ونوافذ النسخ الاحتياطي، وحماية الحذف، وطوبولوجيا متعددة التوفر. المطور لا يجب أن يتخذ أياً من تلك القرارات — فهي قرارات تنظيمية، تُتخذ مرة واحدة، وتُرمَّز في واجهة برمجة المنصة.
واجهة برمجة المنصة هي تجريد موجَّه ومحدد تنظيمياً. بدلاً من aws_db_instance بخمسين سمة، يرى المطور PostgresDatabase بخمس سمات: الاسم، الحجم (صغير/متوسط/كبير)، البيئة، سياسة النسخ الاحتياطي، والفريق المالك. تُعيِّن واجهة برمجة المنصة تلك المدخلات الخمس إلى الخمسة والأربعين مدخلاً للبنية التحتية التي تعكس معايير مؤسستك. هذا هو المسار الذهبي من الدرس السابق مُطبَّق آلياً.
العقد الذي يجب أن تفي به واجهة برمجة المنصة:
- متبادلة: استدعاؤها مرتين بنفس المدخل ينتج نفس النتيجة؛ آمن لإعادة التطبيق عند الكشف عن انجراف.
- قابلة للرصد: يمكن للمستدعين استطلاع حالة طلبهم أو مشاهدتها؛ النظام يُصدر أحداثاً عند انتقالات الحالة.
- موثِّقة لنفسها: المخطط قابل للقراءة آلياً (OpenAPI أو Kubernetes CRD) بحيث تشتق منه البوابة وواجهة السطر والمحرك السياساتي من مصدر حقيقة واحد.
- قابلة للتدقيق: كل تعديل يحمل هوية الممثل، والطابع الزمني، والسبب — مكتوباً في سجل تدقيق غير قابل للتغيير قبل إجراء أي استدعاء لواجهة برمجة السحابة.
kubectl للوصول عبر السطر، وواجهة watch للحالة الفورية. مطوروك يعرفون بالفعل قراءة مانيفست YAML؛ لست بحاجة لبناء SDK عميل جديد.
Crossplane: مستوى التحكم كأساس للمنصة
يُمدد Crossplane كوبرنيتس ليصبح مستوى تحكم عالمياً لأي بنية تحتية. يُضيف ثلاثة أولويات فوق كوبرنيتس القياسي:
- Provider: حاوية متحكم تترجم موارد Crossplane إلى استدعاءات واجهة برمجة سحابة حقيقية (AWS، GCP، Azure، Vault، Helm، Terraform — هناك أكثر من 200 provider رسمي). يشحن كل provider بـ CRDs الخاصة به: CRD واحد لكل نوع مورد سحابي.
- CompositeResourceDefinition (XRD): يُعرِّف نوع واجهة برمجة المنصة المخصصة — مثلاً
PostgresDatabase— كمخطط CRD. هذا هو نوع المورد الذي يستهدفه المطورون ونماذج البوابة. - Composition: تعيين من مطالبة
PostgresDatabaseعالية المستوى إلى موارد provider منخفضة المستوى (VPC، مجموعة شبكة فرعية، دور IAM، مثيل RDS، سجل Route 53) مع جميع آراء المؤسسة مدمجة فيه.
حلقة التوفيق هي كوبرنيتس خالص: يُطبِّق مطور مانيفست PostgresDatabase؛ يقرأ متحكم Crossplane المركب الـ Composition ويُجسِّد موارد provider المكوِّنة لها؛ يُوافق كل متحكم provider تلك الموارد مع واجهة برمجة السحابة الحقيقية ويكتب الحالة عائداً. يشاهد المطور حقل الحالة في مطالبته؛ فريق المنصة لا يلمس تذكرة واحدة.
بمجرد تسجيل الـ XRD، يمكن للمطور المطالبة بقاعدة بيانات في أي namespace يملك صلاحية الكتابة فيه. لا يرى مجموعات معاملات RDS ولا معرفات الشبكات الفرعية ولا معرفات مفاتيح KMS — تلك تعيش في الـ Composition المملوك لفريق المنصة:
compositeDeletePolicy: Foreground. المطالبات الحالية تبقى على النسخة القديمة؛ المطالبات الجديدة تأخذ النسخة الجديدة. هذا يمنحك مسار ترحيل آمناً دون يوم تغيير جذري يكسر كل البنية التحتية الحالية. تستخدم أدوات المنصة الداخلية لـ Google نفس نموذج المراجعات — لا تُعدِّل البنية التحتية تحت أحمال العمل الجارية بدون نافذة انتقال.
طبقات التجريد: مجموعة مستوى التحكم
نادراً ما يُستخدم Crossplane وحده. تُرتِّب منصات الإنتاج طبقات متعددة من مستويات التحكم ومستويات التجريد. المجموعة القياسية على مقياس التقنية الكبرى تبدو هكذا، من أعلى تجريداً إلى أدناه:
- بوابة المطور / مانيفست GitOps: نقطة دخول المطور. يُصيِّر قالب Backstage نموذجاً، يلتزم بـ YAML لـ
PostgresDatabaseفي مستودع GitOps للفريق، ويزامن تطبيق Flux أو Argo CD إلى حزمة المنصة. - واجهة برمجة المنصة (Crossplane XRD / Claim): العقد التنظيمي. يتحقق من المدخلات، يُطبِّق اتفاقيات التسمية عبر خطاف قبول، يختم التسميات الافتراضية (مركز التكلفة، الفريق، البيئة)، ويوجِّه إلى الـ Composition الصحيح استناداً إلى البيئة.
- Composition: الرأي التنظيمي. يُعيِّن المطالبة إلى مجموعة من الموارد المُدارة مع جميع الإعدادات الافتراضية المتصلَّبة: التشفير في وضع السكون، متعدد التوفر للإنتاج، احتفاظ النسخ الاحتياطية، حماية الحذف، مجموعة الأمان التي تسمح فقط بـ CIDR pods التطبيق.
- موارد Provider المُدارة: طبقة ترجمة واجهة برمجة السحابة. CRD provider واحد لكل نوع مورد سحابي (مثل
RDSInstance،SubnetGroup،DBParameterGroup). يستدعي متحكم provider AWS SDK ويُوافق باستمرار. - مستوى تحكم السحابة (AWS/GCP/Azure): البنية التحتية الفعلية. يُصادق provider عبر IRSA/Workload Identity، يُجري استدعاءات API بأقل امتياز نطاقها حساب أو مشروع واحد لكل بيئة.
الحواجز: السياسة قبل التوفير
الخدمة الذاتية بدون حواجز هي مجرد إنفاق سحابي غير مُشرَف عليه. يجب أن تعمل الحواجز قبل إنشاء أي مورد، لا بعد أن يظهر ارتفاع التكلفة أو فحص الأمان انتهاكاً. ثلاث طبقات من الحواجز تعمل معاً في منصة ناضجة:
- التحقق من المخطط (XRD openAPIV3Schema): يرفض المطالبات المشوهة عند القبول. المطور لا يستطيع طلب
size: xlargeإذا كان التعداد يسمح فقط بصغير/متوسط/كبير. هذه بوابة متزامنة بزمن استجابة صفري. - سياسات قبول OPA/Kyverno: منطق أعمال لا يستطيع مخطط XRD التعبير عنه. أمثلة: موارد الإنتاج تتطلب تسمية مركز التكلفة؛ لا يجوز لـ namespace مطور توفير أكثر من ثلاث قواعد بيانات؛ الإصدار الرئيسي لـ RDS يجب أن يكون على القائمة المعتمدة. سياسات Kyverno هي CRDs بحد ذاتها — خاضعة للتحكم بالنسخ جنباً إلى جنب مع كود المنصة.
- الإعدادات الافتراضية المُطبَّقة بواسطة Composition: حتى لو قدَّم مطور مطالبة صالحة، تُطبِّق الـ Composition إعدادات عامة للمنصة لا يمكن تجاوزها:
deletionPolicy: Deleteفقط للتطوير، وOrphanللإنتاج؛ التشفير مُطبَّق بصرف النظر عما تقوله المطالبة؛ الحد الأدنى لاحتفاظ النسخ الاحتياطية 7 أيام في الإنتاج بصرف النظر عن قيمة حقلbackupPolicy.
crossplane beta render)، وانشر الفرق في الموارد المُصيَّرة قبل الدمج. في Spotify، كل PR لـ Composition يتضمن فرق الموارد المُصيَّرة كأثر مراجعة إلزامي.
أنماط الفشل الإنتاجية
تُظهر البنية التحتية ذاتية الخدمة أنماط فشل خاصة بها تختلف عن البنية التحتية الموفَّرة يدوياً:
- تتالي تقييد Provider: Composition تُنشئ عشرة موارد مُدارة في وقت واحد ستُجري عشرة استدعاءات لواجهة برمجة السحابة بالتوازي. على النطاق الواسع — 50 فريقاً يُنشئون قواعد بيانات في وقت واحد أثناء تدوير الأسطول — ستصطدم بحدود معدل API الخاص بـ AWS. تكشف providers لـ Crossplane عن علامتَي
--max-reconcile-rateو--poll-interval. اضبطهما: 10 كحد أقصى لمعدل التوفيق، و10 دقائق كفاصل استطلاع، نقطة بداية معقولة لـ RDS على مقياس 500 مورد. - موارد يتيمة من compositions فاشلة: إذا أنشأت Composition موارد A وB وC وفشل إنشاء C فشلاً دائماً، قد يبقى المورد A وB — مُفوتَران، غير محميَّان، غير مُراقَبَيْن. طبِّق متحكم تنظيف قائم على finalizer وأنذر على مطالبات
XPostgresDatabaseالعالقة فيSynced: Falseلأكثر من 30 دقيقة. - نطاق دور IRSA واسع جداً: كثير من الفرق تُنشئ دور IAM واحداً عابراً للحسابات لـ Crossplane provider بأكمله. حاوية provider مُخترَقة حينئذٍ لها وصول كتابة لجميع موارد السحابة في الحساب. استخدم ProviderConfig منفصلاً لكل بيئة وقيِّد كل دور IAM إلى نوع مورد واحد عبر مفاتيح الشرط (
rds:*فقط، لا*:*).
البنية التحتية ذاتية الخدمة المُنفَّذة بشكل جيد تكون غير مرئية للمطورين وقابلة للتدقيق للجميع الآخرين. يحصل المطور على قاعدة بيانات في أربع دقائق؛ يرى فريق الأمان مسار تدقيق كامل؛ يجد فريق المالية تسمية مركز التكلفة على كل مورد؛ يقضي فريق المنصة صفراً من الوقت على التذاكر. وقت التوفير الأربع دقائق — مع الامتثال الكامل للسياسات مدمجاً فيه — هو المقياس المنتجي الملموس الذي يُبرر بناء المنصة من الأساس.