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.

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.
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:
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).
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.
Sebelum menginstal ArgoCD, pahami konsep fundamental ini:
Application adalah custom resource yang mendefinisikan apa yang akan di-deploy dan ke mana. Ia menghubungkan repositori Git (source) ke cluster Kubernetes (destination).
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: trueIni memberitahu ArgoCD: "Pantau direktori k8s/manifests di branch main, dan deploy ke namespace production."
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.
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: ServiceIni membatasi tim backend ke repositori, namespace, dan tipe resource tertentu.
ArgoCD terus-menerus membandingkan Git (desired state) dengan cluster (live state):
Health terpisah dari sync:
Deployment dapat synced tetapi unhealthy (Git cocok dengan cluster, tetapi pod crash).
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.
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=trueSync wave - Kontrol urutan deployment menggunakan annotation. Angka lebih rendah di-deploy terlebih dahulu:
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"ArgoCD berjalan di dalam cluster Kubernetes Anda. Anda memerlukan akses cluster-admin untuk setup awal.
kubectl dikonfigurasi dengan akses admin# 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.yamlAnda seharusnya melihat pod untuk:
argocd-server - API server dan UIargocd-repo-server - Interaksi repositori Gitargocd-application-controller - Memantau aplikasi dan menyinkronkan stateargocd-dex-server - Integrasi SSO (opsional)argocd-redis - Caching layerSecara default, server ArgoCD tidak exposed secara eksternal. Untuk akses awal, gunakan port forwarding:
kubectl port-forward svc/argocd-server -n argocd 8080:443Akses UI di https://localhost:8080. Browser Anda akan memperingatkan tentang sertifikat self-signed - ini diharapkan untuk development lokal.
Password admin awal di-generate otomatis dan disimpan dalam secret:
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -dLogin 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.
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:
argocd login localhost:8080 --username admin --password <your-password> --insecureMari deploy aplikasi nyata untuk memahami workflow. Kami akan menggunakan deployment nginx sederhana.
Buat repositori dengan manifest Kubernetes:
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: ClusterIPCommit dan push ke repositori Git Anda.
Anda dapat membuat aplikasi melalui UI, CLI, atau secara deklaratif. Berikut adalah pendekatan deklaratif:
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=trueTerapkan:
kubectl apply -f application.yamlAtau gunakan 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-healPantau ArgoCD menyinkronkan aplikasi Anda:
argocd app get nginx-appAnda akan melihat output menunjukkan sync status, health, dan resource yang di-deploy:
Periksa UI di https://localhost:8080 untuk melihat representasi visual resource aplikasi Anda dan hubungan mereka.
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:
argocd app sync nginx-appArgoCD secara native mendukung Helm tanpa memerlukan Tiller atau perintah helm install.
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=trueIni men-deploy Prometheus dari repositori Helm resmi dengan custom value.
Untuk konfigurasi kompleks, simpan value dalam Git:
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.
Deployment dunia nyata memerlukan environment dev, staging, dan production yang terpisah. ArgoCD menangani ini dengan elegan.
Organisir repositori Anda berdasarkan environment:
my-app/
├── base/
│ ├── deployment.yaml
│ └── service.yaml
├── overlays/
│ ├── dev/
│ │ └── kustomization.yaml
│ ├── staging/
│ │ └── kustomization.yaml
│ └── production/
│ └── kustomization.yamlBuat 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: devAlternatifnya, gunakan Git branch untuk environment:
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: k8sPendekatan ini bekerja baik ketika environment memiliki konfigurasi yang sangat berbeda.
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:
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: trueSimpan aplikasi child dalam direktori applications/:
argocd-apps/
└── applications/
├── nginx-app.yaml
├── postgres-app.yaml
├── redis-app.yaml
└── api-app.yamlDeploy root app, dan ArgoCD secara otomatis membuat semua aplikasi child. Menambahkan aplikasi baru semudah commit file YAML baru.
Controller aplikasi ArgoCD dapat mengkonsumsi resource signifikan saat mengelola banyak aplikasi. Tanpa limit, ia mungkin mendapat OOMKilled.
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: 2GiMengaktifkan automated sync tanpa prune: true berarti resource yang dihapus dalam Git tetap di cluster. Ini menyebabkan configuration drift.
Selalu gunakan:
syncPolicy:
automated:
prune: true
selfHeal: trueJangan pernah commit data sensitif ke repositori Git. Gunakan sealed secret, external secret operator, atau integrasi Vault sebagai gantinya.
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name: db-credentials
spec:
encryptedData:
password: AgBh7+3kF9... # Encrypted, aman untuk commitMen-deploy semuanya ke satu namespace menciptakan masalah blast radius. Gunakan namespace terpisah per aplikasi atau environment:
destination:
server: https://kubernetes.default.svc
namespace: my-app-production
syncPolicy:
syncOptions:
- CreateNamespace=trueMen-deploy resource yang saling bergantung secara bersamaan menyebabkan race condition. Gunakan sync wave untuk mengontrol urutan:
# 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"Buat project terpisah untuk tim dengan permission terbatas:
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/*, allowKonfigurasi notifikasi untuk sync failure dan health change:
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
}]
}]Gunakan ArgoCD dengan Argo Rollout untuk canary dan blue-green deployment:
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:v2Cegah deployment selama maintenance window atau jam kerja:
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:
- '*'Setup Prometheus metric dan Grafana dashboard untuk ArgoCD:
# 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"}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.
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.