Daha önce Kubernetes üzerinde Argo CD kurulumuna ve temel yapısına bu yazımda değinmiştim. Şimdi ise Argo CD’nin App ve Project kısımları için git reposunu gözettiği ve change/create durumlarında git reposunu takip edip Argo CD’de otomatik Project ve App oluşturma konularına değineceğim. Ayrıca Argo CD üzerine nasıl ekstra Cluster ekleyebileceğimize bakacağız. Son kısımda ise Argo UI üzerindeki options‘ları inceleyeceğiz.

argo cd

Kendi Kendini Yöneten Argo CD

Argo CD “App of Apps” modeline sahiptir. Bu her uygulamayı manuel olarak oluşturmak yerine programlı ve otomatik olarak Argo CD uygulamaları oluşturmamıza olanak tanır. 

Bir git reposuna yolu arayan Argo CD uygulaması oluşturduğumuzda ve tüm Argo CD uygulama tanım dosyalarını git reposuna eklediğimizde otomatik olarak uygulama Argo CD üzerinde tanımlanır. Bundan ilham alarak, herhangi bir Kubernetes nesnesi ve Argo CD’sinin kendisi otomatik oluşturulabilir veya yönetilebilir.

Git Repo Hiyerarşisini Tasarlama

Git reposu herhangi bir hiyerarşide tasarlanabilir. Genellikle Argo CD kurulumu, Argo CD Uygulamaları ve Argo CD Uygulama Projeleri için üç klasör oluşturmak yeterlidir.

Repository klasör yapısı:

argocd/
├── argocd-appprojects      # ArgoCD App Project'in yaml dosyalarını içeren klasör
├── argocd-apps             # ArgoCD Apps'in yaml dosyalarını içeren klasör
├── argocd-k8s              # ArgoCD için k8s üzerinde çalıştıracağımız yaml dosyalarını içeren klasör
├── sample-app              # k8s üzerinde ayağa kaldıracağımız bookinfo.yaml dosyasını içerir
├── argocd-install          # Argo Cd in ArgoCD için kurulum dosyalarını içeren klasör
  ├── argo-cd               # argo/argo-cd helm chart

App Of Everything Modelinin Oluşturulması

Daha önceden hazırladığım git reposunu local’inize clone’layın. İçerisinde bulunan helm chart’ı kurulumdan önce en güncel hale getirmek için aşağıdaki adımları izleyebilirsiniz.

git clone https://github.com/sezersanlikan/argocd.git && cd argocd/argocd-install && rm -rf argocd && git clone https://github.com/argoproj/argo-helm.git && mv argo-helm/charts/argo-cd . && rm -rf argo-helm

Yukarıdaki komut benim git repomu indirir. Daha sonra eski argocd helm chartını siler. En güncel repodan indirir ve diğer helm chartları silerek sadece argocd helm chartını install klasöründe tutar. Bu kısım argo içerisine yüklediğimiz argo’nun güncel olması içindir.

  • “argocd” klasörü, Argo CD’sinin kendi kendini yönetmesi içindir. İçerisinde Argo CD’nin helm chart’ı bulunur.
  • “argocd-apps” klasörü, app of apps modelinin bir örneğidir. Bu klasörde yeni bir yaml oluşturulduğunda, argocd-apps uygulaması bu yaml’yi cluster’a otomatik olarak uygular ve böylece Argo CD uygulaması otomatik olarak oluşur.
  • “argocd-appprojects” klasörü, “argocd-apps” klasörüne benzer. Argo CD Uygulama Projelerinin otomatik olarak oluşturulmasından sorumludur.
  • “argocd-k8s” klasörü Kubernetes üzerinde argonun kendi kendini yönetmesi için kaldıracağımız yaml dosyalarını içerir.

Modelimizi oluşturmak için aşağıdaki argocd-k8s klasöründe bulunan aşağıdaki YAML dosyalarını Argo CD’nin kurulu olduğu namespace’te ayağa kaldıralım.

Repoları ve isimleri kendinize göre değiştirmeyi unutmayın.

1- Helm Chart reposunu Argo CD’ye ekleme

apiVersion: v1
kind: Secret
metadata:
  name: private-helm-repo
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repository
stringData:
  url: https://argoproj.github.io/argo-helm
  name: argocd-helm
  type: helm
kubectl apply -f argocd-k8s/argocd-helm-repo.yaml -n argocd

2- Git reposunu Argo CD’ye ekleme

apiVersion: v1
kind: Secret
metadata:
  name: my-private-repo
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repository
stringData:
  url: https://github.com/sezersanlikan/argocd.git

kubectl apply -f argocd-k8s/argocd-git-repo.yaml -n argocd

3- Projelerin otomatik oluşması için aşağıdaki YAML’ı Argo CD’ye ekleyelim

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: argocd
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  description: Argocd Project
  sourceRepos:
  - '*'
  destinations:
  - namespace: argocd
    server: https://kubernetes.default.svc
  clusterResourceWhitelist:
  - group: '*'
    kind: '*'
  orphanedResources:
    warn: false
kubectl apply -f argocd-k8s/project.yaml -n argocd

4- App’lerin ve Projelerin otomatik oluşması için aşağıdaki YAML’ı Argo CD’ye ekleyelim

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: argocd
  namespace: argocd
spec:
  project: argocd
  source:
    repoURL: https://github.com/sezersanlikan/argocd.git
    path: argocd-install/argo-cd
    targetRevision: HEAD
    helm:
      version: v3
      valueFiles:
      - values.yaml
  destination:
    namespace: argocd
    server: https://kubernetes.default.svc
  syncPolicy:
        syncOptions:
        - CreateNamespace=true
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: argocd-apps
  namespace: argocd
spec:
  project: argocd
  source:
    repoURL: https://github.com/sezersanlikan/argocd.git
    path: argocd-apps
    targetRevision: HEAD
    directory:
      recurse: true
      jsonnet: {}
  destination:
    server: https://kubernetes.default.svc
    namespace: argocd
  syncPolicy:
    automated:
      selfHeal: true
      prune: true
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: argocd-appprojects
  namespace: argocd
spec:
  project: argocd
  source:
    repoURL: https://github.com/sezersanlikan/argocd.git
    path: argocd-appprojects
    targetRevision: HEAD
    directory:
      recurse: true
      jsonnet: {}
  destination:
    server: https://kubernetes.default.svc
    namespace: argocd
  syncPolicy:
    automated:
      selfHeal: true
      prune: true
kubectl apply -f argocd-k8s/application.yaml -n argocd

Şimdi Argo CD’yi UI üzerinden kontrol ettiğinizde aşağıdaki şekilde 3 farklı box oluşmalı.

image 18

Örnek Demo Uygulama

Bu demoda, sadece “sample-app” namespace’ine erişebilen “sample-project” adlı bir uygulama projesi oluşturacağız ve bu projede “sample-app” adlı bir uygulama oluşturacağız.

Örnek Proje’nin Oluşturulması

Aşağıdaki içeriğe sahip bir YAML dosyası oluşturun ve onu git deponuzdaki uygulama projesi klasörüne yerleştirin. Benim yapımda bu klasör “argocd-appprojects” klasörüdür.

cat << EOF > argocd-appprojects/sample-project.yaml
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: sample-project
  namespace: argocd
spec:
  clusterResourceWhitelist:
  - group: '*'
    kind: '*'
  destinations:
  - namespace: sample-app
    server: https://kubernetes.default.svc
  orphanedResources:
    warn: false
  sourceRepos:
  - '*'
EOF

Değişiklikleri repoya gönderin.

git add argocd-appprojects/sample-project.yaml
git commit -m "Create sample-project"
git push

Argo CD her üç dakikada bir git deposunu kontrol eder. Birkaç dakika bekleyebilir veya “argocd-appproject” uygulamasının “Refresh” butonuna tıklayabilirsiniz.

Senkronizasyondan sonra “Sample Project” adında proje oluşturulduğunu görebilirsiniz. Argocd-appprojects kısmına tıklayıp bunu görmeniz mümkündür.

image 19

Örnek Uygulamanın Oluşturulması

Aşağıdaki içeriğe sahip bir YAML dosyası oluşturun ve onu git reponuzdaki uygulama klasörüne yerleştirin. Benim klasör yapımda bu klasör “argocd-apps” klasörüdür. Mevcut tüm alanlar ve parametreler için Argo CD dokümantasyonuna bakabilirsiniz.

cat << EOF > argocd-appprojects/sample-app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: sample-app
  namespace: argocd
spec:
  destination:
    namespace: sample-app
    server: https://kubernetes.default.svc
  project: sample-project
  source:
    path: sample-app/
    repoURL: https://github.com/kurtburak/argocd.git
    targetRevision: HEAD
  syncPolicy:
    syncOptions:
    - CreateNamespace=true
    automated:
      selfHeal: true
      prune: true
EOF

Değişiklikleri reponuza aktarın.

git add argocd-apps/sample-app.yaml
git commit -m "Create application"
git push

App içerisinde sample-app klasörü daha önce repo içerisinde olduğundan ekstra bir commit yapmanıza gerek yok.

Birkaç dakika içinde veya “argocd-apps”in refresh butonununa tıklayarak, UI’da “sample-app” oluşumunu gözlemleyebilirsiniz.

image 21
image 22

Kubectl komutları ile de doğrulama yapabilirsiniz.

kubectl -n sample-app get all
NAME                                  READY   STATUS    AGE
pod/details-v1-79f774bdb9-7sw9q       1/1     Running   112m
pod/productpage-v1-6b746f74dc-vwkdq   1/1     Running   112m
pod/ratings-v1-b6994bb9-rf7lk         1/1     Running   112m
pod/reviews-v1-545db77b95-pzcj9       1/1     Running   112m
pod/reviews-v2-7bf8c9648f-q8b6m       1/1     Running   112m
pod/reviews-v3-84779c7bbc-9nfp4       1/1     Running   112m

NAME                  TYPE        CLUSTER-IP      PORT(S)    AGE
service/details       ClusterIP   10.96.27.232    9080/TCP   112m
service/productpage   ClusterIP   10.96.72.223    9080/TCP   112m
service/ratings       ClusterIP   10.96.0.174     9080/TCP   112m
service/reviews       ClusterIP   10.96.115.169   9080/TCP   112m

NAME                             READY   UP-TO-DATE   AVAILABLE
deployment.apps/details-v1       1/1     1            1        
deployment.apps/productpage-v1   1/1     1            1        
deployment.apps/ratings-v1       1/1     1            1        
deployment.apps/reviews-v1       1/1     1            1        
deployment.apps/reviews-v2       1/1     1            1        
deployment.apps/reviews-v3       1/1     1            1

NAME                                        DESIRED   CURRENT   READY
replicaset.apps/details-v1-79f774bdb9       1         1         1    
replicaset.apps/productpage-v1-6b746f74dc   1         1         1    
replicaset.apps/ratings-v1-b6994bb9         1         1         1    
replicaset.apps/reviews-v1-545db77b95       1         1         1    
replicaset.apps/reviews-v2-7bf8c9648f       1         1         1    
replicaset.apps/reviews-v3-84779c7bbc       1         1         1

Argo CD’ye Harici Cluster Ekleme

Kubernetes üzerinde ayağa kaldırdığınız Argo CD uygulamanıza deploymentlar için 2. bir cluster eklemek istediğinizde aşağıdaki YAML dosyasını Argo CD’nin bulunduğu namespace üzerinde ayağa kaldırmanız yeterlidir.

Token, name, server kısımlarını kendi Cluster bilgilerinize göre değiştirmeyi ihmal etmeyin.

cat << EOF > add_cluster.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mycluster-secret
  labels:
    argocd.argoproj.io/secret-type: cluster
type: Opaque
stringData:
  name: mycluster.com
  server: https://mycluster.com
  config: |
    {
      "bearerToken": "<authentication token>",
      "tlsClientConfig": {
        "insecure": false,
        "caData": "<base64 encoded certificate>"
      }
    }
EOF
kubectl apply -f add_cluster.yaml -n argocd

Argo CD Deployment & Sync Seçenekleri

Bu kısımda Argo CD UI üzerindeki veya temelde project/app deployment ettiğinizde veya SYNC işlemini yaptığınızda kullanabileceğiniz seçenekleri inceleyeceğim.

image 24

Application Name: Oluşturacağınız uygulamanın ismini belirttiğiniz alandır.

Project Name: Uygulamanın oluşacağı projenin seçildiği alandır.

SYNC Policy: İki seçenek vardır. İlki “Manuel” ikincisi ise “Automatic” tir. Manuel seçildiğinde uygulama hiçbir zaman kendi kendine SYNC olmaz. UI üzerinden tetiklemeniz gerekir. Automatic seçildiğinde ise 2-3 dakika aralıklarla reponuzu kontrol edip uygulanayı SYNC tutar.

Set Deletion Finalizer: Bu seçenek işaretlendiğinde uygulamayı silme işleminde uygulama kaynakları basamaklandırılır. Yani silinmek üzere işaretlenmiş kaynakları tamamen silmeden önce Kubernetes’e belirli koşullar karşılanana kadar beklemesini söyler.

Skip Schema Validation: Seçildiğinde, YAML şemasını doğrulamayı atlar.

Auto-Create Namespace: Bu seçenek işaretlendiğinde namespace yoksa otomatik olarak create eder.

Prune Last: Seçildiğinde, eşitleme işleminin son dalgası sırasında anlık deploy edilen sürümde bulunmayan kaynakları kaldırır.

Apply Out Of Sync Only: Seçildiğinde, uygulama durumundan bağımsız olarak her kaynağı senkronize etmek yerine yalnızca uygulamadaki değiştirilen ve Senkronizasyon Dışı olan kaynakları senkronize eder.

Respect Ignore Differences: Argo CD’nin spec.ignoreDifferences tanımında yapılan yapılandırmaları senkronizasyon aşamasında da dikkate almasını sağlamak için kullanılır.

Server-Side Apply: Bu seçenek işaretlendiğinde kubectl komutunu –server-side parametresi ile çalıştırır.

Prune Propagation Policy:

  • Foreground: Argo CD tarafından kullanılan varsayılan Prune ilkesi. Bu seçenek ile Kubernetes bağımlı resource’ları silene kadar ana resource’un durumunu “deletion in progress” olarak değiştirir.
  • Background: Seçildiğinde, Kubernetes bağımlı veya bağımsız resource’ları hemen siler.
  • Orphan: Önce bağımlı resource’ları siler daha sonra bağımsız resource’ları siler.

Replace: Seçildiğinde Argo CD, Git’teki değişiklikleri uygulamak için varsayılan kubectl Apply yerine kubectl replace veya kubectl create işlemlerini yürütür. Bu eylem potansiyel olarak kaynakları yeniden oluşturacaktır ve dikkatle kullanılmalıdır.

Retry: Seçildiğinde, yapılandırılan yeniden deneme ayarlarına göre başarısız bir eşitleme işlemini yeniden dener:

  • Limit: Maksimum eşitleme denemesi sayısı
  • Duration: Saniye, dakika veya saat olarak her yeniden deneme işleminin süresi
  • Max Duration: Yeniden deneme işlemi için belirlenen maksimum süre
  • Factor: Başarısız deneme işleminden sonra “Duration” ‘ın çarpılacağı çarpan
image 26

Repository URL: Git veya HELM olarak eklediğiniz reponun seçildiği alan.

Path: App için eklediğiniz repodaki hangi dosya dizininin kontrol edileceğinin belirlendiği alan.

Destination: Uygulamanın deploy edileceği Cluster’ın seçildiği alan.

Namespace: Uygulamanın hangi namespace üzerinde ayağa kaldırılacağının belirlendiği alan.

Bu yazıyı yazarken kullandığım referanslar aşağıdaki gibidir;

Referans -1Referans -2