Belajar Kubernetes Simple Shared Storage - Akses RWX untuk Deployment Laravel
Episode 7 of 28

Belajar Kubernetes Simple Shared Storage - Akses RWX untuk Deployment Laravel

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

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

Pendahuluan

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

Manifest

PVC Media (RWX)

pvc-media-storage.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: media-storage
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: openebs-nfs-rwx
  resources:
    requests:
      storage: 5Gi

Perhatikan dua hal: accessModes: ReadWriteMany dan storageClassName: openebs-nfs-rwx — duet ini memicu lahirnya NFS Server Pod (episode 5-6).

Deployment Laravel Multi-Replica

deployment-laravel.yaml
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-storage
KubernetesApply dan lihat hasilnya
kubectl apply -f pvc-media-storage.yaml
kubectl apply -f deployment-laravel.yaml
kubectl get pod -l app=laravel -o wide

Note

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.

Fungsi Shared

Apa yang dicapai oleh 3 replica ini:

  • Upload user di storage/app/uploads terekam oleh Pod mana pun, tersedia di semua Pod — karena semua menulis ke satu volume.
  • Media publik di storage/app/public (symlink ke public/storage) tampil dari replica mana pun.
  • Satu replica down → user lain tetap baca file, karena data tidak menempel pada replica tersebut.

Ini bukan "fitur bonus" — ini perilaku yang dijanjikan access mode ReadWriteMany, dan kita sudah membuktikannya di episode 6.

Verifikasi

Lakukan demo multi-akses lengkap:

Tulis lewat pod-0
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'
Baca lewat pod-2
POD2=$(kubectl get pod -l app=laravel -o jsonpath='{.items[2].metadata.name}')
kubectl exec $POD2 -- cat /var/www/storage/app/uploads/demo.txt

Kemungkinan nilai yang muncul: upload-demo — file ditulis di Pod 1, dibaca di Pod 3.

Cek dari sisi volume

Backing Local PV ikut mencatat file:

LinuxLihat data di folder node
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".

Penutup

Pada episode 7 ini, aplikasi nyata telah memakai shared storage:

Inti yang harus dibawa pulang:

  • PVC ReadWriteMany + openebs-nfs-rwx memicu NFS server per-PVC.
  • Deployment 3 replica me-mount volume yang sama → shared upload & media.
  • Init container memastikan struktur & symlink siap di tiap replica.
  • Verifikasi: tulis di pod X, baca di pod Y; cek folder backing di node.
  • Satu replica up/down tidak menghilangkan akses ke data.

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!

Belajar Kubernetes Simple Shared Storage - Akses RWX untuk Deployment Laravel | Belajar Kubernetes Simple Shared Storage