GitOps Nedir? Argo CD ile Deploy’u Kodla Yönetin
GitOps nedir, neden önemlidir? Argo CD ile Kubernetes deploy süreçlerini Git üzerinden izlenebilir ve geri alınabilir hale getirin.
GitOps Nedir? Argo CD ile Deploy’u Kodla Yönetin
Meta Description
GitOps nedir? Argo CD ile Kubernetes deploy süreçlerini Git üzerinden yönetin, drift’i yakalayın, rollback’i saniyelere indirin.
Giriş
GitOps, altyapı ve uygulama dağıtımlarını “gerçeğin kaynağı” olarak Git üzerinden yönetme yaklaşımıdır. Ekip büyüdükçe “hangi YAML prod’da?”, “kim neyi deploy etti?”, “neden ortamlar farklı?” soruları çoğalır ve dağıtımlar bir süre sonra kişiye bağlı hale gelir.
Bu yazıda GitOps nedir sorusunu pratik bir çerçevede ele alacağız. Argo CD üzerinden, Kubernetes’e deploy akışını izlenebilir, tekrarlanabilir ve kolay geri alınabilir (rollback) hale getirmek için adım adım bir yol haritası çıkaracağız.
Okumaya değer çünkü: GitOps, sadece “daha havalı deploy” değil; hataları azaltır, denetimi güçlendirir ve release hızını artırırken güvenliği de iyileştirir.
GitOps Nedir? (Kısa Tanım + Mantık)
GitOps, Kubernetes (ve genel olarak altyapı) konfigürasyonunun Git’te tutulduğu ve bir “controller”ın cluster’ı Git’teki istenen duruma otomatik olarak senkronladığı bir modeldir.
Bu modelde:
- Git = Single Source of Truth (tek doğru kaynak)
- Değişiklikler PR/MR ile yapılır
- Cluster’da “elle müdahale” yerine controller uygular
- Gerçek durum ile istenen durum farklıysa buna configuration drift denir ve sistem bunu yakalar
“Bunu neden yapmalıyım?” Çünkü üretimde olan biteni Git commit’lerine bağlayarak kim/ne zaman/niye sorularını cevaplarsınız ve aynı değişikliği her ortamda aynı şekilde uygularsınız.
GitOps vs Klasik CI/CD: Fark Nerede?
Birçok ekipte CI/CD şu şekilde ilerler: CI pipeline build/test yapar, sonra CD adımı cluster’a “push” eder.
GitOps’ta ise deploy mantığı “push” değil, pull tabanlıdır:
| Başlık | Klasik CD (Push) | GitOps (Pull) |
|---|---|---|
| Deploy tetikleme | Pipeline cluster’a yazar | Cluster Git’ten çeker |
| Yetki modeli | CI sistemine geniş yetki | Cluster controller sınırlı yetki |
| Drift yönetimi | Zayıf / manuel | Güçlü / otomatik tespit |
| İzlenebilirlik | Pipeline loglarına bağlı | Git geçmişi + Argo CD history |
| Rollback | Pipeline + manuel | Git revert + sync |
Gerçek hayattan örnek:
- Bir geliştirici prod’da “acil” diye
kubectl editile değişiklik yapar. - 2 gün sonra başka deploy gelince o değişiklik kaybolur.
- GitOps’ta controller drift’i görür ve ya değişikliği geri alır ya da “OutOfSync” ile alarm üretir.
GitOps’un Temel Bileşenleri (Argo CD Odaklı)
GitOps yaklaşımında genelde şu parçalar bulunur:
1) Git Repo Yapısı
İki yaygın yaklaşım:
- Mono-repo: app kodu + manifests aynı yerde
- Config repo (ayrı repo): sadece deploy manifests (özellikle kurumsalda yaygın)
Önerilen basit yapı:
repo/
apps/
my-service/
base/
overlays/
dev/
prod/
2) Manifest Yönetimi (Kustomize/Helm)
- Kustomize: aynı base’i farklı ortam overlay’leriyle yönetmek için ideal
- Helm: paket yönetimi ve parametreli kurulumlar için güçlü
3) GitOps Controller (Argo CD)
Argo CD:
- Git repo’yu izler
- Cluster’a uygular
- Drift’i gösterir
- RBAC/SSO ile erişimi yönetir
- Sync/rollback işlemlerini kolaylaştırır
Adım Adım: Argo CD ile GitOps Kurulumu (Örnek Akış)
Aşağıdaki adımlar, kavramı oturtmak için minimal bir kurulum akışıdır.
1) Argo CD’yi Kubernetes’e Kurun
Namespace ve kurulum:
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
Argo CD UI erişimi için (örnek: port-forward):
kubectl -n argocd port-forward svc/argocd-server 8080:443
2) Örnek Uygulama Manifest’i Hazırlayın
Basit bir Deployment + Service örneği (repo’da apps/my-service/base/ altında dursun):
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-service
spec:
replicas: 2
selector:
matchLabels:
app: my-service
template:
metadata:
labels:
app: my-service
spec:
containers:
- name: my-service
image: nginx:1.25
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-service
ports:
- port: 80
targetPort: 80
3) Argo CD Application Tanımlayın
Argo CD’nin izleyip uygulayacağı kaynağı tanımlayın:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-service
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/ORNEK-ORG/ORNEK-REPO.git
targetRevision: main
path: apps/my-service/base
destination:
server: https://kubernetes.default.svc
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true
Uygulayın:
kubectl apply -f application.yaml
Neden automated + selfHeal?
selfHeal: drift oluşursa otomatik düzeltirprune: Git’ten silinen kaynağı cluster’dan da temizler
4) Değişiklik Yapın: “Deploy” Nasıl Oluyor?
Artık deploy için:
- Git’te manifest’i değiştirin (ör. image tag)
- PR açın, onaylayın
- Merge sonrası Argo CD senkronlar
Örnek değişiklik:
nginx:1.25→nginx:1.26
Bu kadar. CI tarafında “cluster’a apply” etmek zorunda değilsiniz.
5) Rollback (Geri Alma) Mantığı
GitOps’ta rollback:
- ya Git revert
- ya da eski commit’e dönüp Argo CD sync
Pratik yaklaşım:
- Üretimde sorun çıktı
- İlgili PR’ı revert edin
- Argo CD otomatik senkronlayıp önceki duruma döner
6) Drift’i Görünür Kılın (En Büyük Kazanç)
Klasik senaryoda birisi cluster’da manuel değişiklik yapar. GitOps’ta Argo CD bunu:
- UI’da OutOfSync olarak gösterir
selfHealaçıksa otomatik geri alır
Bu özellik özellikle:
- çoklu ekiplerde
- kritik prod ortamlarında
- denetim (audit) ihtiyacı olan şirketlerde çok hızlı değer üretir.
Ortam Yönetimi: Dev/Stage/Prod İçin Önerilen Model
GitOps’ta en sık yapılan hata: tüm ortamları tek dosyada yönetmeye çalışmak.
Öneri: Kustomize Overlay
Örnek yapı:
apps/my-service/
base/
deployment.yaml
overlays/
dev/
kustomization.yaml
prod/
kustomization.yaml
overlays/prod/kustomization.yaml örneği:
resources:
- ../../base
patches:
- target:
kind: Deployment
name: my-service
patch: |-
- op: replace
path: /spec/replicas
value: 4
Bunu neden yapmalıyım?
- Prod daha fazla replica ister
- Dev daha küçük kaynakla çalışır
- Aynı base üzerinden ortam farklarını yönetirsiniz
Güvenlik ve Operasyon İpuçları (Sık Yapılan Hatalar)
Aşağıdaki noktalar GitOps’un “gerçek” faydasını belirler:
- CI sistemine cluster admin vermeyin. GitOps’ta controller’ın yetkisi kontrollü olmalı.
- Secret yönetimini düz düşünmeyin. Secrets’ı repo’ya plain yazmak yerine SOPS/External Secrets gibi çözümleri değerlendirin.
- Branch stratejisi belirleyin.
mainprod mu? Yoksaenv/prodgibi branch mi? - PR onay akışı koyun. Özellikle prod değişiklikleri için en az 1-2 reviewer.
- Observability ekleyin. Sync hataları için alert (Slack/Email) kurgulayın.
Sık Sorulan Sorular (FAQ)
1) GitOps nedir, CI/CD’nin yerini mi alır?
Hayır. CI (build/test) yine gereklidir. GitOps genelde CD kısmını daha güvenli ve izlenebilir hale getirir.
2) Argo CD ile Flux arasında ne fark var?
İkisi de GitOps aracıdır. Argo CD, UI ve uygulama odaklı deneyimiyle çok popülerdir; Flux daha “Kubernetes-native” yaklaşımıyla tercih edilebilir.
3) GitOps yalnızca Kubernetes için mi?
En yaygın kullanım Kubernetes’tir; ancak prensip olarak altyapı konfigürasyonunu Git üzerinden yönetme yaklaşımı farklı ortamlara da uyarlanabilir.
4) Drift olursa ne yapmalıyım?
Önce drift’in kaynağını bulun (manuel müdahale mi, farklı pipeline mı). selfHeal açıksa Argo CD otomatik düzeltebilir; değilse uyarı üretip manuel aksiyon beklersiniz.
5) Prod’a yanlış manifest giderse nasıl hızlı geri dönerim?
En temiz yöntem ilgili değişikliği revert etmektir. Argo CD senkronlar ve ortamı önceki commit durumuna döndürür.
Sonuç
GitOps, deploy süreçlerini Git üzerinden yöneterek izlenebilirlik, güvenlik, standartlaşma ve hızlı rollback sağlar. Argo CD ile cluster’ınız Git’te tanımladığınız “istenen duruma” sürekli yaklaşır; drift’i yakalar ve operasyonel sürprizleri azaltır.
Bir sonraki adım: Mevcut bir servisiniz için küçük bir repo yapısı oluşturup Argo CD ile tek bir ortamda (dev) deneyin. Denediğiniz senaryoyu ve karşılaştığınız sorunları yorumlarda paylaşın; birlikte iyileştirelim.