DevOps and Infrastructure

بناء خطوط أنابيب CI/CD ذاتية الشفاء باستخدام GitHub Actions و ArgoCD لـ Kubernetes

في العصر الحديث للتطوير السحابي الأصلي، لا يُقاس سرعة التسليم فقط بمدى سرعة نشر الكود، بل بمدى سرعة التعافي من أي فشل. غالبًا ما تتوقف خطوط أنابيب CI/CD التقليدية في اللحظة التي يفشل فيها النشر، مما يتطلب تدخلًا يدويًا من المطور لإجراء التصحيح وإعادة النشر. وعلى الرغم من فعالية هذا النهج في الفرق الصغيرة، إلا أنه لا يوسع نطاقه بشكل جيد. هنا يأتي مفهوم خط الأنابيب الذاتي الشفاء: وهو نظام لا يكتشف فقط انحراف النشر أو فشل فحوصات الصحة، بل يقوم تلقائيًا بتفعيل خطوات التصحيح لاستعادة العنقود إلى الحالة المطلوبة.

من خلال دمج قوة التنسيق في GitHub Actions مع قدرات المزامنة الإعلانية في ArgoCD، يمكننا بناء بنية تحتية قوية ومؤتمتة تضمن بقاء عناقيد Kubernetes بصحة جيدة مع الحد الأدنى من التدخل البشري. يستكشف هذا المنشور هندسة ونظام تنفيذ مثل هذا النظام.

فهم الهندسة المعمارية

تعتمد الهندسة المعمارية المقترحة على نقاط قوة كل من الأداةين. حيث يعمل GitHub Actions كمحرك لمرحلتين "البناء" و"الاختبار"، بتنفيذ سير عمل معقد، وتشغيل الاختبارات الوحدوية، وبناء صور الحاويات. بمجرد دفع الصورة إلى مستودع، يتم وضع علامة عليها بأنها "جاهزة للإصدار".

من ناحية أخرى، يعمل ArgoCD كطبقة التسليم المستمر. فهو يراقب باستمرار مستودع Git بحثًا عن تغييرات في التكوين ويقارن الحالة الحية لعنقود Kubernetes بالحالة المطلوبة المعلنة. عند العثور على اختلاف - مثل فشل عملية إعادة النشر أو دخول البود في حالة CrashLoopBackOff - يمكن تكوين ArgoCD لمزامنة الحالة تلقائيًا. لتحقيق الشفاء الذاتي الحقيقي، نقوم بدمج فحوصات الصحة التي تثير عملية التراجع أو إعادة النشر عبر GitHub Actions، مما يخلق حلقة تغذية راجعة مغلقة.

تكوين GitHub Actions للبناء والنشر الآلي

الخطوة الأولى هي إنشاء خط أنابيب قوي ومؤتمت. نحتاج إلى سير عمل يبني صورة الحاوية الخاصة بك، ويدفعها إلى مستودع، ويحدّث مستودع Git مع علامات المخططات الجديدة. وهذا يضمن أن ArgoCD يمتلك دائمًا أحدث حالة للمزامنة.

name: CI/CD Self-Healing Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Build Docker Image
        run: docker build -t my-registry/my-app:${{ github.sha }} .
        
      - name: Push Image
        run: docker push my-registry/my-app:${{ github.sha }}
        
      - name: Update Manifest and Commit
        run: |
          kubectl set image deployment/my-app my-app=my-registry/my-app:${{ github.sha }}
          git config user.email "actions@github.com"
          git config user.name "GitHub Actions"
          git add k8s/deployment.yaml
          git commit -m "chore: update image to ${{ github.sha }}"
          git push

في هذا المثال، يقوم سير العمل بتحديث مخطط Kubernetes تلقائيًا بعلامة الصورة الجديدة عند نجاح البناء. هذا الإجراء يثير رابطًا آليًا (Webhook) إلى ArgoCD، مما يبدأ عملية المزامنة.

تنفيذ الشفاء الذاتي باستخدام ArgoCD

على الرغم من قوة ArgoCD، إلا أنه أداة مزامنة في المقام الأول. لجعله "ذاتي الشفاء"، يجب تكوينه للتفاعل مع حالات صحة محددة. يسمح ArgoCD بتعريف وظائف فحوصات الصحة وخيارات المزامنة الخاصة. لخط أنابيب ذاتي الشفاء، نعتمد عادةً على خيارات "Prune" و"Self-Heal"، ولكن للاسترداد الديناميكي، غالبًا ما نستخدم قدرة ArgoCD على تفعيل روابط آلية أو تكاملها مع فاحصي الصحة الخارجيين.

تخيل سيناريو حيث يكون النشر في حالة Synced ولكن صحة التطبيق هي False. قد تتضمن استراتيجية الشفاء الذاتي رابطًا آليًا يخطر نظام مراقبة، والذي يقوم بدوره بتفعيل إجراء GitHub للتراجع عن آخر إصدار ناجح في Git.

يمكنك تكوين التطبيق في مستودع GitOps الخاص بك لتمكين الشفاء الذاتي العدائي كالتالي:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/my-org/my-repo.git
    targetRevision: HEAD
    path: k8s
  destination:
    server: https://kubernetes.default.svc
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
      allowEmpty: false
    syncOptions:
      - PruneLast=true
      - CreateNamespace=true

مع selfHeal: true، سيقوم ArgoCD بتصحيح أي انحراف تلقائيًا. ومع ذلك، بالنسبة لفشل على مستوى التطبيق (مثل تكوين سيء يسبب انهيارًا)، فإننا غالبًا ما نربط هذا بإجراء GitHub يستمع إلى روابط الآلية الخاصة بـ ArgoCD. عندما يكتشف ArgoCD فشلًا لا يمكن للمزامنة إصلاحه، فإنه يطلق حدثًا. يمكن بعد ذلك لسير عمل GitHub Action مخصص تحليل السجلات، وإذا لزم الأمر، التراجع عن إيداع Git الذي تسبب في المشكلة.

التطبيق العملي: حلقة التغذية الراجعة

إن إنشاء الحلقة يتطلب سير عمل محدد يستمع إلى حدث رابط الآلية application/sync.failed من ArgoCD. يمكن بعد ذلك لهذا سير العمل إجراء تراجع في Git.

name: Auto-Rollback on Failure
on:
  webhook:
    types: [application_sync_failed]

jobs:
  rollback:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Identify Bad Commit
        run: |
          # Logic to identify the commit causing the failure
          git revert HEAD
      - name: Push Rollback
        run: |
          git config user.email "bot@argocd.io"
          git config user.name "ArgoCD Bot"
          git push

الخاتمة

يُعد بناء خطوط أنابيب CI/CD ذاتية الشفاء قمة ثقافة DevOps الناضجة. من خلال الاستفادة من GitHub Actions في المهام الشاقة للبناء والاختبار، وArgoCD للمصالحة المستمرة وإدارة الحالة، فإنك تنشئ نظامًا مرنًا بالتصميم. يقلل هذا النهج من متوسط وقت الاسترداد (MTTR) بشكل كبير، مما يسمح لفريقك بالتركيز على الابتكار بدلاً من إطفاء حرائق مشاكل النشر. بينما يتطلب الأتمتة الكاملة ضبطًا دقيقًا لتجنب الحلقات اللانهائية، فإن التوازن بين المزامنة الآلية واستراتيجيات التراجع الذكية يوفر أساسًا قويًا لموثوقية التطوير السحابي الأصلي.

Share: