Menerapkan shared storage ke aplikasi nyata: membuat PVC media-storage dengan accessModes ReadWriteMany, menulis Deployment Laravel tiga replica yang me-mount volume yang sama, dan membuktikan upload serta media tersedia di semua replica

Eksperimen alpine di episode 6 membuktikan shared storage bekerja secara low level. Sekarang naikkan ke level yang kalian lihat di produksi: aplikasi Laravel multi-replica yang menyimpan upload user dan media ke volume RWX bersama.
Di episode 7 kita menyusun manifest yang menjadi template aplikasi web stateful di atas OpenEBS. Prinsip yang akan kalian bawa: replicate, shared storage, dan jalan pikiran "apa yang harus menjadi volume".
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: media-storage
spec:
accessModes:
- ReadWriteMany
storageClassName: openebs-nfs-rwx
resources:
requests:
storage: 5GiPerhatikan dua hal: accessModes: ReadWriteMany dan storageClassName: openebs-nfs-rwx — duet ini memicu lahirnya NFS Server Pod (episode 5-6).
apiVersion: apps/v1
kind: Deployment
metadata:
name: laravel
labels:
app: laravel
spec:
replicas: 3
selector:
matchLabels:
app: laravel
template:
metadata:
labels:
app: laravel
spec:
securityContext:
fsGroup: 33
initContainers:
- name: prepare-storage
image: busybox:1.36
command:
- /bin/sh
- -c
- |
mkdir -p /var/www/storage/app/uploads
[ -d /var/www/public/storage ] || ln -sfn /var/www/storage/app/public /var/www/public/storage
volumeMounts:
- name: media-vol
mountPath: /var/www/storage
containers:
- name: laravel-web
image: ghcr.io/<user>/laravel-media:1.0.0
env:
- name: FILESYSTEM_DISK
value: public
volumeMounts:
- name: media-vol
mountPath: /var/www/storage
volumes:
- name: media-vol
persistentVolumeClaim:
claimName: media-storagekubectl apply -f pvc-media-storage.yaml
kubectl apply -f deployment-laravel.yaml
kubectl get pod -l app=laravel -o wideNote
Init container prepare-storage membuat struktur folder dan symlink public/storage sebelum aplikasi jalan — pola yang sama dengan series NFS, menjaga setiap replica baru melihat volume yang siap dipakai.
Apa yang dicapai oleh 3 replica ini:
storage/app/uploads terekam oleh Pod mana pun, tersedia di semua Pod — karena semua menulis ke satu volume.storage/app/public (symlink ke public/storage) tampil dari replica mana pun.Ini bukan "fitur bonus" — ini perilaku yang dijanjikan access mode ReadWriteMany, dan kita sudah membuktikannya di episode 6.
Lakukan demo multi-akses lengkap:
POD0=$(kubectl get pod -l app=laravel -o jsonpath='{.items[0].metadata.name}')
kubectl exec $POD0 -- sh -c 'echo "upload-demo" > /var/www/storage/app/uploads/demo.txt'POD2=$(kubectl get pod -l app=laravel -o jsonpath='{.items[2].metadata.name}')
kubectl exec $POD2 -- cat /var/www/storage/app/uploads/demo.txtKemungkinan nilai yang muncul: upload-demo — file ditulis di Pod 1, dibaca di Pod 3.
Backing Local PV ikut mencatat file:
ls -la /var/lib/openebs/openebs-hostpath/Folder di node worker menunjukkan data media yang tersimpan secara fisik.
Warning
Jika file TIDAK terlihat antar replica, periksa dua hal: (1) apakah PVC memakai openebs-nfs-rwx — bukan openebs-hostpath (RWO); (2) apakah semua replica me-mount PVC yang sama pada path yang sama. Keduanya penyebab >90% masalah "file hilang antar Pod".
Pada episode 7 ini, aplikasi nyata telah memakai shared storage:
Inti yang harus dibawa pulang:
ReadWriteMany + openebs-nfs-rwx memicu NFS server per-PVC.Di episode 8 selanjutnya kita akan menempatkan database PostgreSQL di atas Local PV: memisahkan storage DB (RWO, performa lokal) dari media RWX, menulis StatefulSet dengan PVC hostpath, dan memahami resiko Local PV yang terikat node. Sampai jumpa di episode 8!