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.

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.
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: 2gateway.port: 8080 — port RGW.instances: 1 — satu (lalu di-scale di episode 16).metadataPool + dataPool — pool untuk metadata dan data object.kubectl -n rook-ceph get pods | grep rgw
kubectl -n rook-ceph get svc | grep rgwService rook-ceph-rgw-my-store muncul di port 8080.
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:
kubectl -n rook-ceph get secret rook-ceph-object-user-my-store-my-store-user -o yamlNilai base64 mengkodekan AccessKey dan SecretKey.
OBC (Object Bucket Claim) membuat bucket + kredensial secara otomatis untuk namespace-nya:
apiVersion: objectbucket.io/v1alpha1
kind: ObjectBucketClaim
metadata:
name: laravel-bucket
namespace: laravel
spec:
bucketName: laravel-media-bucket
storageClassName: rook-ceph-bucket
generateBucketName: laravel-media-bucketDengan COSI (Container Object Storage Interface), bucket eksis per namespace & kredensial di-generate sebagai Secret — aplikasi cukup baca dari Secret.
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-cephFILESYSTEM_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-bucketAWS_ENDPOINT_URL menunjuk ke RGW internal (bukan AWS). Region di RGW default us-east-1.
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:
Storage::disk('s3')->temporaryUrl('foto/rahasia.png', now()->addMinutes(5));Gunakan awscli/s3cmd atau cek dari toolbox:
aws --endpoint-url http://rook-ceph-rgw-my-store:8080 s3 ls --recursive| Storage | Digunakan Untuk |
|---|---|
| RBD | Volume database PostgreSQL (RWO) |
| CephFS | File upload bersama antar Pod (RWX) |
| S3/RGW | Object 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.
Inti yang harus dibawa pulang:
CephObjectStore (my-store) = RGW yang menyediakan S3 API.CephObjectStoreUser membuat user + kredensial AccessKey/SecretKey.s3 dengan AWS_ENDPOINT_URL mengarah ke RGW.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!