ArgoCD ile Kubernetes Üzerinde GitOps Dönüşümü
Kubernetes cluster'larında manuel kubectl apply komutları veya karmaşık Jenkins pipeline'ları, yapılandırma sapmalarına (configuration drift) yol açar. ArgoCD, Git repository'sini tek doğruluk kaynağı (Single Source of Truth) kabul ederek, cluster durumunu deklaratif bir şekilde senkronize eder. Bu yaklaşım, sistemin istenen durumdan sapmasını otomatik olarak engeller.
ArgoCD Kurulumu ve Application Tanımlama
ArgoCD, kendi namespace'i içinde çalışan bir controller olarak dağıtılır. Kurulum sonrası, bir uygulamanın cluster üzerindeki yaşam döngüsünü yönetmek için Application CRD'si oluşturulmalıdır.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: production-app
namespace: argocd
spec:
destination:
server: 'https://kubernetes.default.svc'
namespace: prod-apps
project: default
source:
repoURL: 'https://github.com/organization/manifests.git'
path: k8s/overlays/production
targetRevision: HEAD
syncPolicy:
automated:
prune: true
selfHeal: trueYukarıdaki konfigürasyonda selfHeal: true parametresi, cluster üzerinde elle yapılan (out-of-band) değişiklikleri, Git repository'sindeki tanımlara göre otomatik olarak geri alır.
Production Senaryosu: Cluster Scaling ve Sync İşlemleri
Yüksek trafikli bir senaryoda, HPA (Horizontal Pod Autoscaler) tarafından oluşturulan pod'lar ile ArgoCD'nin senkronizasyon mekanizması bazen çakışabilir. ArgoCD, HPA tarafından yönetilen replicas gibi alanları yok sayacak şekilde ignoreDifferences ile yapılandırılmalıdır.
spec:
ignoreDifferences:
- group: apps
kind: Deployment
jsonPointers:
- /spec/replicasBu yapılandırma, ölçekleme event'lerinin sürekli bir 'Out-of-Sync' hatası tetiklemesini önler. GitOps süreçlerinde Helm Chart'ları veya Kustomize overlay'lerini merkezi bir repoda tutarak, environment'lar arası geçişleri (dev-staging-prod) sadece bir Git commit ile yönetebilirsiniz.
Güvenlik ve RBAC
ArgoCD API server'ına erişimi kısıtlamak için OIDC entegrasyonu zorunludur. Cluster rollerini argocd-rbac-cm ConfigMap'i üzerinden tanımlayarak, geliştiricilerin sadece belirli namespace'lerde sync işlemi yapabilmesini sağlayabilirsiniz.