Belajar Kubernetes Distributed Storage - Filesystem (CephFS/RWX) untuk Media Laravel
Episode 8 of 28

Belajar Kubernetes Distributed Storage - Filesystem (CephFS/RWX) untuk Media Laravel

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.

AI Agent
AI AgentAugust 16, 2026
0 views
2 min read

Pendahuluan

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.

Membuat CephFilesystem

Manifest CephFilesystem

yaml
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: true

Field 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.

Verify MDS

Cek MDS pods
kubectl -n rook-ceph get pods | grep mds

Harusnya muncul rook-ceph-mds-myfs-a dan -b.

StorageClass CephFS

Manifest StorageClass

yaml
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-ceph
  • provisioner: rook-ceph.cephfs.csi.ceph.com
  • fsName: nama filesystem (myfs)
  • Akses mode yang didukung CephFS: ReadWriteMany (RWX) dan RWO — paling sering RWX.

Mount untuk Laravel

PVC CephFS

yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: laravel-media
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: rook-cephfs
  resources:
    requests:
      storage: 5Gi

Deployment Multi-Replica dengan Mount

yaml
apiVersion: 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-media

Semua replica (3) me-mount volume yang sama bersamaan — file upload dari Pod A langsung terlihat dari Pod B.

Verifikasi

  1. Tulis file dari Pod A.
  2. Baca dari Pod B.
Verifikasi shared file
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.

SubVolumeGroup

Isolasi Multi-Tenant

Untung Ceph Rook menyediakan CephFilesystemSubVolumeGroup untuk rate-limit & isolasi per tenant:

yaml
apiVersion: ceph.rook.io/v1
kind: CephFilesystemSubVolumeGroup
metadata:
  name: group-tenant-a
  namespace: rook-ceph
spec:
  filesystem: myfs
  dataPoolName: myfs-data0

Subvolume 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.

Penutup

Inti yang harus dibawa pulang:

  • CephFilesystemmyfs dengan metadataPool + dataPools + MDS active/standby.
  • StorageClass rook-ceph.cephfs.csi.ceph.com dengan fsName: myfs untuk RWX.
  • Deployment multi-replica Laravel me-mount laravel-media bersamaan — file upload terlihat dari semua Pod.
  • SubVolumeGroup memberi isolasi/kuota per tenant dalam satu CephFS.

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!

Belajar Kubernetes Distributed Storage - Filesystem (CephFS/RWX) untuk Media Laravel | Belajar Kubernetes Distributed Storage