DevOps and Infrastructure

GitHub Actions ve ArgoCD ile Kubernetes için Kendini İyileştiren CI/CD Pipeline'ları Oluşturma

Bulut-native geliştirme çağında, teslimat hızı genellikle kodu ne kadar hızlı dağıtabileceğinizle değil, bir arızadan ne kadar hızlı kurtulabildiğinizle ölçülür. Geleneksel CI/CD pipeline'ları, dağıtım başarısız olduğunda genellikle durur ve bir geliştiricinin manuel müdahale etmesini, hata ayıklamasını ve yeniden dağıtım yapmasını gerektirir. Bu yaklaşım küçük ekiplerde etkili olsa da, ölçeklendiğinde zayıf performans gösterir. İşte kendini iyileştiren pipeline kavramı: Dağıtım sapmasını veya sağlık kontrolü başarısızlıklarını sadece tespit etmekle kalmayıp, küme istenen bir duruma geri döndürmek için otomatik olarak düzeltme adımlarını tetikleyen bir sistem.

GitHub Actions'ın orkestrasyon gücünü ArgoCD'nin beyan uyumlu senkronizasyon yetenekleriyle birleştirerek, minimal insan müdahalesiyle Kubernetes kümelerinizin sağlıklı kalmasını sağlayan sağlam, otomatik bir altyapı oluşturabiliriz. Bu yazı, böyle bir sistemin mimarisini ve uygulamasını incelemektedir.

Mimariyi Anlamak

Önerilen mimari, her iki aracın da güçlü yönlerinden yararlanmaktadır. GitHub Actions, "Oluştur" ve "Test" aşamaları için motor görevi görür; karmaşık iş akışlarını yürütür, birim testlerini çalıştırır ve konteyner görüntülerini oluşturur. Görüntü bir kayıt defterine itildikten sonra, "yayına hazır" olarak işaretlenir.

ArgoCD ise sürekli dağıtım katmanı olarak hizmet verir. Git deposundaki yapılandırma değişikliklerini sürekli izler ve Kubernetes kümesinin canlı durumunu beyan edilen istenen durumla karşılaştırır. Bir uyumsuzluk bulunduğunda—örneğin bir dağıtım başarısız olduğunda veya bir pod CrashLoopBackOff durumuna girdiğinde—ArgoCD, durumu otomatik olarak senkronize edecek şekilde yapılandırılabilir. Gerçek bir kendini iyileştirme elde etmek için, GitHub Actions üzerinden bir geri alma veya yeniden dağıtım tetikleyen sağlık kontrolleri entegre ederiz ve böylece kapalı bir geri bildirim döngüsü oluştururuz.

Otomatik Oluşturma ve Dağıtım İçin GitHub Actions Yapılandırma

İlk adım, sağlam ve otomatik bir pipeline oluşturmak olmalıdır. Konteyner görüntünüzü oluşturacak, bunu bir kayıt defterine itecek ve yeni manifest etiketleriyle Git deposunu güncelleyecek bir iş akışına ihtiyacımız var. Bu, ArgoCD'nin her zaman senkronize edebileceği en son duruma sahip olmasını sağlar.

name: CI/CD Kendini İyileştiren Pipeline

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

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Docker Görüntüsü Oluştur
        run: docker build -t my-registry/my-app:${{ github.sha }} .
        
      - name: Görüntüyü İt
        run: docker push my-registry/my-app:${{ github.sha }}
        
      - name: Manifesti Güncelle ve Taahhüt Et
        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: görüntüyü ${{ github.sha }} sürümüne güncelle"
          git push

Bu örnekte, iş akışı başarılı bir oluşturma sonrası Kubernetes manifestini yeni görüntü etiketiyle otomatik olarak günceller. Bu taahhüt, ArgoCD'ye bir webhook tetikler ve senkronizasyon sürecini başlatır.

ArgoCD ile Kendini İyileştirmeyi Uygulama

ArgoCD güçlü olsa da, esas olarak bir senkronizasyon aracıdır. Onu "kendini iyileştiren" hale getirmek için, belirli sağlık durumlarına tepki verecek şekilde yapılandırılması gerekir. ArgoCD, özel sağlık kontrolü işlevleri ve senkronizasyon seçenekleri tanımlamanıza olanak tanır. Kendini iyileştiren bir pipeline için genellikle "Prune" (Temizleme) ve "Self-Heal" (Kendini İyileştirme) seçeneklerine güvenilir, ancak dinamik kurtarma için genellikle ArgoCD'nin webhook'ları tetikleme yeteneğini veya harici sağlık denetleyicileriyle entegrasyonunu kullanırız.

Dağıtımın Synced (Senkronize) durumunda olduğu ancak uygulamanın sağlığının False (Yanlış) olduğu bir senaryoyu düşünün. Kendini iyileştiren bir strateji, bir izleme sistemini bilgilendiren ve ardından son başarılı taahhüdü Git'e geri almak için bir GitHub Action'ı tetikleyen bir webhook içerebilir.

Agresif kendini iyileştirmeyi etkinleştirmek için GitOps deponuzdaki Uygulamayı aşağıdaki gibi yapılandırabilirsiniz:

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 ile ArgoCD, herhangi bir sapmayı otomatik olarak düzeltecektir. Ancak, uygulama düzeyindeki arızalar (kötü bir yapılandırmanın çökmesine neden olması gibi) için, bu genellikle ArgoCD olay webhook'larını dinleyen bir GitHub Action ile birleştirilir. ArgoCD, senkronizasyonun düzeltemeyeceği bir arıza tespit ettiğinde bir olay tetikler. Özel bir GitHub Actions iş akışı ardından logları analiz edebilir ve gerekirse soruna neden olan Git taahhüdünü geri alabilir.

Pratik Uygulama: Geri Bildirim Döngüsü

Döngüyü oluşturmak için ArgoCD'den gelen application/sync.failed webhook olayını dinleyen özel bir iş akışına ihtiyaç vardır. Bu iş akışı ardından bir git geri alması (revert) gerçekleştirebilir.

name: Başarısızlıkta Otomatik Geri Alma
on:
  webhook:
    types: [application_sync_failed]

jobs:
  rollback:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Kötü Taahhüdü Belirle
        run: |
          # Başarısızlığa neden olan taahhüdü belirlemek için mantık
          git revert HEAD
      - name: Geri Almayı İt
        run: |
          git config user.email "bot@argocd.io"
          git config user.name "ArgoCD Bot"
          git push

Sonuç

Kendini iyileştiren CI/CD pipeline'ları oluşturmak, olgun bir DevOps kültürünün zirvesidir. Oluşturma ve testleme gibi ağır işleri GitHub Actions'a, sürekli uzlaştırma ve durum yönetimi için ArgoCD'ye güvenerek, tasarım gereği dirençli bir sistem oluşturursunuz. Bu yaklaşım, Kurtarma Süresinin Ortalamasını (MTTR) önemli ölçüde azaltır ve ekibinizin dağıtım sorunlarıyla mücadele etmek yerine inovasyona odaklanmasını sağlar. Tam otomasyon, sonsuz döngülerden kaçınmak için dikkatli bir ayar gerektirse de, otomatik senkronizasyon ve akıllı geri alma stratejileri arasındaki denge, cloud-native güvenilirlik için güçlü bir temel sağlar.

Share: