تطبيقات ArgoCD والمزامنة
تطبيقات ArgoCD والمزامنة
يُعدّ التطبيق (Application) الوحدة الأساسية في ArgoCD. يربط التطبيقُ مصدرًا في Git (مستودع + مسار + مراجعة مستهدفة) بوجهة في Kubernetes (كلستر + فضاء أسماء)، ويقارن باستمرار ما هو موجود في Git بما يعمل فعليًا في الكلستر. فهم آلية عمل حلقة المقارنة هذه وكيفية ضبطها هو الفارق بين سير عمل GitOps تثق به الفرق وسير عمل يولّد ضجيجًا وجهدًا يدويًا.
مانيفست التطبيق
تعرّف التطبيق كمورد Kubernetes مخصص (النوع Application، مجموعة API هي argoproj.io/v1alpha1) وتحفظه في Git، أو تنشئه عبر CLI أو واجهة المستخدم. الحقول الجوهرية هي spec.source (موقع الحالة المرغوبة)، وspec.destination (موضع التطبيق)، وspec.syncPolicy (كيفية وموعد المصالحة).
سياسات المزامنة: يدوية مقابل تلقائية
بدون syncPolicy.automated، يبقى التطبيق في حالة OutOfSync عند اكتشاف الانجراف لكنه لا يتصرف تلقائيًا. يجب على المهندس النقر على "Sync" في واجهة المستخدم أو تشغيل argocd app sync my-api. هذا هو الإعداد الافتراضي الصحيح لبيئات الإنتاج التي تستلزم بوابة بشرية — المزامنة التلقائية في الإنتاج قرار يتعلق بنضج الفريق وثقته، لا بالإمكانية التقنية.
عند تفعيل automated، تُزامن ArgoCD فورًا عند انجراف الحالة الحية عن Git. الحقلان الفرعيان الأهم:
prune: true— تُحذف الموارد الموجودة في الكلستر لكنها لم تعد موجودة في Git. بدون هذا الخيار، تترك المانيفستات المحذوفة نشرات وخدمات وConfigMaps يتيمة تعمل خفية إلى الأبد — مصدر شائع لمفاجآت أمنية وتكلفية. فعّله وادمجه معPrunePropagationPolicy=foregroundلحذف التوابع قبل أصولها.selfHeal: true— إذا شغّل أحدهمkubectl applyمباشرةً على الكلستر ناقضًا بذلك عقد GitOps، تكتشف ArgoCD الانجراف خلال دورة الاستطلاع وتعيد الحالة الحية إلى Git في غضون ثوانٍ. هذا ما يُرسّخ ضمان مصدر الحقيقة الوحيد.
automated + prune في الإنتاج منذ اليوم الأول دون مراجعة الموارد الموجودة في الكلستر مقابل ما هو متتبَّع في Git. ستحذف ArgoCD بإخلاص كل شيء لا تجده في المسار المستهدف — بما في ذلك موارد تابعة لأنظمة أخرى أو أُنشئت يدويًا. حدّد هذه الموارد اليتيمة وأدرجها في Git أولًا.موجات المزامنة: ترتيب النشر
يطبّق Kubernetes جميع الموارد في عملية مزامنة بشكل متزامن افتراضيًا. يخلق ذلك مشكلات عندما يكون الترتيب مهمًا: نشر يعتمد على وجود ConfigMap، أو Job يجب أن يكتمل قبل بدء التطبيق، أو CRD يجب أن يكون موجودًا قبل نسخه. تحلّ ArgoCD هذه المشكلة عبر موجات المزامنة (sync waves).
عيّن رقم موجة لأي مورد عبر التعليق التوضيحي argocd.argoproj.io/sync-wave. تُطبَّق الموارد في الموجة -1 أولًا، ثم الموجة 0 (الافتراضية)، ثم الموجة 1، وهكذا. تنتظر ArgoCD حتى تصبح جميع موارد الموجة N سليمة قبل المضي في الموجة N+1.
التحكم في المزامنة من سطر الأوامر
يُعدّ سطر أوامر argocd أساسيًا لبرمجة عمليات المزامنة في خطوط أنابيب CI والاستجابة للحوادث. الأوامر الرئيسية:
argocd app sync --timeout مقترنًا بـargocd app wait --health كبوابة ما بعد النشر. يوقف هذا خط الأنابيب حتى يصل الطرح إلى حالة Healthy، مما يمنحك إشارة حقيقية بأن النسخة الجديدة تخدم الحركة قبل أن يعلن خط الأنابيب نجاح النشر. ادمجه مع تنبيهات على انتقالات Degraded في منظومة المراقبة.خيارات المزامنة الجديرة بالمعرفة
تتيح لك قائمة spec.syncOptions ضبط السلوك لكل تطبيق على حدة:
ApplyOutOfSyncOnly=true— يتخطى تطبيق الموارد المتزامنة بالفعل. يُسرّع المزامنة بشكل كبير للتطبيقات الكبيرة التي تضم مئات الموارد. فعّله لجميع التطبيقات التي تتجاوز ~20 موردًا.ServerSideApply=true— يستخدمkubectl apply --server-sideبدلًا من apply من جهة العميل. يُلغي خطأ "التعليق التوضيحي طويل جدًا" على CRDs وConfigMaps الكبيرة، ويتعامل بشكل صحيح مع ملكية الحقول عندما تديرها عدة متحكمات.RespectIgnoreDifferences=true— يأمر محرك المزامنة باحترام قواعدspec.ignoreDifferencesعند تقرير تطبيق مورد أم لا، لا فقط عند حساب حالة الفروق. يمنع إعادة التطبيق غير الضرورية على الموارد التي تديرها webhooks الاستيعاب.Replace=true(تعليق توضيحي على مستوى المورد) — يُجبر على تشغيلkubectl replaceبدلًا من apply للحقول غير القابلة للتغيير مثلspec.selectorفي Job. استخدمه بحذر — يحذف المورد ويعيد إنشاءه.
spec.ignoreDifferences لاستثناء مسارات JSON pointer محددة — مثل حقل caBundle الذي تحقنه cert-manager في كائنات MutatingWebhookConfiguration — لكي تتوقف ArgoCD عن الإبلاغ عن انجراف وهمي على موارد لا تملكها بالكامل.حلقة التغذية الراجعة للإصلاح الذاتي
مع تفعيل selfHeal: true، تعمل حلقة المصالحة باستمرار. عندما يشغّل مشغّل كلستر الأمر kubectl scale deployment my-api --replicas=1 خلال حادث طارئ، تكتشف ArgoCD انجراف عدد النسخ خلال دورة الاستطلاع التالية (ما يصل إلى 3 دقائق افتراضيًا، أو أسرع إن كان تسليم webhook سريعًا) وتُعيد النشر إلى عدد النسخ المُعلَن في Git. هذا مقصود — مصدر الحقيقة هو Git لا الكلستر الحي. إن احتجت إلى تجاوز مؤقت، فالإجراء الصحيح هو إيداع التجاوز في Git، والسماح لـArgoCD بتطبيقه، ثم التراجع عن الإيداع حين تنتهي الحادثة. يترك هذا مسارًا للتدقيق؛ أما أمر kubectl المجرد فلا يترك شيئًا.