المستوى المطلوب: محترف — الشرح مبني على فرضية إنك بتشغّل خدماتك على Kubernetes، وعارف يعني إيه kubectl apply و CI/CD pipeline. لو لسه في أول الطريق مع الحاويات، جهّز الأساسيات الأول ثم ارجع.
GitOps بـ Argo CD: خلّي Git هو المصدر الوحيد للحقيقة
لو فريقك بيعمل deploy بـ kubectl apply من داخل الـ CI pipeline، انت عمليًا مدّي مفاتيح عنقودك لأي حاجة تقدر تعدّل الـ pipeline. GitOps بيقلب الاتجاه: بدل ما الـ CI يدفع (push) التغييرات جوّه العنقود، وكيل ساكن جوّه العنقود بيـسحب (pull) الحالة المطلوبة من Git ويطبّقها بنفسه. المكسب المباشر: صلاحيات أقل بكتير، سجل تغييرات كامل، وتراجع في ثوانٍ.
المشكلة باختصار
النشر بالـ push بيخلّي أداة الـ CI ماسكة credentials للعنقود بشكل دائم. أي اختراق للـ pipeline بيتحوّل فورًا لاختراق للـ production. والأسوأ: مفيش مصدر واحد بيقول "إيه اللي شغّال دلوقتي فعلاً". أول ما حد يعمل kubectl edit بإيده على السيرفر تحت الضغط، العنقود يبقى مختلف عن الـ repo، ومحدش واخد باله. المشكلة دي ليها اسم: انحراف الإعدادات (configuration drift)، وهي السبب الخفي ورا نُص الحوادث اللي "الكود فيها متغيّرش".
الفكرة بمثال بسيط الأول
تخيّل ترموستات في أوضة. انت بتحدد الحرارة المطلوبة: 22 درجة. الترموستات بيقيس الحرارة الحالية طول الوقت، ولو لقى فرق بيشغّل التكييف لحد ما يوصل للرقم اللي انت طلبته. انت مش بتشغّل التكييف بإيدك؛ انت بس بتعلن الحالة المطلوبة، والجهاز بيقرّب الواقع منها باستمرار.
GitOps بيشتغل بنفس المبدأ بالظبط. الـ Git repo هو "الحرارة المطلوبة" — يعني الحالة المرغوبة. Argo CD هو الترموستات: بيقارن طول الوقت بين اللي مكتوب في Git واللي فعلاً شغّال في العنقود، وأي فرق بيصلحه لوحده.
الشرح العلمي الدقيق
Argo CD بيشغّل حلقة تسوية (reconciliation loop) مستمرة. كل دورة بيعمل أربع خطوات: يجيب الـ manifests من Git (الحالة المرغوبة / desired state)، يقرأ الحالة الفعلية (live state) من الـ Kubernetes API، يحسب الفرق (diff)، ولو فيه اختلاف بيعمل مزامنة (sync). لو فعّلت خاصية selfHeal، أي تعديل يدوي على العنقود بيترجّع تلقائيًا للحالة اللي في Git.
ده بيحقق مبادئ GitOps الأربعة كما عرّفها مشروع OpenGitOps: الحالة معلنة (declarative)، ومحفوظة بإصدارات غير قابلة للتعديل في Git (versioned & immutable)، ومسحوبة تلقائيًا (pulled automatically)، ومسوّاة باستمرار (continuously reconciled).
مثال تنفيذي
ده تعريف تطبيق (Application) كامل بيربط repo فيه manifests بـ namespace في العنقود. حطّه في ملف web-app.yaml: