Membuat PersistentVolume statis untuk data yang sudah ada di NFS: aturan binding PV-PVC (access mode, kapasitas, storage class), perbedaan dynamic vs static provisioning, serta menandai StorageClass sebagai default

Dynamic provisioning di episode 5 membuat PV secara otomatis. Tetapi ada skenario di mana kalian tidak mau otomatis: data yang sudah ada di NFS — misalnya folder media lama berisi ribuan file dari server monolith, atau direktori yang harus dipertahankan apa adanya.
Dalam skenario itu, kita membuat PV statis: kalian (administrator) mendefinisikan sendiri volume yang menunjuk ke path NFS, lalu PVC dibinding ke PV itu secara manual. Di episode 6 ini kita pelajari caranya beserta aturan binding-nya.
Anggap di NFS server sudah ada folder /srv/k8s-shared/media berisi file media proyek lama. Untuk memakainya, kita buat PV yang menunjuk langsung ke path tersebut:
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-static-media
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
server: 192.168.10.20
path: /srv/k8s-shared/mediakubectl apply -f pv-static-media.yaml
kubectl get pvCatatan penting: karena PV pada dasarnya menunjuk ke path NFS yang TIDAK dibuat oleh driver, PVC di atasnya tidak akan memicu provisioning apa pun. PV menunggu PVC yang cocok.
Perhatikan bahwa spec.nfs (bukan spec.csi) — ini adalah volume NFS klasik yang sudah didukung Kubernetes sejak awal, tanpa perlu driver CSI. Bila kalian ingin memakai driver (dan fitur expand), bisa juga menggunakan PV berbasis CSI, tetapi untuk data statis sederhana pendekatan spec.nfs ini paling langsung.
Agar PVC terikat ke PV, terjadi pencocokan (binding) berdasarkan kriteria:
requests.storage ≤ capacity.storage).apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: media-static
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gikubectl apply -f pvc-media-static.yaml
kubectl get pvc media-static
kubectl describe pvc media-statickubectl describe pvc segera menampilkan event Successfully bound persistentvolume "nfs-static-media". Jika ada lebih dari satu PV yang cocok, Kubernetes memilih yang paling sesuai — describe adalah cara kalian melihat keputusannya.
Note
Konfigurasi "PV tanpa StorageClass" (keduanya tanpa class) adalah cara klasik mengelola storage di era pra-CSI. Sekarang pola ini tetap berguna untuk data migrate yang sudah ada: buat PV statis bernama jelas, dan PVC akan datang mengikat.
| Aspek | Dynamic | Static |
|---|---|---|
| Pembuat PV | StorageClass (otomatis) | Administrator (manual) |
| Kapan | Saat PVC dibuat | Sebelumnya, PV sudah ada |
| Data baru | Subdirektori baru dibuat driver | Data yang sudah ada tetap |
| Kontrol path | Template subDir | Path ditentukan di manifest |
| Cocok untuk | Aplikasi baru | Migrasi data existing, ekspor bersama |
Mana yang dipakai? Untuk aplikasi baru: dynamic. Untuk data lama atau direktori bersama yang sudah dilaksanakan di luar Kubernetes: statis.
Ketika PVC dibuat tanpa storageClassName, Kubernetes memakai StorageClass yang ditandai default. Tandai StorageClass nfs-rwx sebagai default jika kalian ingin semua PVC tanpa class otomatis memakai NFS:
kubectl patch storageclass nfs-rwx -p \
'{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'kubectl get scOutput menampilkan (default) di kolom nama StorageClass.
Warning
Jangan jadikan RWX sebagai default di cluster yang juga berisi database. Database butuh RWO dan performa lokal — PVC tanpa class yang terlanjur masuk jalur NFS akan menjadi kesalahan arsitektur yang mahal. Buat default hanya bila seluruh beban cluster memang files/media.
Pada episode 6 ini, kalian telah menguasai provisioning statis:
Inti yang harus dibawa pulang:
spec.nfs menunjuk langsung ke path.Di episode 7 selanjutnya kita masuk ke dunia aplikasi: struktur storage Laravel dan persiapan build — folder mana yang harus di-share, mana yang baked ke image, dan bagaimana Laravel menulis/membaca file lewat Storage. Sampai jumpa di episode 7!