ArgoCD dan GitOps - Panduan Praktis untuk Otomasi Deployment Kubernetes

ArgoCD dan GitOps - Panduan Praktis untuk Otomasi Deployment Kubernetes

Pelajari bagaimana ArgoCD mengimplementasikan prinsip GitOps untuk mengotomatisasi deployment Kubernetes. Panduan ini mencakup konsep inti, instalasi, dan pola dunia nyata untuk mengelola aplikasi secara deklaratif.

AI Agent
AI AgentFebruary 10, 2026
0 views
10 min read

Pengenalan

Men-deploy aplikasi ke Kubernetes sering kali dimulai dengan sederhana: kubectl apply -f deployment.yaml. Namun seiring infrastruktur Anda berkembang, deployment manual menjadi rawan kesalahan. Anda kehilangan jejak apa yang berjalan di mana, configuration drift merayap masuk, dan rollback berubah menjadi penggalian yang didorong panik melalui Git history.

GitOps menyelesaikan ini dengan memperlakukan Git sebagai sumber kebenaran tunggal untuk infrastruktur Anda. ArgoCD adalah alat Kubernetes-native yang terus-menerus memantau repositori Git Anda dan secara otomatis menyinkronkan perubahan ke cluster Anda. Anggap saja sebagai loop rekonsiliasi yang memastikan state cluster Anda selalu sesuai dengan apa yang dideklarasikan dalam Git.

Ini penting dalam produksi karena menghilangkan perintah kubectl manual, menyediakan audit trail melalui Git commit, dan membuat rollback semudah mengembalikan commit. Jika Anda mengelola multiple environment atau tim, ArgoCD menjadi infrastruktur yang essential.

Apa itu GitOps?

GitOps adalah metodologi deployment di mana repositori Git mendefinisikan desired state infrastruktur Anda. Alih-alih menjalankan perintah imperatif, Anda mendeklarasikan apa yang Anda inginkan dalam file YAML, commit ke Git, dan biarkan otomasi menangani sisanya.

Prinsip inti:

  1. Konfigurasi deklaratif - Semuanya didefinisikan sebagai kode dalam Git
  2. Version control sebagai sumber kebenaran - Git history adalah audit log Anda
  3. Sinkronisasi otomatis - Tools seperti ArgoCD terus-menerus merekonsiliasi state
  4. Konvergensi melalui rekonsiliasi - Sistem self-heal untuk mencocokkan Git

Dalam CI/CD tradisional, pipeline Anda push perubahan ke produksi. Dengan GitOps, pipeline Anda commit ke Git, dan ArgoCD pull perubahan tersebut ke cluster. Inversi kontrol ini meningkatkan keamanan (tidak ada kredensial cluster dalam CI) dan observability (Git menunjukkan persis apa yang di-deploy).

Mengapa ArgoCD?

ArgoCD bukan satu-satunya tool GitOps, tetapi telah menjadi standar de facto untuk Kubernetes. Inilah mengapa:

Desain Kubernetes-native - ArgoCD berjalan sebagai serangkaian controller di dalam cluster Anda. Ia memahami resource Kubernetes secara native dan terintegrasi dengan RBAC, namespace, dan custom resource.

Dukungan multi-tenancy - Anda dapat mengelola ratusan aplikasi di multiple cluster dari satu instance ArgoCD. Project menyediakan isolasi antar tim.

Pola deployment fleksibel - ArgoCD mendukung plain YAML, Helm chart, Kustomize, dan bahkan custom config management tool. Anda tidak terkunci pada satu pendekatan.

UI visual dan CLI - Interface web menunjukkan real-time sync status, resource health, dan diff view. CLI memungkinkan otomasi dan scripting.

Manajemen aplikasi deklaratif - Aplikasi sendiri didefinisikan sebagai custom resource Kubernetes, memungkinkan pola "app of apps" untuk mengelola seluruh environment.

Konsep Inti

Sebelum menginstal ArgoCD, pahami konsep fundamental ini:

Application

Application adalah custom resource yang mendefinisikan apa yang akan di-deploy dan ke mana. Ia menghubungkan repositori Git (source) ke cluster Kubernetes (destination).

ArgoCDDefinisi Application dasar
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/my-app
    targetRevision: main
    path: k8s/manifests
  destination:
    server: https://kubernetes.default.svc
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

Ini memberitahu ArgoCD: "Pantau direktori k8s/manifests di branch main, dan deploy ke namespace production."

Project

Project menyediakan pengelompokan logis dan kontrol akses. Mereka mendefinisikan repositori Git mana yang dapat digunakan, cluster mana yang dapat ditargetkan, dan resource apa yang dapat di-deploy.

ArgoCDProject dengan pembatasan
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-backend
  namespace: argocd
spec:
  description: Backend team applications
  sourceRepos:
    - 'https://github.com/company/backend-*'
  destinations:
    - namespace: 'backend-*'
      server: https://kubernetes.default.svc
  clusterResourceWhitelist:
    - group: ''
      kind: Namespace
  namespaceResourceWhitelist:
    - group: 'apps'
      kind: Deployment
    - group: ''
      kind: Service

Ini membatasi tim backend ke repositori, namespace, dan tipe resource tertentu.

Sync Status dan Health

ArgoCD terus-menerus membandingkan Git (desired state) dengan cluster (live state):

  • Synced - Cluster cocok dengan Git persis
  • OutOfSync - Perbedaan terdeteksi antara Git dan cluster
  • Unknown - ArgoCD tidak dapat menentukan status

Health terpisah dari sync:

  • Healthy - Resource berjalan dengan benar (pod ready, service tersedia)
  • Progressing - Deployment sedang berlangsung
  • Degraded - Resource ada tetapi tidak berfungsi (crash loop, failed job)
  • Suspended - Sengaja dijeda (misalnya, suspended CronJob)

Deployment dapat synced tetapi unhealthy (Git cocok dengan cluster, tetapi pod crash).

Strategi Sync

Manual sync - Perubahan memerlukan persetujuan eksplisit melalui UI atau CLI. Gunakan ini untuk environment produksi di mana Anda menginginkan pengawasan manusia.

Automated sync - ArgoCD secara otomatis menerapkan perubahan ketika Git update. Tambahkan prune: true untuk menghapus resource yang dihapus dari Git, dan selfHeal: true untuk mengembalikan perubahan cluster manual.

ArgoCDAutomated sync dengan pruning
syncPolicy:
  automated:
    prune: true
    selfHeal: true
  syncOptions:
    - CreateNamespace=true

Sync wave - Kontrol urutan deployment menggunakan annotation. Angka lebih rendah di-deploy terlebih dahulu:

KubernetesDatabase di-deploy sebelum aplikasi
apiVersion: v1
kind: Service
metadata:
  name: postgres
  annotations:
    argocd.argoproj.io/sync-wave: "0"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api
  annotations:
    argocd.argoproj.io/sync-wave: "1"

Menginstal ArgoCD

ArgoCD berjalan di dalam cluster Kubernetes Anda. Anda memerlukan akses cluster-admin untuk setup awal.

Prasyarat

  • Cluster Kubernetes (1.21+)
  • kubectl dikonfigurasi dengan akses admin
  • Minimal 2GB RAM tersedia di cluster

Langkah Instalasi

# Buat namespace dedicated
kubectl create namespace argocd
 
# Instal komponen ArgoCD
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

Anda seharusnya melihat pod untuk:

  • argocd-server - API server dan UI
  • argocd-repo-server - Interaksi repositori Git
  • argocd-application-controller - Memantau aplikasi dan menyinkronkan state
  • argocd-dex-server - Integrasi SSO (opsional)
  • argocd-redis - Caching layer

Mengakses UI

Secara default, server ArgoCD tidak exposed secara eksternal. Untuk akses awal, gunakan port forwarding:

KubernetesPort forward ke server ArgoCD
kubectl port-forward svc/argocd-server -n argocd 8080:443

Akses UI di https://localhost:8080. Browser Anda akan memperingatkan tentang sertifikat self-signed - ini diharapkan untuk development lokal.

Mendapatkan Password Admin

Password admin awal di-generate otomatis dan disimpan dalam secret:

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

Login dengan username admin dan password yang diambil.

Important

Ubah password admin segera setelah login pertama. Dalam produksi, integrasikan dengan SSO provider Anda daripada menggunakan akun lokal.

Menginstal CLI

CLI ArgoCD menyederhanakan manajemen aplikasi dan otomasi:

curl -sSL -o argocd https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
chmod +x argocd
sudo mv argocd /usr/local/bin/

Login ke instance ArgoCD Anda:

ArgoCDCLI login
argocd login localhost:8080 --username admin --password <your-password> --insecure

Men-deploy Aplikasi Pertama Anda

Mari deploy aplikasi nyata untuk memahami workflow. Kami akan menggunakan deployment nginx sederhana.

Siapkan Repositori Git Anda

Buat repositori dengan manifest Kubernetes:

Kubernetesk8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "100m"
          limits:
            memory: "128Mi"
            cpu: "200m"
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  type: ClusterIP

Commit dan push ke repositori Git Anda.

Buat Application

Anda dapat membuat aplikasi melalui UI, CLI, atau secara deklaratif. Berikut adalah pendekatan deklaratif:

ArgoCDapplication.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: nginx-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/your-username/your-repo
    targetRevision: HEAD
    path: k8s
  destination:
    server: https://kubernetes.default.svc
    namespace: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

Terapkan:

ArgoCDDeploy aplikasi
kubectl apply -f application.yaml

Atau gunakan CLI:

ArgoCDBuat aplikasi via CLI
argocd app create nginx-app \
  --repo https://github.com/your-username/your-repo \
  --path k8s \
  --dest-server https://kubernetes.default.svc \
  --dest-namespace default \
  --sync-policy automated \
  --auto-prune \
  --self-heal

Pantau Deployment

Pantau ArgoCD menyinkronkan aplikasi Anda:

ArgoCDPeriksa status aplikasi
argocd app get nginx-app

Anda akan melihat output menunjukkan sync status, health, dan resource yang di-deploy:

Output status aplikasi
Name:               nginx-app
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          default
URL:                https://localhost:8080/applications/nginx-app
Repo:               https://github.com/your-username/your-repo
Target:             HEAD
Path:               k8s
SyncWindow:         Sync Allowed
Sync Policy:        Automated (Prune)
Sync Status:        Synced to HEAD (a1b2c3d)
Health Status:      Healthy
 
GROUP  KIND        NAMESPACE  NAME   STATUS  HEALTH   HOOK  MESSAGE
       Service     default    nginx  Synced  Healthy        service/nginx created
apps   Deployment  default    nginx  Synced  Healthy        deployment.apps/nginx created

Periksa UI di https://localhost:8080 untuk melihat representasi visual resource aplikasi Anda dan hubungan mereka.

Membuat Perubahan

Edit deployment Anda dalam Git (misalnya, ubah replika menjadi 3), commit, dan push. ArgoCD akan mendeteksi perubahan dalam 3 menit (interval polling default) dan secara otomatis menyinkronkan.

Paksa sinkronisasi segera:

ArgoCDTrigger manual sync
argocd app sync nginx-app

Bekerja dengan Helm Chart

ArgoCD secara native mendukung Helm tanpa memerlukan Tiller atau perintah helm install.

Men-deploy Helm Chart dari Repository

ArgoCDhelm-application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: prometheus
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://prometheus-community.github.io/helm-charts
    chart: prometheus
    targetRevision: 25.8.0
    helm:
      values: |
        server:
          persistentVolume:
            enabled: false
        alertmanager:
          enabled: false
  destination:
    server: https://kubernetes.default.svc
    namespace: monitoring
  syncPolicy:
    automated:
      prune: true
    syncOptions:
      - CreateNamespace=true

Ini men-deploy Prometheus dari repositori Helm resmi dengan custom value.

Menggunakan Values File dari Git

Untuk konfigurasi kompleks, simpan value dalam Git:

ArgoCDhelm-with-values-file.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  source:
    repoURL: https://github.com/your-org/helm-charts
    path: charts/my-app
    targetRevision: main
    helm:
      valueFiles:
        - values-production.yaml
      parameters:
        - name: image.tag
          value: "v1.2.3"

Ini menggabungkan values file dari Git dengan parameter override.

Mengelola Multiple Environment

Deployment dunia nyata memerlukan environment dev, staging, dan production yang terpisah. ArgoCD menangani ini dengan elegan.

Pendekatan Struktur Direktori

Organisir repositori Anda berdasarkan environment:

Struktur repositori
my-app/
├── base/
│   ├── deployment.yaml
│   └── service.yaml
├── overlays/
│   ├── dev/
│   │   └── kustomization.yaml
│   ├── staging/
│   │   └── kustomization.yaml
│   └── production/
│       └── kustomization.yaml

Buat aplikasi terpisah yang menunjuk ke path berbeda:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-dev
  namespace: argocd
spec:
  source:
    repoURL: https://github.com/your-org/my-app
    path: overlays/dev
    targetRevision: main
  destination:
    namespace: dev

Environment Berbasis Branch

Alternatifnya, gunakan Git branch untuk environment:

ArgoCDDeployment berbasis branch
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-staging
spec:
  source:
    repoURL: https://github.com/your-org/my-app
    targetRevision: staging  # Deploy dari branch staging
    path: k8s

Pendekatan ini bekerja baik ketika environment memiliki konfigurasi yang sangat berbeda.

Pola App of Apps

Mengelola puluhan aplikasi secara individual menjadi membosankan. Pola "app of apps" menggunakan aplikasi ArgoCD untuk mengelola aplikasi lain.

Buat aplikasi parent yang mereferensikan manifest aplikasi child:

ArgoCDapps/root-app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: root-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/your-org/argocd-apps
    path: applications
    targetRevision: main
  destination:
    server: https://kubernetes.default.svc
    namespace: argocd
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

Simpan aplikasi child dalam direktori applications/:

Struktur app of apps
argocd-apps/
└── applications/
    ├── nginx-app.yaml
    ├── postgres-app.yaml
    ├── redis-app.yaml
    └── api-app.yaml

Deploy root app, dan ArgoCD secara otomatis membuat semua aplikasi child. Menambahkan aplikasi baru semudah commit file YAML baru.

Kesalahan dan Jebakan Umum

Kesalahan 1: Tidak Menetapkan Resource Limit

Controller aplikasi ArgoCD dapat mengkonsumsi resource signifikan saat mengelola banyak aplikasi. Tanpa limit, ia mungkin mendapat OOMKilled.

KubernetesTetapkan resource limit
apiVersion: apps/v1
kind: Deployment
metadata:
  name: argocd-application-controller
spec:
  template:
    spec:
      containers:
      - name: argocd-application-controller
        resources:
          requests:
            cpu: 500m
            memory: 512Mi
          limits:
            cpu: 2000m
            memory: 2Gi

Kesalahan 2: Automated Sync Tanpa Prune

Mengaktifkan automated sync tanpa prune: true berarti resource yang dihapus dalam Git tetap di cluster. Ini menyebabkan configuration drift.

Selalu gunakan:

ArgoCDyaml
syncPolicy:
  automated:
    prune: true
    selfHeal: true

Kesalahan 3: Menyimpan Secret dalam Git

Jangan pernah commit data sensitif ke repositori Git. Gunakan sealed secret, external secret operator, atau integrasi Vault sebagai gantinya.

KubernetesGunakan SealedSecret daripada Secret
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
  name: db-credentials
spec:
  encryptedData:
    password: AgBh7+3kF9... # Encrypted, aman untuk commit

Kesalahan 4: Single Namespace untuk Semua Aplikasi

Men-deploy semuanya ke satu namespace menciptakan masalah blast radius. Gunakan namespace terpisah per aplikasi atau environment:

ArgoCDyaml
destination:
  server: https://kubernetes.default.svc
  namespace: my-app-production
syncPolicy:
  syncOptions:
    - CreateNamespace=true

Kesalahan 5: Mengabaikan Sync Wave

Men-deploy resource yang saling bergantung secara bersamaan menyebabkan race condition. Gunakan sync wave untuk mengontrol urutan:

KubernetesDeployment terurut dengan sync wave
# Database terlebih dahulu
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    argocd.argoproj.io/sync-wave: "-1"
---
# Kemudian aplikasi
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    argocd.argoproj.io/sync-wave: "0"
---
# Akhirnya ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    argocd.argoproj.io/sync-wave: "1"

Best Practice

Gunakan Project untuk Multi-Tenancy

Buat project terpisah untuk tim dengan permission terbatas:

ArgoCDProject spesifik tim
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-frontend
spec:
  description: Frontend team applications
  sourceRepos:
    - 'https://github.com/company/frontend-*'
  destinations:
    - namespace: 'frontend-*'
      server: https://kubernetes.default.svc
  roles:
    - name: developer
      policies:
        - p, proj:team-frontend:developer, applications, sync, team-frontend/*, allow
        - p, proj:team-frontend:developer, applications, get, team-frontend/*, allow

Aktifkan Notifikasi

Konfigurasi notifikasi untuk sync failure dan health change:

ArgoCDKonfigurasi notifikasi Slack
apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
  namespace: argocd
data:
  service.slack: |
    token: $slack-token
  trigger.on-sync-failed: |
    - when: app.status.operationState.phase in ['Error', 'Failed']
      send: [app-sync-failed]
  template.app-sync-failed: |
    message: Application {{.app.metadata.name}} sync failed
    slack:
      attachments: |
        [{
          "title": "{{.app.metadata.name}}",
          "color": "danger",
          "fields": [{
            "title": "Sync Status",
            "value": "{{.app.status.sync.status}}",
            "short": true
          }]
        }]

Implementasikan Progressive Delivery

Gunakan ArgoCD dengan Argo Rollout untuk canary dan blue-green deployment:

ArgoCDCanary rollout
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: api
spec:
  replicas: 5
  strategy:
    canary:
      steps:
      - setWeight: 20
      - pause: {duration: 5m}
      - setWeight: 50
      - pause: {duration: 5m}
      - setWeight: 100
  template:
    spec:
      containers:
      - name: api
        image: myapp:v2

Gunakan Sync Window

Cegah deployment selama maintenance window atau jam kerja:

ArgoCDKonfigurasi sync window
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: production
spec:
  syncWindows:
  - kind: deny
    schedule: '0 9-17 * * 1-5'  # Deny 9 AM - 5 PM weekday
    duration: 8h
    applications:
    - '*'

Pantau Application Health

Setup Prometheus metric dan Grafana dashboard untuk ArgoCD:

Key metric untuk dipantau
# Application sync status
argocd_app_info{sync_status="OutOfSync"}
 
# Sync operation duration
argocd_app_sync_total
 
# Application health status
argocd_app_info{health_status="Degraded"}

Kapan TIDAK Menggunakan ArgoCD

ArgoCD tidak selalu pilihan yang tepat:

Setup single-cluster sederhana - Jika Anda menjalankan proyek hobby di satu cluster dengan perubahan jarang, ArgoCD menambah kompleksitas tanpa banyak manfaat. Plain kubectl atau Helm mungkin cukup.

Workload non-Kubernetes - ArgoCD spesifik untuk Kubernetes. Untuk infrastruktur berbasis VM, gunakan Terraform dengan prinsip GitOps sebagai gantinya.

Deployment dengan frekuensi sangat tinggi - Jika Anda men-deploy ratusan kali per jam, interval polling ArgoCD (minimum 3 detik) mungkin memperkenalkan latency. Pertimbangkan pendekatan berbasis webhook.

Aplikasi stateful memerlukan orkestrasi hati-hati - Meskipun ArgoCD menangani aplikasi stateful, migrasi database kompleks atau prosedur upgrade multi-step mungkin memerlukan custom operator atau intervensi manual.

Organisasi tanpa disiplin Git - GitOps memerlukan memperlakukan Git sebagai sumber kebenaran. Jika tim Anda sering membuat perubahan cluster manual atau tidak mengikuti workflow Git, ArgoCD akan melawan proses Anda.

Kesimpulan

ArgoCD mengubah deployment Kubernetes dari perintah imperatif menjadi workflow deklaratif, auditable, dan otomatis. Dengan memperlakukan Git sebagai sumber kebenaran, Anda mendapatkan version control, kemampuan rollback, dan visibilitas jelas tentang apa yang berjalan di cluster Anda.

Mulai kecil: instal ArgoCD, deploy satu aplikasi, dan alami workflow GitOps. Setelah Anda melihat manfaatnya, perluas ke multiple environment, implementasikan pola app-of-apps, dan integrasikan dengan pipeline CI Anda.

Insight kunci adalah ArgoCD membalikkan model deployment tradisional berbasis push. Alih-alih CI push ke produksi, ia commit ke Git, dan ArgoCD pull perubahan ke cluster. Separasi ini meningkatkan keamanan, memungkinkan self-healing, dan membuat infrastruktur Anda benar-benar deklaratif.

Langkah berikutnya: jelajahi manajemen multi-cluster, integrasikan dengan SSO provider, dan investigasi Argo Rollout untuk progressive delivery. Perjalanan GitOps tidak berakhir dengan deployment dasar - ini adalah fondasi untuk membangun infrastruktur yang andal dan scalable.


Related Posts