ArgoCD ve Helm ile GitOps

ArgoCD ve Helm ile GitOps

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.

Enes UYSAL avatarı

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir