Menjalankan ArgoCD untuk banyak tim tanpa kekacauan: model tenancy berbasis namespace, cluster, dan hybrid, strategi isolasi dengan network policy dan quota, pola self-service dengan ApplicationSet, serta manajemen resource dan biaya antar tenant.

Di episode 27 sebelumnya kita belajar memecahkan masalah — dan sebagian besar masalah itu tumbuh dari satu akar: terlalu banyak hal berbagi satu ruang tanpa batas. Ketika lima tim memakai satu ArgoCD, satu cluster, dan satu set namespace tanpa pemisahan yang jelas, bukan soal apakah konflik akan muncul, melainkan kapan. Pada episode ini kita membahas multi-tenancy at scale — bagaimana menjalankan satu ArgoCD (atau beberapa) untuk banyak tenant dengan batas yang tegas.
Mengapa ini penting? Multi-tenancy adalah titik di mana GitOps berubah dari "cara tim kita deploy" menjadi "platform perusahaan". Di sinilah tim platform bertugas membuat self-service yang aman: tenant mendapatkan kecepatan tanpa platform kehilangan kontrol. Episode ini menjelaskan model tenancy, strategi isolasi, pola self-service, dan cara mengelola resource serta biaya secara adil.
Ada tiga model utama, dan pilihan di antara mereka menentukan seluruh desain berikutnya:
| Model | Isolasi | Skala | Kapan Dipilih |
|---|---|---|---|
| Namespace-based | Namespace + project + quota | Hingga ratusan tim per cluster | Satu cluster, banyak tim, biaya paling efisien |
| Cluster-based | Satu cluster penuh per tenant | Puluhan tenant | Regulasi ketat, blast radius kecil, tenant besar |
| Hybrid | Beberapa namespace per tenant, cluster per environment | Kombinasi keduanya | Environment berbeda, kepatuhan berbeda |
Dalam model namespace-based, satu ArgoCD mengelola semua tenant. Isolasi dilakukan lewat kombinasi Project (episode 10), ResourceQuota, dan NetworkPolicy per namespace. Ini model yang paling hemat biaya — tetapi menuntut disiplin tinggi. Dalam model cluster-based, setiap tenant mendapat cluster sendiri (mungkin di-cluster oleh ArgoCD hub); mahal tetapi isolasinya tak terbantahkan. Hybrid adalah jawaban pragmatis: tenant kecil berbagi cluster development, sementara production setiap tenant (atau environment) mendapat cluster sendiri.
Tip
Mulai dari namespace-based dengan project yang ketat. Naik ke cluster-based hanya ketika ada alasan eksplisit: kepatuhan (compliance), blast radius, atau kebutuhan tenant yang sangat besar. Berpindah dari berbagi cluster ke cluster sendiri jauh lebih mudah daripada sebaliknya.
Isolasi bukan satu lapisan, melainkan empat lapisan yang saling melengkapi.
Kontrol lalu lintas antar namespace secara default-deny:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
namespace: tenant-billing
spec:
podSelector: {}
policyTypes:
- IngressSetiap tenant harus mengizinkan lalu lintas keluar masuk secara eksplisit. NetworkPolicy memastikan aplikasi tenant A tidak bisa menjadi jalan masuk ke tenant B bahkan ketika cluster ter-compromise.
Quota dan LimitRange mencegah satu tenant menghabiskan seluruh cluster:
apiVersion: v1
kind: ResourceQuota
metadata:
name: tenant-billing-quota
namespace: tenant-billing
spec:
hard:
requests.cpu: "8"
requests.memory: 16Gi
limits.cpu: "16"
limits.memory: 32Gi
count/deployments.apps: "20"Tanpa quota, satu aplikasi yang salah konfigurasi bisa membuat seluruh tenant lain kelaparan resource. Quota juga menjadi dasar hitungan biaya (lihat Manajemen Resource di bawah).
Dua lapis RBAC bekerja bersama: RBAC Kubernetes (siapa boleh menyentuh apa di cluster) dan RBAC ArgoCD (siapa boleh sync/melihat aplikasi apa). Di ArgoCD, ini dikendalikan lewat Project:
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: tenant-billing
namespace: argocd
spec:
sourceRepos:
- https://github.com/org/tenant-billing/*
destinations:
- namespace: tenant-billing
server: https://kubernetes.default.svc
roles:
- name: developer
policies:
- p, proj:tenant-billing:developer, applications, get, tenant-billing/*, allow
- p, proj:tenant-billing:developer, applications, sync, tenant-billing/*, allowProject adalah unit logis multi-tenancy di ArgoCD. Satu project satu tenant — bukan satu project banyak aplikasi multi-tenant. Project menentukan repo sumber yang boleh, cluster tujuan yang boleh, dan resource Kubernetes yang boleh dibuat.
Tenancy yang baik tidak menuntut platform team mengerjakan semuanya secara manual. Self-service adalah kunci skala.
Saat tenant baru bergabung, tim platform menjalankan satu langkah: menyetor satu file ke repo onboarding. Sebuah ApplicationSet dengan generator Git mendeteksi direktori baru dan memprovisi semua kebutuhan tenant — namespace, quota, network policy, role, dan Application:
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: tenant-onboarding
namespace: argocd
spec:
generators:
- git:
repoURL: https://github.com/org/tenant-registry
revision: main
directories:
- path: tenants/*
template:
metadata:
name: '{{path.basename}}'
spec:
project: '{{path.basename}}'
source:
repoURL: https://github.com/org/tenant-registry
path: '{{path}}/manifests'
destination:
namespace: '{{path.basename}}'
server: https://kubernetes.default.svcSetiap tenant bukan titik awal kosong, melainkan turunan dari template. Template repo berisi standar platform: label, security context, liveness probe, resource request minimum. Perbedaan antar tenant hanya pada nilai yang di-override lewat Kustomize overlay atau Helm values — bukan duplikasi penuh yang menyimpang.
Self-service tanpa governance adalah anarki. Policy engine seperti Kyverno (episode 30) memvalidasi setiap manifest yang masuk: menolak image latest, memaksa securityContext non-root, memastikan resource requests selalu ada. Karena ArgoCD menerapkan dari Git, policy ini juga diterapkan ke setiap sync — satu gerbang otomatis untuk semua tenant.
Warning
Self-service berarti tenant membuat resource sendiri — bukan berarti tenant mengatur resource platform. Pisahkan namespace tenant (tenant-billing, tenant-orders) dari namespace sistem (argocd, ingress-nginx, monitoring). Dan jangan pernah membiarkan satu tenant memodifikasi Project-nya sendiri; Project dikelola hanya oleh tim platform.
Di lingkungan multi-tenant, resource adalah uang — dan platform team yang tidak bisa menjawab "siapa menghabiskan berapa" akan kesulitan di budget review.
Quota per tenant (di atas) menetapkan kesepakatan alokasi. Untuk alokasi yang adil, kombinasikan: quota tetap per tenant untuk baseline, plus pool bersama yang bisa diambil sementara untuk lonjakan (dengan approval).
team=billing, environment=prod, tenant=.... Cloud provider menggunakan label ini untuk memetakan biaya per tenant.Pantau pemakaian per namespace dengan metrik:
kubectl get resourcequota -A
kubectl describe resourcequota tenant-billing-quota -n tenant-billing
kubectl top pods -n tenant-billingkubectl top menunjukkan pemakaian aktual vs request — data penting untuk menemukan tenant yang over-request (meminta 8 vCPU tapi memakai 0.5) dan tenant yang under-provisioned.
Episode ini memetakan multi-tenancy di ArgoCD secara utuh: model namespace-based, cluster-based, dan hybrid, empat lapis isolasi (network policy, quota, RBAC, project separation), pola self-service dengan onboarding otomatis, ApplicationSet provisioning, template repo, dan governance policy, serta manajemen resource dengan alokasi adil, cost allocation, chargeback/showback, dan monitoring pemakaian.
Poin yang harus kalian bawa:
Tenancy yang baik mengelola aplikasi; langkah berikutnya adalah mengelola hal di bawah aplikasi. Di episode 29 selanjutnya kita membahas infrastructure GitOps — Terraform dengan GitOps, Crossplane untuk IaC native Kubernetes, Cluster API untuk lifecycle cluster, dan pola full stack GitOps. Sampai jumpa di episode 29!