الموارد المخصصة والمشغّلون
الموارد المخصصة والمشغّلون
يأتي Kubernetes مزوّداً بأنواع موارد مدمجة — Deployments وServices وConfigMaps — لكن قوّته الحقيقية تكمن في قابلية التوسّع. تتيح لك تعريفات الموارد المخصصة (CRDs) تعليم Kubernetes أنواعاً خاصة بنطاقك: Database أو TLSCertificate أو KafkaTopic. أما نمط المشغّل (Operator) فيُغلّف CRD بحلقة تحكّم تتصرف بناءً على حالة هذا المورد، وتُرمجّ المعرفة التشغيلية التي كانت ستعيش في دليل تشغيل يدوي. هكذا تُقدّم Datadog وConfluent وMongoDB وغيرها من شركات البنية التحتية للبيانات منتجاتها المبنية على Kubernetes بشكل أصيل.
ما هو تعريف المورد المخصص (CRD)؟
CRD هو بحد ذاته كائن Kubernetes API — مُخزَّن في etcd، تُديره الـ API Server — يُسجّل نقطة وصول REST جديدة ضمن group/version/kind محدد. بمجرد تطبيق CRD، يمكنك إنشاء موارد مخصصة (CRs) — أي نسخ من هذا النوع — باستخدام kubectl apply -f تماماً مثل Pods وDeployments، وتتولى الـ API Server التحقق من صحتها وفق مخطط OpenAPI v3 الذي أعلنته.
دورة الحياة بسيطة: ثبّت الـ CRD مرة واحدة (عادةً عبر Helm chart أو مانيفست تثبيت operator)، ثم أنشئ موارد مخصصة — الـ CRD يُعرّف الشكل، والـ CR يُمثّل البيانات.
spec. يمنحك المخطط التحقق من الصحة من طرف الخادم، والإكمال التلقائي في إضافات بيئات التطوير، والحماية من الأخطاء الإملائية في الإنتاج.
بعد تطبيق الـ CRD، إنشاء CR مطابق تماماً لأي كائن Kubernetes آخر:
نمط المشغّل (Operator)
الـ CRD وحده خامل — تُخزّنه الـ API Server، لكن لا شيء يتصرف بناءً عليه. المشغّل (Operator) هو متحكّم يراقب الـ CRs ويدفع الكتلة نحو الحالة المطلوبة المُعلنة فيها. هذه هي نفس حلقة المصالحة التي تُشغّل المتحكمات المدمجة (متحكم Deployment، متحكم StatefulSet)، لكنها مكتوبة بواسطتك أو بائع لتُرمجّ معرفة النطاق.
المصالحة: لاحظ، قارن، تصرّف
كل مشغّل يُنفّذ دالة Reconcile تستقبل طلباً (زوج namespace/name). يجب أن تكون الدالة idempotent — قد تُستدعى آلاف المرات. التدفق القياسي:
- احضر الـ CR من الـ API Server.
- احسب ما يجب أن تبدو عليه الكتلة بناءً على
spec. - قارن مع ما هو موجود فعلياً (الموارد المملوكة).
- تصرّف — أنشئ، حدّث، أو احذف الموارد المملوكة.
- حدّث status على الـ CR ليعكس الحالة الفعلية.
أُطر عمل مثل controller-runtime (Go، تستخدمها kubebuilder وOperator SDK) تتولى بنية الـ watch وقوائم العمل وانتخاب القائد. أنت تكتب الخطوات 1-5 فقط.
ownerReference. عند حذف الـ CR، يُتابع Kubernetes الحذف تلقائياً إلى جميع الموارد المملوكة — لا تحتاج إلى منطق finalizer مخصص في معظم الحالات.
بناء مشغّل: البداية السريعة مع Kubebuilder
Kubebuilder هو أداة التهيئة القياسية المبنية على Go، تُديرها مجموعة Kubernetes SIG API Machinery. تُولّد مانيفست CRD، وهيكل المتحكم، وتهيئة الـ webhook، وعلامات RBAC من سير عمل CLI واحد.
متى تبني مشغّلاً (ومتى لا تفعل)
تُضيف المشغّلات تكلفة تشغيلية حقيقية: أنت تملك الكود، وإصدار CRD وتحويله، ومسار الترقية. إطار القرار المستخدم في شركات التقنية الكبرى:
- ابنِ مشغّلاً عندما تمتلك مكوّناً ذا حالة مع منطق دورة حياة معقّد (failover، نسخ احتياطي، ترحيل مخطط، إعادة تشغيل متدرجة) لا يمكن التعبير عنه بـ Helm chart أو كائنات Kubernetes القياسية وحدها.
- استخدم مشغّلاً موجوداً لقواعد البيانات المعروفة وقوائم الرسائل وأكوام المراقبة — Prometheus Operator وcert-manager وCloudNativePG وStrimzi (Kafka) وKEDA تغطي الغالبية العظمى من حالات الاستخدام.
- لا تبنِ مشغّلاً للأحمال عديمة الحالة. Deployment + HPA + ConfigMap كافٍ في الغالب. ميزانية التعقيد حقيقية.
v1alpha1، لا يمكنك إزالة هذا الإصدار بدون webhook للتحويل ونافذة ترحيل. خطّط لسطح API بعناية قبل GA — اعمل عليه كما تعمل على REST API عام.
الـ Status Subresource والـ Conditions
الـ status subresource (مُفعَّل عبر subresources: status: {} في الـ CRD) يجعل status نقطة API منفصلة — الـ kubectl patch على /status لا يتطلب RBAC على المورد الرئيسي، وتحديثات spec لا تُدمّر الـ status بالخطأ. دائماً نمذج الـ status باستخدام نمط Conditions (مصفوفة من إدخالات type/status/reason/message/lastTransitionTime) — يتوافق هذا مع ما يتوقعه kubectl wait --for=condition=Ready وما يستعلم عنه لوحات SRE.
إتقان CRDs ونمط المشغّل يفتح لك قابلية التوسّع الكاملة لـ Kubernetes. كل مشروع cloud-native رئيسي — cert-manager وArgo CD وIstio وTekton وKEDA — هو في جوهره مشغّل. فهم كيفية عمله داخلياً يجعلك أكثر فعالية عند تشخيص الأخطاء في الإنتاج، ويؤهّلك لبناء مشغّلك الخاص عندما تستدعي الحاجة ذلك حقاً.