Batasi siapa yang bisa deploy ke mana: ArgoCD Projects untuk multi-tenancy, whitelist repository dan cluster, roles berbasis JWT, serta pola tenancy berbasis tim, environment, dan aplikasi.

Di episode 9 sebelumnya kita mendaftarkan banyak cluster ke satu ArgoCD dan menempatkan aplikasi ke destination manapun. Itu hebat, tapi ada satu pertanyaan besar yang belum terjawab: siapa yang boleh deploy ke mana? Jika semua orang dengan akses ArgoCD bisa men-deploy ke cluster production, satu kesalahan ketik bisa menjatuhkan layanan. Pada episode ini kita membahas ArgoCD Projects — mekanisme isolasi dan kontrol akses yang mengubah ArgoCD dari tool pribadi menjadi platform multi-tenancy yang aman.
Mengapa ini penting? Di perusahaan sungguhan, ArgoCD dipakai bersama banyak tim. Tim A tidak boleh mengubah konfigurasi tim B; tim frontend tidak boleh deploy ke cluster data center; dan developer baru tidak boleh menyentuh production. Projects adalah tembok pemisah itu — sekaligus fondasi dari pola operasional yang akan kita pakai di semua episode selanjutnya, termasuk ApplicationSet di episode 11.
Project (AppProject) adalah pengelompokan logis Application dengan batasan (restriction) dan siapa yang boleh mengoperasikannya. Setiap Application wajib berada di dalam satu project — jika tidak ditentukan, ia masuk ke project bawaan bernama default.
Project default sudah ada sejak instalasi dan dipakai semua Application yang tidak menyebutkan project. Batasannya minimal: ia mengizinkan semua source repository dan semua destination. Ini tidak aman untuk tenancy — best practice di lingkungan produksi adalah membiarkan default kosong dan mewajibkan tiap Application menyebutkan project yang jelas.
Ada dua cara: deklaratif (manifest YAML di Git — paling cocok untuk GitOps) atau CLI:
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: team-billing
namespace: argocd
spec:
sourceRepos:
- "https://github.com/devnull/billing-repo.git"
destinations:
- server: "https://kubernetes.default.svc"
namespace: "billing-*"
- server: "https://eks-prod.example.com"
namespace: "billing-*"
clusterResourceWhitelist:
- group: ""
kind: Namespaceargocd proj create team-billing \
--src https://github.com/devnull/billing-repo.git \
--dest https://kubernetes.default.svc,billing-prod \
--description "Project milik tim billing"Cara deklaratif lebih disukai dalam GitOps karena project-nya sendiri ikut versioned di Git — konsisten dengan prinsip "semuanya dari Git".
Tip
Nama project akan tampil di UI, di CLI, dan di daftar aplikasi. Gunakan nama yang mengandung konteks (tim atau environment), misalnya team-billing-prod — jauh lebih jelas daripada project-1.
Inti dari Project adalah restriction. Ada lima jenis pembatasan utama:
sourceRepos menentukan Git repository mana yang boleh dipakai Application di dalam project. Kosongkan untuk menolak semua source (project "kosong"), atau daftarkan URL yang diizinkan. Wildcard didukung, tapi gunakan dengan hati-hati.
destinations membatasi kombinasi cluster dan namespace tujuan. Perhatikan pola billing-* di contoh tadi — ArgoCD mendukung wildcard pada namespace, sehingga project ini bisa men-deploy ke namespace billing-dev, billing-staging, billing-prod, tapi tidak ke namespace tim lain.
clusterResourceWhitelist — resource level cluster yang boleh dikelola (misal hanya Namespace).clusterResourceBlacklist — resource level cluster yang dilarang (misal ClusterRole, PersistentVolume).namespaceResourceBlacklist — resource dalam namespace yang dilarang (misal ServiceAccount yang terlalu kuat).Ini garis pertahanan kedua: meski sumber manifest di Git "aman", resource yang berbahaya tetap dicegat oleh project.
Cara memodelkan project bergantung pada kebutuhan organisasi. Tiga pola umum:
| Pola | Project per... | Contoh | Cocok untuk |
|---|---|---|---|
| Team-based | Tim | team-billing, team-orders | Organisasi banyak tim |
| Environment-based | Environment | core-prod, core-staging | Satu platform, banyak environment |
| Application-based | Aplikasi | api, web, worker | Isolasi paling ketat per aplikasi |
Team-based paling umum: tiap tim punya project dengan repository dan destination miliknya sendiri. Environment-based membantu memisahkan permission production dari development — misalnya hanya lead yang punya akses ke project *-prod. Kombinasi juga sah: project team-billing-prod dan team-billing-dev memberi granularity dua sumbu sekaligus.
Project juga bisa memiliki roles dengan kebijakan RBAC sendiri — cara yang tepat memberi akses CLI tanpa membagikan kredensial admin.
argocd proj role create team-billing deployer
argocd proj role add-policy team-billing deployer \
--action get --permission allow --object "*"
argocd proj role add-policy team-billing deployer \
--action sync --permission allow --object "*"Policy menggunakan format RBAC ArgoCD: p, <role>, <resource>, <action>, <object>. Dengan dua baris di atas, role deployer bisa melihat dan me-sync semua Application milik project team-billing.
Setiap role bisa menerbitkan JWT token yang dipakai untuk login CLI dengan hak terbatas pada project itu saja:
argocd proj role create-token team-billing deployer
argocd login argocd.example.com --auth-token <TOKEN>
argocd app listDengan token ini, argocd app list hanya menampilkan Application di project team-billing — bukan seluruh cluster. Ini pola yang tepat untuk mengintegrasikan ArgoCD ke CI/CD pipeline: tiap pipeline memakai token project miliknya, bukan admin.
Warning
Token JWT yang bocor bisa dipakai siapa saja untuk mengoperasikan Application dalam project terkait. Atur masa berlaku token dengan flag --expires-in (misal 24h), dan rotasi token secara rutin. Jangan pernah commit token ke repository.
Project ArgoCD tidak punya mekanisme quota bawaan — quota resource sebenarnya dijalankan oleh Kubernetes ResourceQuota di namespace tujuan:
apiVersion: v1
kind: ResourceQuota
metadata:
name: billing-quota
namespace: billing-prod
spec:
hard:
requests.cpu: "8"
requests.memory: 16Gi
limits.cpu: "16"
limits.memory: 32Gi
persistentvolumeclaims: "4"Kombinasi yang benar: Project membatasi apa yang boleh di-deploy (repository, destination, resource kinds), sedangkan ResourceQuota membatasi berapa besar resource yang boleh dipakai. Keduanya saling melengkapi — ResourceQuota juga mencegah satu tim menghabiskan seluruh kapasitas cluster.
default. Project bawaan longgar dan terbuka; di produksi, kosongkan dan wajibkan project eksplisit.sourceRepos: ["*"] atau namespace * menghancurkan tujuan isolasi. Selalu daftarkan yang spesifik.*. Policy --object "*" memberi akses penuh ke semua Application dalam project. Bila perlu, batasi object dengan pola nama.--expires-in.clusterResourceBlacklist, manifest yang dikelola bisa memuat ClusterRole dengan hak tinggi. Definisikan blacklist untuk resource yang berisiko.Episode ini menjadikan ArgoCD platform yang bisa dipakai banyak tim: konsep Project dan project default, pembatasan source repository, destination cluster/namespace, whitelist/blacklist resource, pola tenancy team/environment/application-based, project roles dengan token JWT untuk akses CLI, serta kolaborasi dengan ResourceQuota Kubernetes.
Poin yang harus kalian bawa:
sourceRepos dan destinations adalah dua pembatas terpenting — whitelist selalu lebih baik daripada membiarkan terbuka.Mengelola project dan Application secara manual masih melelahkan jika jumlahnya puluhan. Di episode 11 selanjutnya kita membahas ApplicationSets - Advanced Application Management: cara mendefinisikan templat Application yang digenerasi otomatis dari list, cluster, Git, dan Pull Request — otomasi yang mengubah 100 Application menjadi satu file. Sampai jumpa di episode 11!