المستوى: مبتدئ — يكفي إنك فاهم إيه هو الـ Pod والـ Deployment، وعملت kubectl apply مرة أو اتنين قبل كده. مش محتاج خبرة سابقة في ArgoCD.
بعد ما تخلّص المقال ده، هتعرف تخلّي أي تعديل على الـ cluster يتسجّل في Git أولاً، ويترجع لحالته الصح لوحده في ثوانٍ لو حد عبث فيه يدوي. ده اللي بيسمّوه GitOps، والأداة اللي هننفّذ بيها اسمها ArgoCD.
GitOps و ArgoCD: الـ cluster اللي بيصلّح نفسه من Git
المشكلة باختصار
الطريقة الشائعة في فِرَق كتير: كل مهندس بيعمل kubectl apply أو kubectl edit على الـ cluster من جهازه. الطريقة دي بتفشل في حالتين. الأولى: محدّش يعرف الحالة الحقيقية للإنتاج دلوقتي، لأن آخر تعديل اتعمل في تيرمينال حد ومارَاحش لأي مكان. الثانية: لو حد عمل scale يدوي وقت ضغط، التعديل ده بيفضل موجود أسابيع من غير ما حد ياخد باله، وده اسمه configuration drift — فرق بين اللي مكتوب عندك واللي شغّال فعلاً.
افهمها بمثال: الترموستات
تخيّل ترموستات التكييف في البيت. انت مش بتقوله "اشتغل دقيقتين وبعدين قِف". انت بتقوله "خلّي الأوضة 24 درجة". ده كل اللي بتعمله. بعد كده الترموستات بيقيس الحرارة الحقيقية كل شوية، ولو لقاها 27 يشغّل التبريد لحد ما توصل 24، ولو حد فتح الشباك وسخّنت تاني، بيرجّع يبرّد لوحده. انت حدّدت الحالة المطلوبة بس، والجهاز هو اللي بيقارن ويصلّح باستمرار.
GitOps بيشتغل بنفس المنطق بالظبط. انت بتكتب الحالة المطلوبة للـ cluster (كام نسخة من الخدمة، أنهي إصدار، أنهي إعدادات) في ملفات YAML داخل Git. وبعدين فيه "ترموستات" اسمه ArgoCD قاعد جوّه الـ cluster، بيقارن اللي في Git باللي شغّال فعلاً، ولو لقى اختلاف بيصلّحه. علمياً: GitOps هو نموذج تشغيل بيخزّن الحالة المطلوبة للنظام بشكل تصريحي (declarative) في مستودع نسخ (Git)، وبيستخدم وكيلًا (agent) بيقارن الحالة الفعلية بالمطلوبة بشكل مستمر ويقرّبها منها — وده اللي اسمه reconciliation loop.
المبادئ الأربعة اللي لازم تفهمها
مبادرة OpenGitOps (تحت مظلة CNCF) بتلخّص GitOps في 4 مبادئ. لو حلّك كسر أي واحد منهم، انت لسه بتنشر سوفتوير، بس مش بتاخد فايدة GitOps الحقيقية:
- تصريحي (Declarative): الحالة المطلوبة مكتوبة كـ "بيانات" مش كأوامر متسلسلة. بتقول "عايز 3 نسخ" مش "شغّل نسخة 3 مرات".
- مُؤرشف وثابت (Versioned & Immutable): الحالة محفوظة في Git، فكل تغيير له تاريخ وصاحب وإمكانية رجوع بـ
git revert. - يُسحب تلقائيًا (Pulled automatically): وكيل جوّه الـ cluster بيسحب الحالة من Git؛ محدّش بيعمل SSH وينشر بإيده.
- مُصالَح باستمرار (Continuously reconciled): الوكيل بيقارن الفعلي بالمطلوب في حلقة دائمة، ويصلّح أو يقولك ليه مش قادر.