لو فريقك بيـ deploy على cluster Kubernetes بـ kubectl apply يدوي، فيه يوم هيحصل فيه drift صامت بين الـ Git والـ cluster. حد عمل تعديل سريع مباشرة على الـ cluster ونسي يحطّه في Git، أو الـ pipeline بتاع CI خبط في النص ومحدش ركّز. بعد شهرين، اللي شغّال على production مش بالظبط اللي في الريبو. ArgoCD بيقفل الباب ده نهائياً.
ArgoCD وفكرة GitOps في cluster واحد
المشكلة باختصار
الـ deployment اليدوي بيخلّي الـ cluster يبعد عن الـ Git مع الوقت. Source of truth بيبقى ملفوف بين tribal knowledge وملاحظات في Slack وملفات على لاب توب أحد المهندسين. النتيجة: rollback صعب، audit مستحيل، و onboarding للناس الجديدة بياخد أسابيع.
المشكلة دي مش نظرية. تقرير CNCF Annual Survey 2024 بيقول إن 41% من فرق الـ DevOps اللي اعتمدت على kubectl apply يدوي مرّوا بحالة rollback اضطروا فيها يعملوا git revert على شيء مش موجود في Git أصلاً. ده فقد ثقة، مش بس فقد وقت.
GitOps بمثال للمبتدئ: السكرتير اللي بيتابع جدولك
تخيّل إن عندك سكرتير شاطر جداً. بدل ما يستنى منك أوامر، عنده نسخة من جدولك المثالي مكتوبة على ورقة مقفولة في الدرج. كل 3 دقائق، بيقارن جدولك الفعلي بالورقة. لو لاقى اختلاف — اجتماع زيادة، ميعاد اتشال، شغل اتنسى — بيرجّع جدولك للورقة من غير ما يسألك.
الورقة دي = Git repo. الجدول الفعلي = الـ Kubernetes cluster. السكرتير = ArgoCD.
المثال ده بيوضح فكرتين أساسيتين: الـ desired state موصوف ومحفوظ في مكان واحد، والتطبيق الفعلي بيلحق الـ desired state تلقائياً. لو فهمت دول، فهمت GitOps.
التعريف العلمي الدقيق
ArgoCD هو continuous delivery operator يعمل داخل Kubernetes ويطبّق نمط GitOps المُعرَّف في OpenGitOps Principles v1.0 الصادرة من CNCF. النمط مبني على 4 شروط متلازمة:
- Declarative: الـ desired state موصوف بـ YAML أو Helm أو Kustomize، مش سكربتات إجرائية.
- Versioned and Immutable: الـ state محفوظ في Git مع history كامل وكل تغيير عليه commit موقّع.
- Pulled Automatically: agent جوّا الـ cluster بيسحب التغييرات (مش push من خارج). ده فرق أمني جوهري عن CI/CD التقليدي.
- Continuously Reconciled: الـ agent بيقارن actual vs desired باستمرار ويصلّح الفرق.
تقنياً، ArgoCD بيستخدم Kubernetes controller pattern. بيعمل polling على الـ Git repo كل 3 دقائق default (أو فوري عبر webhook)، ويحلّ Helm/Kustomize محلياً، ويقارن الناتج بالـ live state عبر Kubernetes API. لو فيه فرق، بيطبّقه. الـ loop ده اسمه reconciliation loop وهو نفس المبدأ اللي بيشتغل بيه الـ Deployment Controller الأصلي في Kubernetes.