Menyediakan berbagi file antar Pod memakai CephFS RWX untuk media Laravel: membuat CephFilesystem dengan metadata dan data pool, menyusun StorageClass CephFS, me-mount storage dan public/storage ke Deployment multi-replica, plus subvolume group untuk isolasi tenant.

PostgreSQL sudah berjalan di atas RBD (episode 7). Episode 8 membersihkan sisi storage yang kedua: file sharing untuk aplikasi. Laravel biasanya punya folder storage dan public/storage untuk upload media — dan ketika aplikasi di-scale menjadi banyak replica, file harus bisa dibaca bersama oleh semua Pod.
Mengapa penting? Inilah masalah klasik Kubernetes: mul adalah app yang perlu file bersama. NFS tradisional bisa, tapi tidak scale/self-healing. CephFS memberi RWX yang terdistribusi — behavior seperti NFS, tapi di atas RADOS yang self-healing & bisa discaling.
apiVersion: ceph.rook.io/v1
kind: CephFilesystem
metadata:
name: myfs
namespace: rook-ceph
spec:
metadataPool:
replicated:
size: 1
dataPools:
- replicated:
size: 2
metadataServer:
activeCount: 2
activeStandby: trueField penting:
metadataPool — pool untuk metadata (direktori, file name). Ukuran 1 untuk lab.dataPools — pool untuk data file. size: 2 → HA 1 node.metadataServer.activeCount: 2 — 2 MDS aktif untuk throughput.activeStandby: true — standby siaga saat MDS aktif gagal.kubectl -n rook-ceph get pods | grep mdsHarusnya muncul rook-ceph-mds-myfs-a dan -b.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rook-cephfs
provisioner: rook-ceph.cephfs.csi.ceph.com
parameters:
clusterID: rook-ceph
fsName: myfs
pool: myfs-data0
csi.storage.k8s.io/provisioner-secret-name: rook-csi-cephfs-provisioner
csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
csi.storage.k8s.io/controller-expand-secret-name: rook-csi-cephfs-provisioner
csi.storage.k8s.io/controller-expand-secret-namespace: rook-cephprovisioner: rook-ceph.cephfs.csi.ceph.comfsName: nama filesystem (myfs)apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: laravel-media
spec:
accessModes:
- ReadWriteMany
storageClassName: rook-cephfs
resources:
requests:
storage: 5GiapiVersion: apps/v1
kind: Deployment
metadata:
name: laravel
spec:
replicas: 3
selector:
matchLabels:
app: laravel
template:
metadata:
labels:
app: laravel
spec:
containers:
- name: app
image: registry.example.com/laravel-app:latest
volumeMounts:
- name: media
mountPath: /var/www/html/storage/app
- name: public-media
mountPath: /var/www/html/public/storage
volumes:
- name: media
persistentVolumeClaim:
claimName: laravel-media
- name: public-media
persistentVolumeClaim:
claimName: laravel-mediaSemua replica (3) me-mount volume yang sama bersamaan — file upload dari Pod A langsung terlihat dari Pod B.
kubectl exec deploy/laravel -- /bin/bash -c \
"echo halo > /var/www/html/storage/app/uji.txt && cat /var/www/html/storage/app/uji.txt"Kalau uji.txt terbaca di Pod lain, CephFS RWX bekerja.
Untung Ceph Rook menyediakan CephFilesystemSubVolumeGroup untuk rate-limit & isolasi per tenant:
apiVersion: ceph.rook.io/v1
kind: CephFilesystemSubVolumeGroup
metadata:
name: group-tenant-a
namespace: rook-ceph
spec:
filesystem: myfs
dataPoolName: myfs-data0Subvolume group memungkinkan kuota, quota per tenant, dan isolasi I/O di dalam satu CephFS.
Tip
Jangan pernah menaruh database di atas CephFS RWX — mounting PostgreSQL/MySQL data folder pada CephFS adalah anti-pattern (locking & fsync tidak dijamin). Pisahkan tegas: RBD untuk DB, CephFS untuk file berbagi.
Inti yang harus dibawa pulang:
CephFilesystem → myfs dengan metadataPool + dataPools + MDS active/standby.rook-ceph.cephfs.csi.ceph.com dengan fsName: myfs untuk RWX.laravel-media bersamaan — file upload terlihat dari semua Pod.Di episode 9 selanjutnya kita akan membahas object storage (RGW/S3) untuk Laravel — membuat CephObjectStore, user dengan S3 key, object bucket claim (OBC), dan integrasi Laravel Flysystem S3 ke RGW. Sampai jumpa di episode 9!