ArgoCD ile GitOps Tabanlı Kubernetes Deployment Stratejileri ve Otomasyonu

 · 

ArgoCD ile GitOps Tabanlı Kubernetes Deployment Stratejileri ve Otomasyonu

ArgoCD ile GitOps Tabanlı Kubernetes Deployment Stratejileri ve Otomasyonu

Kubernetes ortamlarında uygulama dağıtımı ve yönetimi, özellikle büyük ölçekli ve dinamik altyapılarda karmaşık bir süreçtir. Geleneksel imperative deployment yaklaşımları, manuel müdahaleye açık, hata olasılığı yüksek ve denetimi zor süreçler barındırır. Bu zorlukların üstesinden gelmek için GitOps prensipleri ve bu prensipleri uygulayan ArgoCD gibi araçlar ön plana çıkmaktadır.

GitOps, altyapı ve uygulama konfigürasyonlarını yönetmek için bir Git deposunu tek doğruluk kaynağı (single source of truth) olarak kullanan operasyonel bir çerçevedir. Bu yaklaşım, dağıtım süreçlerini otomatikleştirir, denetlenebilirliği artırır ve felaket durumlarında daha hızlı kurtarma sağlar.

GitOps'un Temel Prensipleri ve Kubernetes Entegrasyonu

GitOps, dört ana prensip üzerine kuruludur:

  1. Deklaratif Altyapı: Tüm sistem, Git'te deklaratif olarak açıklanır (YAML manifestleri, Helm chartları vb.).
  2. Sürüm Kontrolü: Deklaratif yapı, Git tarafından sürüm kontrolüne tabi tutulur. Her değişiklik kaydedilir, incelenebilir ve geri alınabilir.
  3. Otomatik Uygulama: Onaylanmış değişiklikler otomatik olarak altyapıya uygulanır. Manuel müdahaleye gerek kalmaz.
  4. Sürekli Mutabakat (Reconciliation): Bir ajan, Git deposundaki istenen durum ile canlı sistemdeki mevcut durumu sürekli karşılaştırır ve tutarsızlıkları düzeltir.

Kubernetes, doğası gereği deklaratif bir platformdur. Kaynaklar (Deployment, Service, Ingress vb.) YAML dosyaları aracılığıyla tanımlanır. Bu, Kubernetes'i GitOps için ideal bir aday yapar. GitOps ile Kubernetes'e yapılan her değişiklik, bir Git commit'i olarak başlar. Bu, değişikliklerin izlenebilirliğini, denetlenebilirliğini ve geri alınabilirliğini artırır.

ArgoCD: Kubernetes İçin GitOps Operatörü

ArgoCD, deklaratif ve sürekli dağıtımı destekleyen, Kubernetes için tasarlanmış bir GitOps sürekli teslimat (CD) aracıdır. Cluster içinde çalışan bir kontrolör olarak, belirlenen Git deposundaki Kubernetes manifestlerini (Helm chartları, Kustomize yapılandırmaları, saf YAML dosyaları) izler ve bu manifestlerde tanımlanan durumu Kubernetes cluster'ına uygular. Ayrıca, cluster'ın gerçek durumunun Git'teki istenen durumdan sapıp sapmadığını (drift detection) sürekli kontrol eder ve bu sapmaları otomatik olarak düzeltebilir.

ArgoCD Mimarisi

ArgoCD, temelde aşağıdaki bileşenlerden oluşur:

  • API Server: ArgoCD UI, CLI ve CI/CD pipeline'larının ArgoCD ile etkileşim kurduğu REST/gRPC sunucusu.
  • Repository Server: Kubernetes manifestlerini içeren Git depolarını önbelleğe alır ve işler. Helm chartlarını ve Kustomize dosyalarını render eder.
  • Application Controller: Ana kontrol düzlemidir. Git'teki istenen durumu Kubernetes'teki canlı durumla karşılaştırır ve senkronizasyon (sync) operasyonlarını tetikler.
  • Dex/Keycloak: SSO (Single Sign-On) entegrasyonu için kullanılır.

Gerçek Dünya Senaryosu: Mikroservis Uygulamasının ArgoCD ile Dağıtımı

Bir e-ticaret platformunda, sipariş yönetimi, ürün kataloğu ve kullanıcı profili gibi mikroservisler Kubernetes üzerinde çalışmaktadır. Bu mikroservislerin her biri için ayrı bir Git deposu (kod deposu) ve tüm Kubernetes manifestlerini içeren merkezi bir Gitops manifest deposu bulunmaktadır. Hedefimiz, bu mikroservisleri dev, staging ve production ortamlarına güvenli, otomatik ve denetlenebilir bir şekilde dağıtmaktır.

1. ArgoCD Kurulumu

ArgoCD'yi Kubernetes cluster'ınıza kurmak oldukça basittir:

# ArgoCD için ayrı bir namespace oluşturun
kubectl create namespace argocd

# ArgoCD manifestlerini uygulayın
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

# ArgoCD API Server'a erişim için port-forward
kubectl port-forward svc/argocd-server -n argocd 8080:443 --address 0.0.0.0

İlk kurulumdan sonra ArgoCD UI'ya erişmek için admin parolasını almanız gerekir:

argocd admin initial-password -n argocd

2. Git Deposunun ArgoCD'ye Tanıtılması

Kubernetes manifestlerimizi içeren Git deposunu (örneğin git@github.com:my-org/kubernetes-manifests.git) ArgoCD'ye eklememiz gerekiyor. Bu depo, dev/order-service, staging/order-service gibi yollar içerecek.

# SSH ile özel bir depoyu ekleme (SSH anahtarını ArgoCD Secret'ına eklemeyi unutmayın)
argocd repo add git@github.com:my-org/kubernetes-manifests.git --ssh-private-key-path ~/.ssh/id_rsa

# HTTPS ile kullanıcı adı/parola kullanarak ekleme
argocd repo add https://github.com/my-org/kubernetes-manifests.git --username gitops-user --password 'secure-password'

3. Uygulama Tanımı (Application CRD)

ArgoCD'de dağıtılacak her bir uygulama veya mikroservis, bir Application Custom Resource Definition (CRD) objesi olarak tanımlanır. Bu obje, ArgoCD'ye hangi Git deposundan hangi yolu izlemesi ve hangi Kubernetes cluster'ına/namespace'ine dağıtım yapması gerektiğini söyler.

Örnek order-service-prod.yaml:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: order-service-prod
namespace: argocd
labels:
app.kubernetes.io/name: order-service
environment: production
spec:
project: default # Birden fazla proje tanımlayabiliriz
source:
repoURL: https://github.com/my-org/kubernetes-manifests.git
targetRevision: HEAD # Genellikle 'HEAD' veya belirli bir branch (örneğin 'main')
path: prod/order-service # Manifestlerin bulunduğu yol
destination:
server: https://kubernetes.default.svc # Dağıtım yapılacak cluster (bu durumda aynı cluster)
namespace: order-service-prod # Uygulamanın konuşlanacağı namespace
syncPolicy:
automated: # Otomatik senkronizasyon ayarları
prune: true # Git'te kaldırılan kaynakları cluster'dan da kaldır
selfHeal: true # Cluster'daki drift'i otomatik düzelt
allowEmpty: false # Boş bir Git yolu durumunda hata ver
syncOptions:
- CreateNamespace=true # Hedef namespace yoksa oluştur
- ApplyOutOfSyncOnly=true # Sadece senkronize olmayan kaynakları uygula
retry: # Senkronizasyon başarısız olursa yeniden deneme politikası
limit: 5
backoff:
duration: 5s # İlk deneme sonrası bekleme süresi
factor: 2 # Her denemede bekleme süresini katlayarak artır
maxDuration: 3m # Maksimum bekleme süresi

Bu manifesti uyguladığımızda:

kubectl apply -n argocd -f order-service-prod.yaml

ArgoCD, order-service-prod uygulamasını izlemeye başlar. my-org/kubernetes-manifests deposunun prod/order-service yolundaki tüm kaynakları order-service-prod namespace'ine dağıtır ve sürekli olarak Git'teki durum ile cluster'daki durumu karşılaştırır.

4. Değişiklik Akışı ve Otomasyon

Bir geliştirici, order-service üzerinde yeni bir özellik geliştirir:

  1. Geliştirici, uygulama kod deposuna (my-org/order-service-app) bir Pull Request (PR) açar.
  2. Kod incelemesi ve testler tamamlandıktan sonra kod main branch'ine merge edilir.
  3. CI pipeline'ı tetiklenir, yeni bir Docker imajı (örneğin order-service:1.2.0) oluşturulur ve bir container registry'ye push edilir.
  4. CI pipeline'ı aynı zamanda my-org/kubernetes-manifests deposundaki prod/order-service/deployment.yaml dosyasındaki imaj etiketini 1.1.0'dan 1.2.0'a güncelleyen bir commit yapar ve bunu main branch'ine push eder.
  5. ArgoCD'nin Application Controller'ı, yapılandırılmış periyotlarla (varsayılan 3 dakika) my-org/kubernetes-manifests deposunu tarar.
  6. prod/order-service yolunda bir değişiklik (yeni imaj etiketi) algıladığında, order-service-prod uygulaması için OutOfSync durumuna geçer.
  7. syncPolicy.automated.selfHeal: true ve syncPolicy.automated.prune: true ayarları sayesinde, ArgoCD otomatik olarak Git'teki yeni durumu cluster'a senkronize eder. Bu, order-service podlarının yeni imajla güncellenmesi anlamına gelir.

5. Drift Detection ve Geri Alma (Rollback)

Bir SRE, bir sorun giderme sırasında yanlışlıkla order-service-prod deployment'ının replika sayısını manuel olarak 3'ten 1'e düşürdü:

kubectl scale deployment order-service -n order-service-prod --replicas=1

Bu manuel değişiklik, Git'teki deklaratif durumla (replicas: 3) canlı cluster'daki durumu (replicas: 1) arasında bir tutarsızlık (drift) yaratır. ArgoCD, kısa süre içinde bu sapmayı algılar ve selfHeal: true politikası nedeniyle deployment'ı otomatik olarak Git'teki deklaratif duruma (replicas: 3) geri döndürür. Bu, altyapı tutarlılığını sağlar.

Eğer yeni bir imaj etiketiyle (örneğin 1.2.0) yapılan dağıtım sonrası ciddi bir sorun yaşanırsa, geliştiriciler my-org/kubernetes-manifests deposundaki deployment.yaml dosyasını önceki stabil imaj etiketine (1.1.0) geri döndüren bir Git revert işlemi yapabilirler. ArgoCD, bu Git değişikliğini algıladığında, otomatik olarak order-service'i 1.1.0 imajına geri döndürecektir. Bu, felaket durumlarında hızlı ve denetlenebilir bir geri alma mekanizması sunar.

ArgoCD'nin Ötesinde: Gelişmiş Kullanım Senaryoları

  • Helm ve Kustomize Entegrasyonu: ArgoCD, Helm chartları ve Kustomize yapılandırmalarını doğal olarak destekler. Bu, karmaşık uygulama konfigürasyonlarının yönetimini basitleştirir.
  • ApplicationSet CRD: Monorepo yapıları veya birden fazla Kubernetes cluster'ına aynı uygulamayı dağıtmak gibi senaryolar için ApplicationSet CRD'si kullanılır. Bu, birden çok Application objesini tek bir yerden yönetmeyi sağlar. Örneğin, bir Helm chart'ı kullanarak birden çok ortama veya cluster'a aynı uygulamayı farklı değerlerle dağıtabilirsiniz.
  • Multi-cluster Deployment: ArgoCD, birden fazla Kubernetes cluster'ını yönetebilir. Her cluster, ArgoCD'ye bir Cluster kaynağı olarak eklenir ve uygulamalar belirli cluster'lara hedeflenerek dağıtılır. Bu, hibrit bulut veya çoklu bulut stratejileri için kritiktir.
  • SSO ve RBAC: Büyük ekipler için ArgoCD, Dex veya Keycloak gibi araçlarla SSO entegrasyonu sunar ve Kubernetes RBAC ile sıkı bir şekilde entegre olur. Bu, belirli kullanıcıların veya grupların hangi uygulamalara ve hangi operasyonlara (sync, delete, rollback) yetkili olduğunu kontrol etmeyi sağlar.

Sonuç

ArgoCD ile GitOps tabanlı Kubernetes deployment, modern DevOps pratiklerinin temelini oluşturmaktadır. Otomatik, denetlenebilir ve kendini iyileştiren dağıtım süreçleri, operasyonel yükü azaltır, hata oranlarını düşürür ve uygulama yaşam döngüsünü hızlandırır. Bu yaklaşım, sadece deployment süreçlerini basitleştirmekle kalmaz, aynı zamanda altyapı yönetimine şeffaflık ve güvenilirlik getirerek ekiplerin daha verimli çalışmasını sağlar. Özellikle kritik production ortamlarında, ArgoCD'nin sunduğu drift detection ve otomatik senkronizasyon yetenekleri, sistem tutarlılığını korumak için vazgeçilmezdir.

← Blog Listesine Dön