GitOps Nedir?
Günümüz yazılım dünyasında deployment çıkmak terimine herkes aşinadır.
Deployment , yazılım uygulamanızın yeni versiyonunu canlıya dağıtma sürecidir. Bir nevi dağıtım mekanizmanızdır.
Bu dağıtım süreci PR kabul edilip, sonrasında push edilirse özetle Building – Testing – Staging – Deploy to Prod aşamalarından geçer.
GitOps metodunun temel amaci : Deployment sürecinde olan bir yazılımın , aşamaları geçtiğinde ulaşacağı son durak olan Cluster’ın CLI üzerinde Manuel müdahaleleri azaltmak, sistem yönetimini versiyonlanabilir hale getirmek ve sadece uygulama kodlarınızı değil, tamamiyle altyapıyı da(infrastructure) kod gibi ve Pull-Based yönetme şeklini benimser.
Bu sayede ekip çalışmasında kod değişikliklerinin ne zaman ve kim tarafından değiştirildiği hızlı tespit edilir ve hatalar hızlı bir şekilde bulunup revert edilebilir.
GitOps, Kubernetes manifest dosyalarının (deployment, service, ingress vb.) doğrudan Git üzerinde tutulduğu, versiyonlandığı ve otomatik olarak cluster’a uygulandığı bir yaklaşımdır. Yani artık kubectl değil, Git sizin tek gerçek kaynağınız (single source of truth) olur.
GitOps’un Temel Avantajları
- Audit ve Rollback Kolaylığı: Git geçmişi sayesinde yapılan tüm değişiklikler kayıt altındadır. Bir sorun çıktığında önceki versiyona dönmek bir git revert kadar basittir.
- Kod Gibi Infrastructure Yönetimi: Altyapı değişiklikleri Pull Request (PR) ile gerçekleştirilir. Bu sayede kod inceleme (code review) süreçlerine dahil edilebilir, hataların erkenden fark edilmesi sağlanır.
- CI/CD Entegrasyonu: GitOps, Continuous Delivery sürecini sadeleştirir. CI aşamasında test edilen bir manifest dosyası Git’e pushlandığında, GitOps aracı bu değişikliği otomatik olarak cluster’a uygular. Her şey versiyonlanmış ve izlenebilir olur.

Push-Based vs Pull-Based Model
Deployment modelleri genel olarak ikiye ayrılır: Push-Based ve Pull-Based

Özellik | Push Model | Pull Model |
---|---|---|
Dağıtımı tetikleyen | CI aracı (ör. Jenkins) | GitOps agent (örn. ArgoCD) |
Uygulama biçimi | Manuel tetikleme gerekir | Otomatik senkronizasyon (reconcile) |
Araçlar | Jenkins, GitLab CI | ArgoCD, Flux |
Push modelde, CI/CD pipeline kubectl apply komutlarını doğrudan çalıştırır. Ancak bu yaklaşımda dağıtım mantığı CI pipeline’ına gömülüdür ve cluster erişimi expose olabilir, bu da karmaşıklığı artırır.
Pull modelde ise ArgoCD gibi bir GitOps aracı, Git reposundaki değişiklikleri sürekli olarak izler ve cluster ile fark varsa otomatik olarak günceller. Bu yaklaşımda güvenlik ve yönetilebilirlik seviyesi daha yüksektir.
GitOps ile Deployment Süreci Nasıl İşler?
Minikube Üzerinde Uygulamalı Demo
Peki, pratikte bu sistem nasıl çalışıyor? İşte adım adım bir GitOps dağıtım süreci:

- Deployment YAML dosyası oluşturulur. Örneğin nginx-deployment.yaml adında bir dosyada uygulamanızın tüm tanımları yer alır.
- Bu dosya bir Git reposuna commit edilir. Reponun hangi dizinini takip edeceğini ArgoCD’ye tanıtırsınız.
- ArgoCD, Git reposunu sürekli olarak izler. Bir değişiklik tespit edildiğinde, yeni konfigürasyonu cluster’a otomatik olarak uygular.
- Uygulama ArgoCD tarafından senkronize edilir. Kullanıcı hatası riski azalır, güncellemeler izlenebilir ve geri alınabilir hale gelir.
Uygulama
Öncelikle windows veya mac üzerindeyseniz docker engine ve minikube yükleyebilirsiniz.
Docker Destop üzerinde minikube cluster içinde kurulumu yapacağız.
Minikube Clusterımızı yeterli kaynaklarla başlatalım
minikube start —memory=4096 —cpus=4
ArgoCD Kurulumu
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
Podların ayağa kalkması 5 dakikayı bulabilir.
ArgoCD Web UI’ye Erişim ve arkaplan (localhost’a port yönlendirme)
kubectl port-forward svc/argocd-server -n argocd 8080:443 &
Giriş bilgileri:
Kullanıcı adı: admin
Şifre: ilk başta bu komutla alınır
kubectl get secret argocd-initial-admin-secret -n argocd -o jsonpath="{.data.password}" | base64 -d && echo
Giriş sayfasına ulaşabilirsiniz.
Web arayüz: https://localhost:8080

Sonrasinda 1 Adet demo için bir github reposu oluşturacağız. İçinde basit bir nginx deployment olacak. Bu işlem için github profilinizde bir adet repo oluşturabilirsiniz. Sonrasında aşağıdaki adımları takip edebilirsiniz.
mkdir nginx-app
cd nginx-app/
cat <<EOF > nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
EOF
Github repo’suna push edelim
Ben Repository’nin adını gitops-apps olarak adlandırdım.
Eğer Cursor veya VScode kullanıyorsanız oradan yapabilirsiniz.
Terminal üzerinden push ederken access token isteyecektir.
Buradan token oluşturabilirsiniz >> https://github.com/settings/tokens
git init
git remote add origin https://github.com/kullaniciadiniz/gitops-apps.git
git add .
git commit -m "Initial nginx deployment"
git push -f origin main
Şimdi ArgoCD arayüzümüze geri dönelim ve New APP butonu >> EDIT AS YAML butonu ile devam edelim


Arayüzde >>
syncPolicy: automated:
prune: true
selfHeal: true
Bu yapı sayesinde ArgoCD, Git repo’daki değişikliği otomatik olarak cluster’a yansıtır. ‘Self-heal’ sayesinde manuel yapılan değişiklikler bile geri alınır.
EDIT AS YAML içeriğine aşağıdaki yaml dosyasını kopyalabilirsiniz.
repoURL kısmı sizin github repo linkiniz olmalıdır.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: nginx-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/kullaniciadi/gitops-apps.git
targetRevision: HEAD
path: .
destination:
server: https://kubernetes.default.svc
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true

Arayüzde Cluster Url: https://kubernetes.default.svc olmalıdır. Çünkü lokalde demo testi yapıyoruz.

Sonrasında CREATE butonu ile devam edebilirsiniz.
Aplikasyonunuz arayüzde görünmeye başlayacaktır. Eğer arayüzün solunda Synced sayısı 1 olmadıysa bir yerde hata yapmış olabilirsiniz.
Argo cd aslında şu anda Arzu edilen (Desired) ile Mevcut (active) statelerini senkronize etmiş durumdadır.

Şimdi git repo üzerinde deployment içerisinde küçük bir değişiklik yapalım ve replika sayısını değiştirelim
- gitops-apps reposuna geri dön.
- nginx.yaml dosyasına erişin ve replicas: 2 satırını replicas: 4 olarak güncelle.
- Commit ve push yap:
git add nginx-deployment.yaml
git commit -m "Update replicas to 4"
git push -f origin main
Git push ettiğiniz anda ArgoCD otomatik olarak bu değişikliği algılar ve cluster üzerinde günceller.
Web arayüzünden uygulamanın detaylarını ve güncellenen pod sayısını görebilirsin.

Repository Linkine tıkladıktan sonra son git push adımına kadar tüm push edilmiş versionları görebilirsiniz.

En son versiyonda ‘’Details ‘’ kısmından özet sütununda olan değişikleri görebilirsiniz.

Görüldüğü üzere son veriyondaki halinde replika sayısı 4 olarak güncellenmiştir.

Bu yazıda, GitOps’un temellerini ve ArgoCD ile nasıl uygulandığını adım adım inceledik. Basit bir nginx dağıtımı üzerinden yola çıkarak, gerçek dünyadaki çok daha kompleks dağıtımların da bu yaklaşımla nasıl yönetilebileceğine dair fikir sahibi olduk.
GitOps yaklaşımı; otomasyon, izlenebilirlik, ve sürdürülebilirlik açısından yazılım yaşam döngüsüne büyük katkı sağlıyor. Artık sadece uygulama kodları değil, altyapı konfigürasyonları da Git’te versiyonlanabiliyor.