GitOps والتسليم المستمر

مبادئ GitOps

3 دقيقة للقراءة

GitOps هي مجموعة من الممارسات التي تستخدم Git كمصدر الحقيقة الوحيد للبنية التحتية والتطبيقات التصريحية. لفرق المنصة، توفر GitOps قابلية التدقيق والاتساق وسير عمل صديق للمطورين.

ما هو GitOps؟

GitOps يطبق أفضل ممارسات DevOps على أتمتة البنية التحتية:

النشر التقليدي:
┌─────────────────────────────────────────────────────────┐
│  المطور → خط أنابيب CI → kubectl apply → المجموعة       │
│                                                         │
│  المشاكل:                                               │
│  ├── من نشر ماذا ومتى؟                                 │
│  ├── ما هي الحالة المطلوبة الحالية؟                    │
│  ├── كيف نتراجع؟                                       │
│  └── انحراف بين البيئات                                │
└─────────────────────────────────────────────────────────┘

GitOps:
┌─────────────────────────────────────────────────────────┐
│  المطور → Git Commit → وكيل GitOps → المجموعة           │
│                 │                                       │
│           ┌─────┴─────┐                                │
│           │ مستودع Git│ ← مصدر الحقيقة الوحيد          │
│           │ (الحالة   │                                │
│           │ المطلوبة) │                                │
│           └───────────┘                                │
│                                                         │
│  الفوائد:                                               │
│  ├── سجل تدقيق كامل (تاريخ git)                        │
│  ├── تراجعات سهلة (git revert)                        │
│  ├── مراجعات قائمة على PR للتغييرات                    │
│  └── تصحيح الانحراف التلقائي                           │
└─────────────────────────────────────────────────────────┘

مبادئ GitOps

المبادئ الأربعة المحددة من مشروع OpenGitOps:

# مبادئ GitOps
principles:

  1_declarative:
    description: "حالة النظام تُوصف تصريحيًا"
    example: "YAML manifests، Helm charts، Kustomize"
    benefit: "تكوين قابل للتكرار والإصدار"

  2_versioned:
    description: "الحالة المطلوبة تُخزن في Git"
    example: "جميع التغييرات تمر عبر Git commits"
    benefit: "سجل تدقيق، قدرة التراجع"

  3_pulled_automatically:
    description: "الوكلاء يسحبون التغييرات من Git"
    example: "ArgoCD، Flux يزامنان باستمرار"
    benefit: "لا حاجة لوصول خارجي للمجموعة"

  4_continuously_reconciled:
    description: "الوكلاء يضمنون تطابق الفعلي مع المطلوب"
    example: "كشف وتصحيح الانحراف"
    benefit: "بنية تحتية ذاتية الشفاء"

هيكل المستودع

تنظيم مستودع GitOps للنشر متعدد البيئات:

# هيكل مستودع GitOps الموصى به
gitops-repo/
├── apps/                        # تكوينات التطبيقات
│   ├── base/                    # التكوينات الأساسية (مشتركة)
│   │   ├── user-service/
│   │   │   ├── deployment.yaml
│   │   │   ├── service.yaml
│   │   │   └── kustomization.yaml
│   │   └── order-service/
│   │       └── ...
│   └── overlays/                # تجاوزات خاصة بالبيئة
│       ├── development/
│       │   ├── user-service/
│       │   │   ├── kustomization.yaml
│       │   │   └── patch-replicas.yaml
│       │   └── kustomization.yaml
│       ├── staging/
│       │   └── ...
│       └── production/
│           └── ...
├── infrastructure/              # تكوينات البنية التحتية
│   ├── crossplane/
│   │   ├── xrds/
│   │   ├── compositions/
│   │   └── claims/
│   └── platform/
│       ├── monitoring/
│       ├── ingress/
│       └── cert-manager/
├── clusters/                    # تكوينات خاصة بالمجموعة
│   ├── production/
│   │   ├── apps.yaml           # ArgoCD Application
│   │   └── infrastructure.yaml
│   └── staging/
│       └── ...
└── README.md

Kustomize لإدارة التكوين

Kustomize يمكّن التجاوزات الخاصة بالبيئة دون تكرار:

# apps/base/user-service/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - deployment.yaml
  - service.yaml
  - configmap.yaml
commonLabels:
  app: user-service
# apps/base/user-service/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service
spec:
  replicas: 1
  selector:
    matchLabels:
      app: user-service
  template:
    metadata:
      labels:
        app: user-service
    spec:
      containers:
        - name: user-service
          image: user-service:latest
          ports:
            - containerPort: 8080
          resources:
            requests:
              memory: "128Mi"
              cpu: "100m"
            limits:
              memory: "256Mi"
              cpu: "200m"
# apps/overlays/production/user-service/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - ../../../base/user-service
patches:
  - path: patch-replicas.yaml
  - path: patch-resources.yaml
images:
  - name: user-service
    newTag: v1.2.3
# apps/overlays/production/user-service/patch-replicas.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service
spec:
  replicas: 3
# apps/overlays/production/user-service/patch-resources.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service
spec:
  template:
    spec:
      containers:
        - name: user-service
          resources:
            requests:
              memory: "512Mi"
              cpu: "500m"
            limits:
              memory: "1Gi"
              cpu: "1000m"

استراتيجية الفروع

استراتيجيات مختلفة لإدارة البيئات:

# استراتيجيات الفروع لـ GitOps
strategies:

  environment_branches:
    structure:
      main: "الإنتاج"
      staging: "المرحلة التجريبية"
      development: "التطوير"
    workflow: "الترقية عبر الدمج/PR"
    pros: "فصل واضح"
    cons: "عبء إدارة الفروع"

  directory_based:
    structure:
      main_branch:
        - overlays/development
        - overlays/staging
        - overlays/production
    workflow: "فرع واحد، مجلد لكل بيئة"
    pros: "نموذج فروع أبسط"
    cons: "جميع البيئات في فرع واحد"
    recommended: true

  repo_per_environment:
    structure:
      gitops-dev: "تكوينات التطوير"
      gitops-staging: "تكوينات المرحلة التجريبية"
      gitops-prod: "تكوينات الإنتاج"
    workflow: "الترقية عبر مزامنة المستودع"
    pros: "عزل قوي"
    cons: "مستودعات متعددة للإدارة"

إدارة الأسرار

التعامل مع الأسرار بأمان في GitOps:

# خيارات الأسرار لـ GitOps
secrets:

  sealed_secrets:
    tool: "Bitnami Sealed Secrets"
    approach: "تشفير الأسرار في Git"
    example: |
      apiVersion: bitnami.com/v1alpha1
      kind: SealedSecret
      metadata:
        name: db-credentials
      spec:
        encryptedData:
          password: AgBy8hC...مشفر...

  external_secrets:
    tool: "External Secrets Operator"
    approach: "الإشارة للأسرار من مخزن خارجي"
    example: |
      apiVersion: external-secrets.io/v1beta1
      kind: ExternalSecret
      metadata:
        name: db-credentials
      spec:
        secretStoreRef:
          name: aws-secrets-manager
          kind: SecretStore
        target:
          name: db-credentials
        data:
          - secretKey: password
            remoteRef:
              key: production/db/password

  sops:
    tool: "Mozilla SOPS"
    approach: "تشفير الملفات مع KMS/GPG"
    integration: "ArgoCD + KSOPS plugin"

مقارنة أدوات GitOps

# أدوات GitOps
tools:

  argocd:
    model: "قائم على السحب"
    ui: "واجهة ويب غنية"
    multi_cluster: "مدمج"
    sync: "Application CRDs"
    best_for: "فرق المنصة، المؤسسات"

  flux:
    model: "قائم على السحب"
    ui: "يركز على CLI"
    multi_cluster: "عبر Kustomization"
    sync: "GitRepository + Kustomization CRDs"
    best_for: "أنقياء GitOps، الحد الأدنى من العبء"

  comparison:
    argocd_strengths:
      - "واجهة مستخدم أفضل للرؤية"
      - "ApplicationSets للحجم"
      - "تأهيل أسهل"
    flux_strengths:
      - "بصمة أصغر"
      - "أكثر أصالة GitOps"
      - "وحدة تحكم Helm مضمنة"

في الدرس التالي، سنُعد ArgoCD ونستكشف ApplicationSets لإدارة النشر على نطاق واسع. :::