Mengotomatiskan deployment: strategi sync manual versus automated, opsi seperti prune dan self-healing, urutan eksekusi lewat sync phases dan waves, hingga cara ArgoCD menilai kesehatan aplikasi.

Di episode 6 kalian merasakan kesenangan pertama GitOps — tapi mungkin juga merasakan kerumitan: setiap perubahan harus di-sync manual. Tenang, itu memang dirancang: ArgoCD memisahkan deteksi (selalu otomatis) dari penerapan (bisa otomatis, bisa manual). Keputusan ini berdampak besar pada keamanan dan alur kerja tim.
Episode ini mengupas tuntas sync strategies dan policies: kapan memilih manual vs automated, apa bahaya dan manfaat auto-prune dan self-healing, bagaimana sync options mengubah cara resource diterapkan, bagaimana sync phases dan waves mengatur urutan eksekusi, serta bagaimana health assessment menentukan kondisi aplikasi.
Seperti di episode 6: ArgoCD terus mendeteksi perubahan Git dan menandai OutOfSync, tetapi menunggu persetujuan (argocd app sync api atau tombol di UI). Cocok untuk produksi dengan persetujuan manusia.
ArgoCD langsung menerapkan setiap perubahan yang terdeteksi:
argocd app set api --sync-policy automatedatau secara deklaratif:
spec:
syncPolicy:
automated:
prune: false
selfHeal: falseSecara default ArgoCD tidak menghapus resource yang hilang dari Git — ini melindungi dari kesalahan hapus massal. Dengan prune: true, resource yang tidak ada lagi di Git ikut dihapus:
argocd app set api --sync-policy automated --auto-prune --self-healTanpa self-heal, jika seseorang mengubah Deployment manual (kubectl scale deployment api --replicas=10), ArgoCD akan menandai OutOfSync tapi tidak membatalkan perubahan. Dengan selfHeal: true, ArgoCD mengembalikan resource ke kondisi Git secara otomatis.
Warning
Kombinasi automated + prune + self-heal adalah mode paling "agresif". Aman hanya jika repository Git kalian rapi dan semua perubahan melalui PR. Di lingkungan ramai, hidupkan fitur ini bertahap dan pantau event ArgoCD.
Sync windows membatasi kapan auto-sync boleh berjalan — misalnya jendela maintenance atau freeze periode:
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: default
spec:
syncWindows:
- kind: deny
schedule: "0 22 * * *"
duration: "8h"
applications:
- "*-prod"Kode di atas melarang auto-sync untuk semua aplikasi berakhiran -prod mulai jam 22.00 selama 8 jam. Sync manual tetap bisa dijalankan oleh yang punya izin.
Sync options adalah penyesuaian detail pada cara resource diterapkan. Beberapa yang paling sering dipakai:
| Option | Efek |
|---|---|
Prune=true | Hapus resource yang tidak ada di Git |
Replace=true | Ganti resource dengan DELETE + CREATE (bukan update) |
ApplyOutOfSyncOnly=true | Apply hanya resource yang berbeda |
ServerSideApply=true | Pakai server-side apply (field ownership) |
RespectIgnoreDifferences=true | Hormati daftar ignore differences saat meng-apply |
Force=true | Bypass resource conflict (misal immutability) |
Contoh penggunaan:
argocd app set api \
--sync-option ServerSideApply=true \
--sync-option Force=trueTip
ApplyOutOfSyncOnly=true mempercepat sync besar karena ArgoCD hanya menyentuh resource yang berbeda, bukan seluruh daftar manifest.
Setiap sync melewati fase berurutan, dan di sela fasenya ArgoCD menjalankan resource hooks (misal Job). Fase utamanya:
| Fase | Urutan | Kegunaan |
|---|---|---|
PreSync | 1 | Migrasi database, backup, validasi |
Sync | 2 | Penerapan resource utama |
PostSync | 3 | Smoke test, notifikasi sukses |
SyncFail | 3 (jika gagal) | Rollback, notifikasi gagal |
Skip | - | Melewatkan fase tertentu |
Hook ditandai lewat anotasi pada resource:
apiVersion: batch/v1
kind: Job
metadata:
name: db-migrate
namespace: production
annotations:
argocd.argoproj.io/hook: PreSync
spec:
template:
spec:
restartPolicy: Never
containers:
- name: migrate
image: ghcr.io/arman/api:v1.0.0
command: ["node", "migrate.js"]ArgoCD menahan fase berikutnya sampai hook selesai dengan sukses.
Fase menata tahapan, sync waves menata urutan dalam satu fase. Semua resource diberi bobot anotasi (default 0), dieksekusi dari nilai terkecil ke terbesar:
metadata:
annotations:
argocd.argoproj.io/sync-wave: "0" # namespace, config
---
metadata:
annotations:
argocd.argoproj.io/sync-wave: "1" # ConfigMap, Secret, database
---
metadata:
annotations:
argocd.argoproj.io/sync-wave: "2" # Deployment, ServiceResource dalam wave yang sama diterapkan paralel; antar wave diterapkan berurutan. Pola umum: 0 untuk Namespace/ConfigMap, 1 untuk database/stateful, 2 untuk aplikasi.
Setelah sync, ArgoCD menilai kesehatan resource:
Ready.CrashLoopBackOff, replica tidak siap.argocd app get api
Project: default, Server: https://kubernetes.default.svc
Health Status: Healthy
Sync Status: SyncedNote
Health check ArgoCD mengikuti aturan bawaan per resource (Deployment, StatefulSet, dsb) dan bisa dikustomisasi lewat argocd.argoproj.io/health-check annotations untuk CRD milik sendiri.
Kalian kini mengendalikan bagaimana dan kapan perubahan diterapkan:
prune dan self-heal membuat cluster selalu mengikuti Git, dengan risiko yang harus dipahami.Prune, ServerSideApply, Force mengubah cara apply.Semua contoh sejauh ini memakai manifest polos. Di episode 8 kita akan mengelola konfigurasi yang jauh lebih realistis: menggunakan Helm dan Kustomize sebagai sumber Application — chart, values files, hooks Helm, base dan overlays Kustomize, hingga kombinasi keduanya. Sampai jumpa!