İçerik
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.
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ı.
Ö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.
Ö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/sezersanlikan/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.
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.
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
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;