Di episode ini kalian akan memahami multi-tenancy dengan Flux: model tenancy berbasis namespace, cluster, dan repository, penggunaan flux create tenant untuk RBAC per tenant, resource quota, hingga lockdown mode untuk memperkuat isolasi antar tenant dalam satu cluster.

Di episode 11 kalian sudah belajar variable substitution, postBuild, dan strategi konfigurasi per environment, termasuk memisahkan konfigurasi antar tenant. Sekarang kita naik satu tingkat: bagaimana kalau dalam satu cluster ada lebih dari satu tim, dan masing-masing mengelola aplikasinya sendiri melalui Git?
Skenario ini disebut multi-tenancy. Di episode 12 kita membahas bagaimana FluxCD menghadapinya: model tenancy, perintah flux create tenant, struktur tenant di Git dan cluster, access control, sampai lockdown mode.
Multi-tenancy adalah praktik berbagi satu infrastruktur, biasanya satu cluster Kubernetes, dengan banyak tim atau tenant, tanpa membiarkan satu tenant mengganggu atau mengakses milik tenant lain. Dalam konteks GitOps, setiap tenant biasanya memiliki:
FluxCD dirancang mendukung multi-tenancy secara native. Kustomization bisa dijalankan dengan service account milik tenant, sehingga perubahan yang disinkronkan dari Git hanya berkuasa di wilayah tenant tersebut.
| Model | Deskripsi | Isolasi | Cocok Untuk |
|---|---|---|---|
| Namespace-based | Banyak tenant berbagi satu cluster, masing-masing di namespace sendiri | Sedang | Tim internal, environment dev dan staging |
| Cluster-based | Satu tenant satu cluster penuh | Kuat | Produksi, regulasi ketat, pelanggan eksternal |
| Repository-based | Tenant berbagi cluster, masing-masing punya repository Git sendiri | Sedang | Tim dengan proses Git terpisah |
| Hybrid | Kombinasi, misalnya prod per cluster, dev berbagi | Kustom | Organisasi besar |
Note
Fokus utama seri ini adalah namespace-based tenancy karena paling umum dipakai dengan FluxCD dan paling murah dioperasikan. Model lain hanyalah namespace-based yang diperkuat lapisan isolasi tambahan.
Cara tercepat membuat tenant yang benar adalah perintah flux create tenant, yang menghasilkan objek RBAC yang konsisten dengan rekomendasi resmi FluxCD.
flux create tenant dev-team \
--with-namespace=dev-team \
--labels=team=dev \
--export > dev-team-rbac.yamlPerintah di atas menghasilkan namespace dev-team, ServiceAccount flux, Role dev-team:flux yang terbatas pada namespace tersebut, dan RoleBinding yang mengikatnya. Perhatikan hasilnya adalah Role dan RoleBinding, bukan ClusterRole dan ClusterRoleBinding — isolasi dasar tenant dibatasi hanya untuk namespace miliknya.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: dev-team:flux
namespace: dev-team
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: dev-team:flux
subjects:
- kind: ServiceAccount
name: flux
namespace: dev-teamTerapkan ke cluster, lalu tinjau hasilnya sebelum dipakai di produksi:
kubectl apply -f dev-team-rbac.yamlImportant
Jangan pernah menerapkan hasil flux create tenant tanpa meninjau isinya terlebih dahulu. Pahami setiap objek yang dihasilkan sebelum menerapkannya ke cluster produksi.
Tenant yang sehat memiliki struktur yang jelas, baik di Git maupun di cluster.
Namespace adalah batas isolasi paling dasar di Kubernetes. Setiap tenant mendapat namespace sendiri, dan semua resource aplikasinya berada di sana. Dengan RBAC dari flux create tenant, service account tenant tidak bisa menyentuh namespace lain.
Setiap tenant mereferensikan repository miliknya lewat GitRepository, dengan kredensial terpisah dalam Secret sendiri.
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: dev-team-apps
namespace: dev-team
spec:
interval: 5m
url: https://github.com/acme/dev-team-apps
ref:
branch: mainField serviceAccountName adalah kunci isolasi ini — tanpa field tersebut, Kustomization dijalankan dengan service account default yang dipakai flux-system.
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: dev-team-apps
namespace: dev-team
spec:
serviceAccountName: flux
sourceRef:
kind: GitRepository
name: dev-team-apps
path: ./apps
prune: true
interval: 5mNamespace-based tenancy tanpa ResourceQuota bisa membuat satu tenant memonopoli resource cluster. Selalu pasang quota agar penggunaan resource setiap tenant bisa diukur dan dibatasi:
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-team-quota
namespace: dev-team
spec:
hard:
requests.cpu: "4"
requests.memory: 8Gi
limits.cpu: "8"
limits.memory: 16Gi
pods: "20"
services: "10"| Lapisan | Mekanisme | Fungsi |
|---|---|---|
| Cluster | RBAC Kubernetes | Membatasi apa yang boleh dilakukan service account tenant |
| Git | Permission repository, misalnya GitHub teams | Membatasi siapa yang boleh mengubah manifest tenant |
| Namespace | Role, NetworkPolicy, dan Quota | Membatasi lingkup kerja tenant di cluster |
Untuk akses Git, kredensial tiap tenant harus terpisah. Jangan berbagi Personal Access Token antar tenant — gunakan deploy key atau bot account per repository. Di sisi cluster, pastikan service account tenant tidak punya permission impersonate, escalate, atau akses ke ClusterRole.
Lockdown mode adalah kumpulan praktik untuk memperketat lingkungan multi-tenant. Saat bootstrap, FluxCD menyediakan dua flag penting:
flux bootstrap github \
--owner=acme \
--repository=fleet \
--branch=main \
--path=./clusters/prod \
--network-policy=true \
--no-cross-namespace-refs=true| Flag | Efek |
|---|---|
--network-policy=true | Membuat NetworkPolicy deny-all di namespace flux-system |
--no-cross-namespace-refs=true | Melarang referensi silang namespace, misalnya Kustomization di satu namespace mereferensikan GitRepository di namespace lain |
Service account tenant tidak boleh memiliki permission untuk mengubah Role, RoleBinding, atau ClusterRole. Permission escalate dan bind harus dihapus dari aturan tenant, karena tanpa ini tenant bisa memberikan permission tambahan kepada dirinya sendiri.
Permission impersonate memungkinkan sebuah identity meniru identity lain. Tenant tidak boleh memilikinya, karena bisa dipakai melewati batas RBAC yang sudah dipasang.
Selain deny-all di flux-system, pasang NetworkPolicy per tenant untuk memutus komunikasi antar tenant:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: dev-team
spec:
podSelector: {}
policyTypes:
- Ingress
- EgressAdmission controllers seperti OPA Gatekeeper atau Kyverno menegakkan kebijakan di level cluster: menolak Pod yang menaikkan privilege, melarang hostPath, memaksa setiap namespace tenant memiliki quota, dan lain-lain. Ini adalah lapisan terakhir yang menutup celah yang lolos dari RBAC dan NetworkPolicy.
Warning
Lockdown mode bukan satu perintah, melainkan kombinasi RBAC minimal, NetworkPolicy, dan admission policy. Mulailah dari flux create tenant, lalu perketat secara bertahap.
Di episode 12 ini kalian sudah mempelajari cara mengisolasi banyak tim dalam satu cluster menggunakan FluxCD.
Inti yang harus dibawa pulang:
Di episode 13 berikutnya kita akan membahas Image Automation — bagaimana FluxCD memantau container registry, mengevaluasi versi image baru, dan otomatis memperbarui Git. Sampai jumpa di episode berikutnya!