Merhaba, bu yazımda ArgoCD ve GitOps’tan bahsedeceğim ve biraz da uygulama üzerine çalışacağız. Öncelikle GitOps nedir bundan başlayalım. Yazılım ya da altyapı alanlarında çalışmışsanız mutlaka git ile tanışmışsınızdır. Git, projenizin versiyon kontrolünü kolayca yapabilmenizi sağlayan bir araç olmanın yanında bir ekip ile çalışırken de olmazsa olmaz bir araçtır. Peki gitsiz yazılım geliştirmeyi hayal bile edemezken altyapı ile ilgili konfigürasyon v.s. dosyalarını düzenlerken neden gitin nimetlerinden faydalanmayalım ki? İşte burada karşımıza GitOps kavramı çıkıyor. Az önceki cümleden GitOps’un ne olduğunu büyük oranda anlamışsınızdır ama yine de bir tanım yapmak gerekirse GitOps, altyapıyı kod olarak sunarak Git depolarını altyapı konfigürasyonları için gerçeğin tek kaynağı yapmamızı sağlayan bir paradigmadır. GitOps için kullanılan en popüler araçlar ArgoCD ve Flux’tur. Konsept olarak benzeseler de ben ArgoCD ve Kubernetes özelinde konuşacağım. Şimdi 5 kişilik bir DevOps ekibinizin olduğunu ve ekipteki herkesin clusterda değişiklikler yaptığını düşünün. Ne kadar planlı çalışırsanız çalışın ekipte çakışmaların yaşanması kaçınılmazdır. Bunu halletseniz bile sistemin güncel halini tek bir yerde toplamak sorun olacaktır. ArgoCD burada şöyle bir yöntem izliyor. Öncelikle bir ArgoCD Application’ı oluşturuyoruz, Application içinde projemizin dosyalarının bulunduğu git reposunun urlini, projemizin çalıştığı clusterı ve namespace’ini tanımlıyoruz. Bunun üzerine ArgoCD periyodik olarak git reposundan dosyaları çeker ve clusterımızın o anki durumuyla karşılaştırır, değişiklik varsa cluster ile git reposunu senkronize eder. Aşağıdaki manifest dosyası ile ArgoCD’yi Kubernetes clusterımıza dahil edelim.
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
Tüm podlar hazır olana dek bekleyelim.
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 8d
argocd-applicationset-controller-c975f8bc5-hcz5s 1/1 Running 0 8d
argocd-dex-server-6bc6778ccd-87sb2 1/1 Running 0 8d
argocd-notifications-controller-6f8f44d4bb-xtrlv 1/1 Running 0 8d
argocd-redis-896595fb7-b6qqs 1/1 Running 0 8d
argocd-repo-server-6554c986cd-zsbkj 1/1 Running 0 8d
argocd-server-6b547bfb6b-flv2r 1/1 Running 0 8d
Tüm podlar yukarıdaki gibi hazırsa hemen örnek GitOps uygulamamıza geçelim. Uygulamamız için önce bir proje oluşturmamız gerekiyor. Aşağıdaki manifest dosyası ile ya da ArgoCD web arayüzü ile bu işlemi gerçekleştirebiliriz. Ben manifest dosyası üzerinden gideceğim.
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: gitops-example
namespace: argocd
spec:
clusterResourceWhitelist:
- group: '*'
kind: '*'
destinations:
- name: '*'
namespace: '*'
server: https://kubernetes.default.svc
sourceRepos:
- https://git.example.com/api/v4/projects/53/packages/helm/stable
Ardından projeyi aşağıdaki gibi clustera dahil ediyoruz.
kubectl apply -f project.yaml
project.yaml dosyası üzerine konuşacak olursak aslında yaptığımız işlem projede izin verilecek apiların grupların, namespacelerin yanında projeye hangi clusterların ve hangi repoların dahil edileceğini tanımlıyoruz. Bunu da hallettikten sonra uygulamamızı da aşağıdaki örnek manifest dosyası ile deploy edelim.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: example-app
namespace: argocd
spec:
destination:
name: in-cluster
namespace: default
project: gitops-example
source:
chart: example-chart
helm:
valueFiles:
- values.yaml
repoURL: https://git.example.com/api/v4/projects/53/packages/helm/stable
targetRevision: 0.1.0
kubectl apply -f app.yaml
app.yaml dosyasını biraz açmak gerekirse aslında yaptığımız şey ArgoCD’nin bulunduğu cluster ile Kubernetes deploymentımızın bulunduğu helm chartını eşleştirmek. Burada spec.project alanına kendi proje isminizi, spec.source.chart kısmına helm chartınızın ismini ve spec.source.repoURL kısmına ise helm chart reponuzun url’ini girmeniz gerekmekte. Eğer tüm işlemler doğru uygulanırsa beklediğimiz sonucu web arayüzünde görebileceğiz. Web arayüzü yayınlamak için isterseniz bir ingress tanımlayabilir isterseniz de ArgoCD servisinin portunu forward edebilirsiniz. Ben hızlı sonuç almak adına portu forward edeceğim.
kubectl port-forward -n argocd svc/argocd-server 8443:443
Bu işlemi de gerçekleştirdikten sonra daha önce bahsettiğim beklenen sonuç aşağıdaki gibi olmalıdır.
Bir yanıt yazın