Mengunci akses ke storage melaluidua lapis: Kubernetes (membatasi StorageClass via quota dan RBAC internal CSI) dan NFS (perizinan export yang hanya melayani cluster, PVC terpisah per aplikasi, dan Secret yang tidak pernah hardcoded)

Storage yang berfungsi tanpa kontrol akses adalah bom waktu: siapa pun bisa membuat PVC besar, membungkus NFS, atau mencuri kredensial. Episode 12 menutup celah itu dari dua arah — Kubernetes (seberapa besar/siapa yang boleh membuat volume) dan NFS (siapa yang boleh mount).
Tujuan akhirnya sederhana: setiap aplikasi mendapat volume sendiri, dan tidak ada yang bisa menyentuh volume milik orang lain.
Kubernetes memungkinkan sebuah StorageClass hanya tersedia untuk namespace tertentu lewat allowedTopologies (untuk penyediaan node) dan, lebih transparan lagi, lewat ResourceQuota:
apiVersion: v1
kind: ResourceQuota
metadata:
name: storage-quota
namespace: apps
spec:
hard:
requests.storage: 20Gi
persistentvolumeclaims: "4"kubectl apply -f quota-storage.yamlDengan quota ini, namespace apps tidak bisa membuat PVC melebihi 20Gi atau lebih dari 4 PVC — proteksi yang bernilai saat tim proyek lain ikut membangun.
Komponen OpenEBS memakai ServiceAccount internal untuk berkomunikasi dengan API Kubernetes. Jangan mengubah permission-nya kecuali paham risikonya:
kubectl -n openebs get sa
kubectl -n openebs get role,rolebindingPrinsip: least privilege untuk service account aplikasi — aplikasi hanya boleh create PVC di namespace-nya sendiri, bukan di cluster.
NFS server (NFS Server Pod) berjalan di dalam cluster — sekalipun tidak ada ekspor *, akses datang lewat pod-network. Namun pastikan:
2049) tidak di-expose ke internet (tidak ada type: LoadBalancer pada Service nfs-*).Model per-PVC mengisolasi data sejak lahir:
media-storage untuk aplikasi galeri.data-postgres-0 untuk database.Important
Jangan pernah me-mount PVC media bersama ke beberapa aplikasi yang tidak tepercaya. Model "satu PVC = satu aplikasi" melindungi data: kebocoran di satu aplikasi tidak memperlihatkan volume aplikasi lain.
Kredensial tidak pernah di-hardcode — di ConfigMap/Secret (episode 10) atau External Secrets/Vault untuk skala besar:
kubectl create secret generic db-secret \
--from-literal=DB_PASSWORD=change-me \
--from-literal=MINIO_SECRET=change-meenv:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: DB_PASSWORDWarning
Secret Kubernetes tersimpan base64 (bukan encrypted) di etcd. Untuk data sangat sensitif, aktifkan enkripsi etcd atau gunakan External Secrets Operator supaya secret source tidak menyentuh cluster langsung.
Pada episode 12 ini, akses storage telah dikunci dua lapis:
Inti yang harus dibawa pulang:
Di episode 13 selanjutnya kita akan mengamankan data itu sendiri: enkripsi at-rest pada disk node (LUKS), enkripsi in-transit untuk NFS via Kerberos/GSSAPI, dan praktik minimal yang wajib untuk setup lab. Sampai jumpa di episode 13!