Memahami masalah berbagi file pada aplikasi web yang diskalakan ke banyak replica: upload yang tak terlihat antar Pod, peran access modes RWO/RWX/ROX, dan mengapa NFS + NFS CSI Driver menjadi solusi paling sederhana untuk shared files dan media

Setelah di episode 0 kita menyiapkan environment — cluster 5 node, kubectl, Helm, dan NFS server terpisah — pada episode ini kita membahas pertanyaan yang paling mendasar: mengapa aplikasi web butuh shared filesystem? Ini bukan pertanyaan akademis; jawabannya adalah akar dari semua desain yang akan kita bangun di episode-episode berikutnya.
Bayangkan aplikasi Laravel yang menjual jasa fotografi: user meng-upload hasil foto ke galerinya. Saat traffic naik, kita menambah replica Pod dari 1 menjadi 3. Tanpa shared storage, fitur paling dasar aplikasi tersebut — upload — langsung rusak. Di episode ini kita bongkar kenapa, lalu mengenalkan access modes Kubernetes sebagai bahasa untuk mendiskusikan solusinya.
Laravel, seperti framework web klasik lainnya, menyimpan banyak hal sebagai file di direktori storage/:
| Direktori | Isi | Perilaku |
|---|---|---|
storage/app/uploads | File private hasil upload user | Harus bertahan & terlihat semua replica |
storage/app/public | Media publik (thumbnail, galeri) | Di-symlink ke public/storage |
storage/framework/sessions | Session PHP | Sementara, antar-replica |
storage/framework/cache | Cache | Sementara, bisa dialihkan ke Redis |
storage/framework/views | Compiled blade | Sementara, dibangun ulang |
Saat aplikasi diskalakan ke banyak replica Pod, file yang ditulis oleh Pod A harus bisa dibaca oleh Pod B. Session yang dibuat di Pod A harus dikenali ketika request berikutnya masuk ke Pod B. Upload user yang disimpan di Pod A harus tampil ketika Pod B melayani request.
Apa yang terjadi jika setiap Pod menyimpan file di filesystem lokalnya sendiri?
Upload masuk via LoadBalancer → random ke Pod A atau Pod B
Pod A: file tersimpan di disk Pod A
Pod B: file TIDAK ADATiga masalah konkret yang muncul:
rollout restart? Data ikut hilang.emptyDir tidak membantu. emptyDir memang berbagi antar container dalam satu Pod, tetapi hanya bertahan selama Pod hidup dan TIDAK terbagi antar Pod.apiVersion: v1
kind: Pod
metadata:
name: uploader
spec:
containers:
- name: worker
image: ubuntu
volumeMounts:
- name: scrap
mountPath: /data
volumes:
- name: scrap
emptyDir: {}Important
Intuisi yang harus tertanam: pada aplikasi stateful multi-replica, volume menentukan siapa yang melihat file. Kita tidak menaruh file di "bekas tempat Pod", melainkan di tempat yang hidup lebih lama dari Pod mana pun dan bisa diakses bersama.
Kubernetes mendeskripsikan kemampuan akses sebuah volume lewat access modes. Ini adalah kontrak yang menentukan berapa banyak node dan Pod yang boleh membaca/menulis volume:
| Access Mode | Singkatan | Makna |
|---|---|---|
ReadWriteOnce | RWO | Satu node, satu Pod — biasa untuk database |
ReadOnlyMany | ROX | Banyak node, hanya baca |
ReadWriteMany | RWX | Banyak node, banyak Pod baca-tulis |
Access mode ditulis di PVC/PV, dan harus cocok agar binding terjadi. ReadWriteOncePod adalah varian yang lebih ketat (satu Pod di seluruh cluster). Untuk series ini fokus utama kita adalah RWX.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rwx-media
spec:
accessModes:
- ReadWriteMany
storageClassName: nfs-rwx
resources:
requests:
storage: 10GiRWO. Satu replika primary menulis; replika lain memakai replicas/streaming — bukan berbagi file disk yang sama.RWX. Semua replica Pod menulis ke direktori yang sama.Untuk kebutuhan RWX ada beberapa pendekatan. Untuk kasus web files kita:
Konfigurasi centralized seperti NFS memiliki karakter yang pas untuk upload/gallery/media: metadata ringan, akses langsung via mount, dan tidak mengubah kode aplikasi — file_put_contents() dan Storage::put() tetap bekerja apa adanya.
Pada episode 1 ini, kalian telah memahami akar masalah yang memotivasi seluruh series:
Inti yang harus dibawa pulang:
storage/.emptyDir hanya berbagi antar container, bukan antar Pod.Di episode 2 selanjutnya kita akan membahas konsep dasar NFS dan Container Storage Interface (CSI): sejarah dan keunggulan NFS v4.2, bagaimana CSI menjembatani Kubernetes dengan storage provider, dan alur kerja NFS CSI Driver dari PVC sampai Pod mount. Sampai jumpa di episode 2!