هذا المقال يتطلب مستوى متوسط — لازم تكون فاهم أساسيات Kubernetes (Pod, Deployment, Service)، git، و YAML قبل ما تكمل.
لو فريقك لسه بيعمل kubectl apply يدوي من اللابتوب أو بيشغّل deploy.sh من GitHub Actions بصلاحيات cluster-admin، انت بتدفع ضريبة خفية كل أسبوع: حالة الإنتاج مش متطابقة مع git، أي مهندس يقدر يغيّر cluster من غير ما يفضل أثر في الـ history، والـ rollback بياخد 15 دقيقة بحث في Slack ودردشة "مين عمل إيه إمتى". ArgoCD بـ 4 أوامر بيقفل الفجوة دي ويخلّي git هو المرجع الوحيد للحقيقة.
المشكلة باختصار
الـ deploy التقليدي بيخلّي الـ cluster state يتشكّل من مصادر متعددة: commit في git، كوماند يدوي على اللابتوب، تعديل ad-hoc بـ kubectl edit ساعة 2 الفجر. النتيجة إن "اللي مكتوب في git" مش بالضرورة "اللي شغّال في الإنتاج". لما يحصل incident، أول 12 دقيقة بتروح في مقارنة الـ YAML الموجود في الـ repo مع الحالة الفعلية على الـ cluster.
GitOps بيقلب المعادلة: git هو المصدر الوحيد، وفي عميل (agent) ساكن جوّا الـ cluster بيـ pull التغييرات بانتظام ويطبّقها. أي ad-hoc edit بيتمسح تلقائياً خلال أقل من 3 دقايق. ده اللي اسمه continuous reconciliation.
GitOps في مثال بسيط قبل التعريف العلمي
تخيّل إن في محل تأجير دراجات، صاحب المحل عنده دفتر فيه قائمة الدراجات اللي مفروض تكون مركونة قدام المحل: 6 دراجات حمرا، 3 خضرا، 1 زرقا. كل ربع ساعة، الموظف بيخرج، يبص على الدفتر، يقارنه بالواقع، ويرتب الدراجات تطابق القائمة. لو زبون لقّط دراجة وغيّر مكانها، الموظف هيرجعها. ولو الصاحب عدّل في الدفتر كتب "5 حمرا"، الموظف هيشيل واحدة من الحمرا.
ArgoCD هو الموظف ده. git repo هو الدفتر. الـ cluster هو رصيف المحل. الـ desired state ينطبق على الواقع تلقائياً، والـ drift بيتصلّح من غير ما حد يلاحظ. ده الفرق الأساسي بين GitOps و "CI يدفع للـ cluster": في GitOps الـ cluster هو اللي بيسحب، مش حد بيدفعه.
التعريف العلمي الدقيق
GitOps مصطلح صاغته شركة Weaveworks في أغسطس 2017 على لسان Alexis Richardson. التعريف الرسمي اللي معتمد دلوقتي من OpenGitOps Working Group التابعة لـ CNCF بيقول إن نظام GitOps لازم يحقق 4 مبادئ غير قابلة للتفاوض:
- Declarative: الحالة المطلوبة موصوفة في ملفات (YAML/JSON)، مش في سكربتات أوامر.
- Versioned and Immutable: الحالة محفوظة في git مع تاريخ كامل وقابلة للـ rollback بأي commit.
- Pulled Automatically: العميل بيسحب من المصدر، مش حد بيدفعله.
- Continuously Reconciled: الفرق بين الحالة المطلوبة والحالة الفعلية بيتصلّح تلقائياً طول الوقت.
ArgoCD مشروع مفتوح المصدر بدأ في Intuit سنة 2018، ووصل لمستوى CNCF Graduated في ديسمبر 2022 (مع Argo Workflows و Argo Rollouts و Argo Events). تحت الغطا هو Kubernetes Operator بيستخدم CRD اسمه بيوصف "خد ملفات من repo X branch Y path Z، طبّقها على namespace W". الـ reconciliation loop بيشتغل كل 180 ثانية افتراضياً، وقابل للضبط.