Menulis Deployment Laravel dengan tiga replica yang berbagi satu PVC RWX, memastikan semua Pod mount ke direktori yang sama, lalu membuktikan perilaku berbagi dengan uji tulis-baca antar Pod dan rollout restart

Ini episode yang kalian tunggu-tunggu: aplikasi bertemu shared storage. Kita menulis Deployment Laravel dengan replicas: 3 di mana ketiga replica memakai satu PVC RWX yang sama. Saat selebrasi selesai, kita buktikan dengan eksperimen nyata bahwa file yang ditulis Pod A terlihat di Pod B.
Why penting: sampai episode ini, semua komponen berdiri sendiri-sendiri. Deployment adalah tempat mereka dirajut — image, Secret, probe (episode 9), dan volume RWX (episode 5). Pola yang kalian susun di sini akan dibawa ke seluruh sisa series.
apiVersion: apps/v1
kind: Deployment
metadata:
name: laravel
labels:
app: laravel
spec:
replicas: 3
selector:
matchLabels:
app: laravel
template:
metadata:
labels:
app: laravel
spec:
imagePullSecrets:
- name: registry-credentials
securityContext:
fsGroup: 33
containers:
- name: laravel-web
image: ghcr.io/<user>/laravel-media:1.0.0
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /
port: 80
volumeMounts:
- name: rwx-media
mountPath: /var/www/storage
- name: rwx-public
mountPath: /var/www/public/storage
volumes:
- name: rwx-media
persistentVolumeClaim:
claimName: rwx-media
- name: rwx-public
persistentVolumeClaim:
claimName: rwx-mediaBeberapa keputusan penting:
replicas: 3 — skala horizontal; semua replica memakai PVC yang sama.volumeMounts — storage di-mount ke /var/www/storage, dan public/storage ke /var/www/public/storage (membuka akses file publik).fsGroup: 33 — memetakan file volume ke grup GID 33 (www-data), sehingga file NFS yang ber-owner 33 terbaca; detail di episode 13.imagePullSecrets — Secret registry dari episode 9 untuk image privat.Note
Dua volume mount menunjuk ke PVC yang SAMA (rwx-media) di dua mount point berbeda. Ini sah dan umum — satu volume bisa di-mount di banyak titik dalam satu Pod.
Uji cepat: apakah tiga replica benar-benar berbagi?
ReadWriteMany — bukan RWO (akses satu node) atau per-setiap-PVC.kubectl get pvc rwx-media
kubectl get deployment laravel
kubectl get pods -l app=laravel -o widePerhatikan bahwa Pod tersebar di lebih dari satu worker — itu yang membedakan RWX dari RWO.
kubectl exec deploy/laravel -- sh -c \
'echo "hello from pod1" > /var/www/storage/app/uploads/pod1.txt'POD2=$(kubectl get pod -l app=laravel -o jsonpath='{.items[1].metadata.name}')
kubectl exec $POD2 -- cat /var/www/storage/app/uploads/pod1.txtOutput hello from pod1 membuktikan file yang ditulis Pod 1 langsung tersedia di Pod 2, meski Pod 2 hidup di node berbeda.
kubectl rollout restart deployment/laravelTunggu rollout selesai, lalu cek data tetap ada:
kubectl rollout status deployment/laravel --timeout=120s
kubectl exec deploy/laravel -- ls -la /var/www/storage/app/uploads/File pod1.txt tetap ada — karena data hidup di NFS server, bukan di disk Pod.
Warning
Jika eksperimen ini TIDAK berhasil (file tak terlihat antar Pod), kemungkinan besar kalian memakai PVC RWO, mount path berbeda, atau dua PVC terpisah. Tutup dulu, dan diagnosa dengan kubectl describe pod untuk melihat path mount aktual — kita bahas mendalam di episode 24.
Pada episode 10 ini, kalian telah merajut aplikasi dengan shared storage:
Inti yang harus dibawa pulang:
replicas: 3 memakai satu PVC RWX melalui dua mount point.fsGroup: 33 menyelaraskan permission file volume dengan user runtime.kubectl exec tulis dari Pod 1, baca dari Pod 2.rollout restart tidak menghilangkan data — bukti persistensi di NFS.Di episode 11 selanjutnya kita akan expose aplikasi: Service, Ingress, dan akses media publik — Service ClusterIP, NGINX Ingress, alias /storage di Nginx, dan pengujian end-to-end upload hingga file tampil di URL publik. Sampai jumpa di episode 11!