ArgoCD kurulumu ve kullanım örneği

Onur BOLATOĞLU
5 min readMay 14, 2023

--

ArgoCD, Kubernetes ortamında sürekli dağıtım (continuous deployment) ve operasyonel otomasyon sağlayan bir araçtır.

ArgoCD, uygulamaların Kubernetes kümesinde güncel kalmasını sağlamak için kaynak denkleştirme, dağıtım, geri alma ve güncelleme gibi süreçleri otomatikleştirir. ArgoCD, bir Git deposundaki kaynak kodunu izler, değişiklikleri algıladığında yeni sürümleri tespit eder ve bunları Kubernetes kümesinde dağıtarak uygulamaların güncellenmesini gerçekleştirir.

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
  1. kubectl create namespace argocd: Bu komut, "argocd" adında bir Kubernetes isim alanı oluşturur. İsim alanı, Argo CD bileşenlerinin kurulacağı bir ortam sağlar.
  2. kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml: Bu komut, Argo CD'nin kurulumunu gerçekleştirir. -n argocd bayrağı, komutun "argocd" isim alanında çalışacağını belirtir. -f bayrağı, kurulum için kullanılacak YAML dosyasının belirtilmesini sağlar. Bu komut, Argo CD'nin istikrarlı (stable) sürümü için GitHub deposundan bir YAML dosyasını indirir ve bu dosyayı kullanarak Argo CD bileşenlerini kümeye dağıtır.
kubectl get all --namespace argocd

kubectl get all --namespace argocd komutu, belirli bir Kubernetes isim alanında (argocd) bulunan tüm kaynakların bir özetini almanızı sağlar.

Ek olarak servisi düzenleyebilir ve servis tipini ClusterIP’ten LoadBalancer’a değiştirebilirsiniz.

kubectl edit svc argocd-server -n argocd

Servisi değiştirdikten sonra, kullanıcıların varsayılan yönetici hesabının şifresini alması gerekecektir. Bu şifre bir “argocd-initial-admin-secret” adlı bir gizli (secret) içinde saklanmaktadır. Kubectl kullanarak, şifre değerini gizliden alabilirsiniz. Daha sonra, bir base64 çözücüsü kullanarak bu değeri çözebilir ve şifreye ulaşabilirsiniz.

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}"

Yukarıdaki komutunun çıktısını, aşağıdaki siteyi kullanarak decode etmeliyiz.

Ardıdan LoadBalancer ip adresini tarayıcımıza yazıp gidebilirsiniz.

User : admin
Pass : (Yukarıda decode edildi)

Kurulum işlemleri tamamlandı, sıra geldi örnek bir uygulmayı deploy etmeye, bunun için github’da bir repository oluşturup, kubernetes manifest dosyalarımızı tanımlıyoruz.

proje github url: https://github.com/Onurbolatogluu/argoCD-example-1

flask-app-pod.yml

Yukarıdaki Pod objesi, “flask-app-pod” adında bir Pod’u temsil eder ve Flask tabanlı bir web sayacı uygulamasını çalıştırmak için kullanılır.

  • metadata: Pod'un adını ve etiketlerini içerir. "flask-app-pod" adı, Pod'un benzersiz bir tanımlayıcısıdır. Ayrıca, "app: flask-app" etiketi Pod'u "flask-app" adlı bir uygulama ile ilişkilendirir. Etiketler, Pod'u gruplama, izleme ve diğer Kubernetes operasyonlarında kullanma amacıyla kullanılır.
  • spec: Pod'un yapılandırmasını içerir. Bu bölüm, Pod'un içerdiği birimleri (container) ve bu birimlerin yapılandırma ayarlarını tanımlar.
  • containers: Pod içinde çalışacak birimleri tanımlar. "flask-app" adında bir birim (container) belirtilir. Bu birim, "onurbolatogluu/flask-web-counter:v1" adlı bir Docker görüntüsünü kullanır. Görüntü, Flask tabanlı bir web sayacı uygulamasını içerir.
  • ports: Birim tarafından kullanılan ağ bağlantı noktalarını tanımlar. "containerPort: 5000" ifadesi, birimin içinde çalıştığı konteynerin 5000 numaralı bağlantı noktasını dinlediğini belirtir. Bu bağlantı noktası, dış dünyadan gelen istekleri kabul etmek için kullanılır.
flask-app-service.yml

Yukarıdaki Service objesi, “flask-app-service” adında bir Kubernetes Hizmetini temsil eder. Bu Hizmet, “flask-app” adlı Pod’lara yönlendirme yapmak için kullanılır.

  • metadata: Hizmetin adını ve diğer meta bilgilerini içerir. "flask-app-service" adı, Hizmetin benzersiz bir tanımlayıcısıdır.
  • spec: Hizmetin yapılandırmasını içerir. Bu bölüm, Hizmetin özelliklerini tanımlar.
  • selector: Hizmetin yönlendireceği Pod'ları belirler. "app: flask-app" ifadesi, Hizmetin "flask-app" etiketine sahip Pod'lara yönlendirme yapacağını belirtir. Bu etiket, Hizmetin ilgili Pod'ları belirlemesine yardımcı olur.
  • type: LoadBalancer: Hizmetin tipini belirler. "LoadBalancer" tipi, Hizmetin bir dış yük dengeleyici (load balancer) tarafından erişilebilir olmasını sağlar. Bu, Hizmetin dış dünyadan gelen istekleri dağıtması için bir yük dengeleyici sağlayıcısı tarafından atanan bir IP adresine sahip olacağı anlamına gelir.
  • ports: Hizmetin dinlediği bağlantı noktalarını tanımlar. Bu örnekte, Hizmet TCP protokolünü kullanarak 80 numaralı bağlantı noktasında dinleme yapar. Bu bağlantı noktası, dış yük dengeleyicisi tarafından erişilebilir olacak ve gelen istekleri "targetPort" olarak belirtilen 5000 numaralı bağlantı noktasına yönlendirecektir.
  • Manifest dosyalarını oluşturduktan sonra, argoCD’de bu repositoryi eklememiz gerekmektedir.
  • Ardından yeni bir app oluşturmamız gerekmektedir. Bu nedenle ana sayfada bulunan “new app” butonuna tıklıyoruz.
  • Uygulama oluştururken, source ve target kısımlarını Uygulamamızın bulunduğu konuma ve kubernetes clusterımıza göre dolduruyoruz. Source: Uygulamalarımızın konumunu temsil eder. Destination: Uygulamayı dağıtacağımız cluster’ı temsil eder. Ardından “Create” butonuna tıklayıp, uygulamayı oluşturuyoruz.

Uygulama oluşurken “ missing and out of sync “ hatasını görebilirsiniz. Bu ifade, ArgoCD’nin uygulamanın durumunu izlediğini ve uygulamanın ArgoCD üzerinde bulunduğunu, ancak K8s kümesine henüz dağıtılmadığını belirtir.

Uygulamanın ArgoCD üzerinde oluşturulduğunu ve K8s kümesine dağıtılmak üzere hazır olduğunu belirtmek için uygulamayı K8s kümesine dağıtmak gereklidir.

Applications ekranında bulunan uygulamaya tıkladığımızda, SYNC düğmesine tıklayarak uygulamayı senkronize etmeliyiz.

Sync işlemlerinin ardından, applications ekranını yenilediğimizde uygulamamızın başarılı bir şekilde oluşturulduğunu görebilirsiniz.

Tarayıcımızdan load balancer ip adresini yazıp, uygulamaya ulaşabilirsiniz.

argoCD ‘de uygulamaya ait ayarlara, applications menüsü altında, uygulamanın ismine tıklayıp ulaşabilirsiniz.

Update :

Yapınızda ingress objesi mevcutsa, ilgili uygulamayı ingress kullanarak dışarıdan erişilmesini spesifik bir şekilde yapılmasını sağlayabilirsiniz.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: flask-app-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: renkler.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: flask-app-service
port:
number: 80

Buradaki objeyi github repomuza ekliyoruz. Ardından kaydediyoruz.

Uygulamamızı tekrar sync ettiğimizde ingress objemiz oluşturuldu.

Böylelikle tanımladığımız domain ile uygulamaya giriş yapabiliriz.

--

--