معمارية Flux
معمارية Flux
Flux هو محرك GitOps الثاني الرئيسي لـ Kubernetes، أنشأته Weaveworks (الذين ابتكروا أيضاً مصطلح "GitOps") وهو الآن مشروع CNCF متخرّج. حيث يقدم ArgoCD مستوى تحكم متكاملاً مع واجهة مستخدم غنية، يتبع Flux فلسفة مختلفة جذرياً: مجموعة أدوات قابلة للتركيب من متحكمات صغيرة ومُركّزة، كل منها مسؤولة عن مخاوف واحدة، تتواصل جميعها عبر تعريفات الموارد المخصصة لـ Kubernetes (CRDs). يُعدّ فهم معمارية Flux ضرورياً لأنها تُشكّل أساس بناء خطوط GitOps واسعة النطاق في شركات مثل Weaveworks وGrafana Labs وخدمة GitOps الخاصة بـ Microsoft Azure.
يغطي هذا الدرس عائلات المتحكمات الثلاث التي تُشكّل حلقة تحكم Flux — source وkustomize وhelm — والـ CRDs الذي ستكتبهما يومياً: GitRepository وKustomization.
فلسفة مجموعة الأدوات
Flux ليس ملفاً ثنائياً واحداً. إنه مجموعة من متحكمات Kubernetes — تُسمى GitOps Toolkit — مُثبَّتة كـ Deployments في namespace flux-system. المتحكمات الرئيسية هي:
- source-controller — يراقب المصادر الخارجية (مستودعات Git وسجلات OCI ومستودعات Helm وحاويات S3) ويجلب محتواها. يُعرض هذا المحتوى كخادم HTTP للقطع الأثرية داخل المجموعة لتستهلكه المتحكمات الأخرى.
- kustomize-controller — يقرأ CRD باسم
Kustomization، يسحب قطعة أثرية من source-controller، يُشغّلkustomize build، ويُطبّق النتيجة على المجموعة. على الرغم من الاسم، يمكنه تطبيق YAML عادي أيضاً — Kustomize اختياري. - helm-controller — يقرأ CRD باسم
HelmRelease، يسحب قطعة أثريةHelmChartمن source-controller، وينفّذ عمليات تثبيت/ترقية/استرجاع Helm. يحل محل الحاجة لتشغيلhelmبشكل أمري في خطوط CI. - notification-controller — يُوجّه الأحداث من كل المتحكمات الأخرى إلى الأنظمة الخارجية (Slack وTeams وPagerDuty وحالات commit على GitHub والـ webhooks). يُتيح هذا مراقبة غنية دون تلويث متحكمات التوفيق بمنطق الإشعارات.
- image-reflector-controller + image-automation-controller — يفحصان سجلات الصور بحثاً عن وسوم جديدة ويكتبان تلقائياً مراجع الصور المُحدَّثة إلى مستودع Git. هذا يُغلق الحلقة لخطوط التسليم المؤتمتة بالكامل.
تثبيت Flux: أمر Bootstrap
يُحضَّر Flux باستخدام أداة سطر أوامر flux، التي تُنشئ namespace flux-system وتُثبّت كل Deployments للمتحكمات وتُودع المانيفستات الناتجة في مستودع Git — فيُدير Flux نفسه فوراً عبر GitOps.
CRD GitRepository: source-controller بعمق
يُخبر كائن GitRepository الـ source-controller من أين يجلب المحتوى وكم مرة يفحص التغييرات. هو نقطة الدخول لأي خط GitOps مدعوم بـ Git. عندما ينجح source-controller في جلب مراجعة وأرشفتها، يُحدّث حقل .status.artifact للكائن بعنوان URL يشير إلى ملف tar على خادم HTTP المدمج — تُرجع إليه المتحكمات الأخرى لتنزيل المانيفستات دون الحاجة لبيانات اعتماد Git بأنفسها.
بعد التطبيق، يمكنك فحص حالة القطعة الأثرية بـ flux get source git gitops-fleet. المخرج الصحي يُظهر عنوان URL غير فارغ في عمود ARTIFACT REVISION. إن كان العمود فارغاً أو يُظهر failed، تحقق من kubectl -n flux-system describe gitrepository gitops-fleet — يشرح قسم Conditions بالضبط ما الذي فشل (خطأ مصادقة، تعارض مفتاح SSH، انتهاء مهلة الشبكة، إلخ).
CRD Kustomization: kustomize-controller بعمق
يُوجّه CRD Kustomization (لا يُخلط مع ملف kustomization.yaml الخاص بـ Kustomize) الـ kustomize-controller لأخذ قطعة أثرية من مصدر، تمريرها اختيارياً عبر Kustomize، وتطبيق النتيجة على المجموعة. هو كائن التوفيق الأساسي الذي ستُنشئه لكل حمل عمل.
prune: true: بدون prune: true، ستبقى الموارد المحذوفة من Git في المجموعة إلى أجل غير مسمى. هذا هو المصدر الأكثر شيوعاً لموارد "الأشباح" في المجموعات التي يُديرها Flux — Deployments وServices وCronJobs القديمة التي لا أحد يتذكرها لكنها لا تزال تستهلك موارد وتُعطّل الأمور أحياناً. اضبط دائماً prune: true في الإنتاج. مخاطر الحذف العرضي تُخفَّف بحقيقة أن الحذف نفسه هو git commit يمكن عكسه.متحكم Helm وCRD HelmRelease
يُلغي helm-controller الحاجة لتشغيل helm upgrade --install في خطوط CI، الذي يكون عديم الحالة وصعب المراقبة. بدلاً من ذلك، تُعلن حالة إصدار Helm المطلوبة في CRD HelmRelease والمتحكم يمتلك دورة حياة الإصدار الكاملة — التثبيت والترقية والاختبار والاسترجاع وإلغاء التثبيت — مُسجّلاً التاريخ في أسرار إصدار Helm تماماً كما تفعل أداة helm اليدوية.
HelmRelease مشترك بينما تأتي التجاوزات الخاصة بالبيئة من ConfigMap يُشار إليه بـ valuesFrom. هذا يتجنب تكرار كتل values بأكملها عبر كائنات HelmRelease للتجهيز والإنتاج — سبب شائع لانجراف الإعدادات عندما تنسخ الفرق المانيفستات. استخدم spec.valuesFrom مرجعاً إلى ConfigMap أو Secret لأي قيم تختلف بين البيئات.مراقبة توفيق Flux في الوقت الفعلي
فهم حالة التوفيق أمر حرج لتشخيص عمليات النشر. يوفر Flux مراقبة من الدرجة الأولى عبر CLI وأحداث Kubernetes.
أنماط فشل الإنتاج وكيفية تشخيصها
أكثر أنماط فشل Flux شيوعاً في الإنتاج، وكيفية حل كل منها:
- GitRepository عالق على "GitOperationFailed": تقريباً دائماً بسبب تدوير مفتاح SSH أو انتهاء صلاحية رمز GitHub. تحقق من Secret المُشار إليه بـ
secretRef، أعد إنشاءه ببيانات الاعتماد الجديدة، ثمflux reconcile source git <name>. - Kustomization "health check timeout": مورد طُبّق بواسطة Flux فشل في فحص جاهزيته الخاص (مثلاً، Deployment لا يصل لعدد نسخه المطلوب). الـ Kustomization نفسه سليم — الحمل الأساسي ليس كذلك. شخّص الحمل مباشرة:
kubectl describe podوkubectl logs. - HelmRelease عالق في "upgrade retries exhausted": قيم الـ chart غير صالحة أو الـ chart به خلل. سيكون Flux قد استرجع تلقائياً إن كان
remediateLastFailure: true. افحص تاريخ Helm:helm history ingress-nginx -n infrastructureلترى أي مراجعة فشلت وما الخطأ الذي أعاده Helm. - لا يُصحَّح الانجراف: تحقق من انقضاء
intervalوأن.status.lastAppliedRevisionللـ Kustomization يتطابق مع HEAD في Git. عدم التطابق يعني أن source-controller يملك محتوى جديداً لم يستهلكه kustomize-controller بعد — تحقق من سجلات source-controller.
الخلاصة
تُفصل معمارية مجموعة أدوات Flux الجلب (source-controller) من العرض (kustomize-controller) ومن الإصدار (helm-controller) في مكونات مستقلة وقابلة للاستبدال. CRD GitRepository هو نقطة دخولك لأي مصدر مدعوم بـ Git، وCRD Kustomization هو كائن التوفيق الذي يُترجم محتوى Git إلى حالة مجموعة حية. إتقان هاذين الـ CRDs — وفهم كيف يُفصل نموذج القطع الأثرية لـ source-controller معالجة بيانات الاعتماد عن التوفيق — هو الأساس لبناء خطوط Flux الإنتاجية المُغطّاة في الدروس التالية.