Belajar Kubernetes Distributed Storage - Object Storage (RGW/S3) untuk Laravel
Episode 9 of 28

Belajar Kubernetes Distributed Storage - Object Storage (RGW/S3) untuk Laravel

Menghidupkan tiga protokol storage terakhir: object storage RGW/S3 untuk Laravel. Membuat CephObjectStore, membuat user S3 dengan access key lewat CephObjectStoreUser, memakai Object Bucket Claim untuk provisioning bucket otomatis, lalu mengintegrasikan Flysystem S3.

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

Pendahuluan

Setelah block (RBD) dan file (CephFS), episode 9 melengkapi trio storage: object storage S3-compatible melalui RGW (RADOS Gateway). Ini lapisan yang biasanya dipakai untuk media besar, arsip, dan data yang tidak butuh mount filesystem.

Mengapa penting? Object storage berbeda filosofinya: data diakses lewat API (bucket/key), bukan mount. Ceph memberi ini natively, sehingga aplikasi Laravel bisa memakai disk S3 via Flysystem — scalable, tanpa file system mount.

Membuat CephObjectStore (RGW)

Manifest Object Store

yaml
apiVersion: ceph.rook.io/v1
kind: CephObjectStore
metadata:
  name: my-store
  namespace: rook-ceph
spec:
  gateway:
    port: 8080
    instances: 1
  metadataPool:
    replicated:
      size: 1
  dataPool:
    failureDomain: host
    replicated:
      size: 2
  • gateway.port: 8080 — port RGW.
  • instances: 1 — satu (lalu di-scale di episode 16).
  • metadataPool + dataPool — pool untuk metadata dan data object.

Verifikasi RGW

Cek pods RGW
kubectl -n rook-ceph get pods | grep rgw
kubectl -n rook-ceph get svc | grep rgw

Service rook-ceph-rgw-my-store muncul di port 8080.

CephObjectStoreUser — User S3

Membuat User dengan Access Key

yaml
apiVersion: ceph.rook.io/v1
kind: CephObjectStoreUser
metadata:
  name: my-store-user
  namespace: rook-ceph
spec:
  store: my-store
  displayName: "Laravel App"

Rook menghasilkan kredensial (AccessKey & SecretKey) dan menyimpannya sebagai Secret:

Ambil kredensial
kubectl -n rook-ceph get secret rook-ceph-object-user-my-store-my-store-user -o yaml

Nilai base64 mengkodekan AccessKey dan SecretKey.

Object Bucket Claim (OBC) / COSI

Provisioning Bucket Otomatis

OBC (Object Bucket Claim) membuat bucket + kredensial secara otomatis untuk namespace-nya:

yaml
apiVersion: objectbucket.io/v1alpha1
kind: ObjectBucketClaim
metadata:
  name: laravel-bucket
  namespace: laravel
spec:
  bucketName: laravel-media-bucket
  storageClassName: rook-ceph-bucket
  generateBucketName: laravel-media-bucket

Dengan COSI (Container Object Storage Interface), bucket eksis per namespace & kredensial di-generate sebagai Secret — aplikasi cukup baca dari Secret.

StorageClass Bucket

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: rook-ceph-bucket
provisioner: rook-ceph.ceph.object.bucket.v1
parameters:
  objectStoreName: my-store
  objectStoreNamespace: rook-ceph

Integrasi Laravel (Flysystem S3)

Env Laravel

env
FILESYSTEM_DISK=s3
AWS_ENDPOINT_URL=http://rook-ceph-rgw-my-store.rook-ceph.svc:8080
AWS_ACCESS_KEY_ID=xxx
AWS_SECRET_ACCESS_KEY=yyy
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=laravel-media-bucket

AWS_ENDPOINT_URL menunjuk ke RGW internal (bukan AWS). Region di RGW default us-east-1.

Upload & Tampilkan File

Upload lewat artisan tinker (dalam Pod)
kubectl exec -it deploy/laravel -- php artisan tinker --execute="
  Storage::disk('s3')->put('foto/logo.png', file_get_contents('/tmp/logo.png'));
  echo Storage::disk('s3')->url('foto/logo.png');
"

Atau presigned URL untuk file pribadi:

php
Storage::disk('s3')->temporaryUrl('foto/rahasia.png', now()->addMinutes(5));

Konfirmasi Object di Ceph

Gunakan awscli/s3cmd atau cek dari toolbox:

List bucket (via aws cli di toolbox)
aws --endpoint-url http://rook-ceph-rgw-my-store:8080 s3 ls --recursive

Perbandingan Penggunaan di Laravel

StorageDigunakan Untuk
RBDVolume database PostgreSQL (RWO)
CephFSFile upload bersama antar Pod (RWX)
S3/RGWObject media besar, arsip, CDN-served

Ketiganya dalam satu CephCluster — inilah keunggulan kuat Rook-Ceph dibanding solusi single-protocol.

Note

Pilih CephFS atau S3? Jika file perlu diakses langsung oleh Pod (misal PHP memproses), gunakan CephFS. Jika file besar, arsip, atau perlu presigned URL, gunakan S3/RGW. Keduanya coexist dengan sempurna.

Penutup

Inti yang harus dibawa pulang:

  • CephObjectStore (my-store) = RGW yang menyediakan S3 API.
  • CephObjectStoreUser membuat user + kredensial AccessKey/SecretKey.
  • OBC/COSI mem-provisi bucket + Secret per namespace secara otomatis.
  • Laravel Flysystem s3 dengan AWS_ENDPOINT_URL mengarah ke RGW.
  • RBD, CephFS, RGW = tiga storage dalam satu cluster.

Di episode 10 selanjutnya kita akan men-deploy Laravel end-to-end — menggabungkan database RBD, file upload CephFS, dan object S3 dalam satu deployment lengkap, termasuk migrasi dan seeding. Sampai jumpa di episode 10!