Mengupas fondasi teknis shared filesystem RWX: apa itu NFS, keunggulan NFS v4.2, standar Container Storage Interface beserta sidecar-containernya, serta alur kerja NFS CSI Driver dari PVC sampai Pod mount

Setelah di episode 1 kita memahami kenapa aplikasi web butuh shared filesystem, pada episode ini kita bedah dua teknologi yang menjadi tulang punggung solusi kita: NFS dan CSI. Keduanya adalah fondasi yang akan kalian pegang terus sampai episode 27.
Mengapa harus paham keduanya? Karena bila kalian hanya hafal manifest tanpa memahami NFS dan CSI, debugging akan terasa seperti menebak. Pesan error seperti nfs: server not responding atau failed to provision volume with StorageClass hanya bisa dimengerti dengan baik bila kalian tahu apa yang terjadi di balik layar.
NFS adalah protokol berbagi file antar host yang sudah ada sejak 1984 — dikembangkan oleh Sun Microsystems. Usianya lebih tua dari Kubernetes itu sendiri, dan justru itulah kekuatannya: NFS adalah standar mapan yang didukung oleh setiap kernel Linux dan setiap sistem operasi besar.
Versi modern yang kita pakai adalah NFS v4.2, yang membawa peningkatan penting:
Arsitektur NFS sangat sederhana: satu server mengekspor direktori lewat file /etc/exports, dan banyak client melakukan mount:
Client (worker node) --NFS--> Server (export /srv/k8s-shared)
| |
mount -t nfs /etc/exports:
/srv/k8s-shared *(rw,sync,...)showmount -e 192.168.10.20
mount -t nfs 192.168.10.20:/srv/k8s-shared /mnt/k8s-shared
df -h /mnt/k8s-sharedPerintah di atas menampilkan export yang tersedia, melakukan mount manual, lalu menampilkan kapasitasnya. Ini adalah uji kelayakan yang selalu kita pakai saat troubleshooting.
Containers Storage Interface (CSI) adalah standar industri yang memungkinkan Kubernetes memanggil storage provider melalui gRPC. Sebelum CSI, dukungan storage di Kubernetes berupa kode in-tree — satu driver di-compile ke dalam kubelet. CSI memisahkan ini: vendor menulis driver sebagai Pod biasa yang berkomunikasi dengan Kubernetes.
Driver CSI bekerja dengan bantuan sidecar containers resmi (csi-provisioner, csi-attacher, dst.) yang dikelola komunitas Kubernetes:
| Sidecar | Tugas |
|---|---|
csi-provisioner | Membuat/menghapus volume (provision & delete) |
csi-attacher | Menangani attach/detach volume |
csi-resizer | Memperbesar volume (expansion) |
csi-snapshotter | Membuat/merestore snapshot |
csi-node-driver-registrar | Mendaftarkan plugin ke kubelet di tiap node |
Prinsipnya: Kubernetes tidak perlu tahu cara kerja NFS — ia cukup berbicara gRPC ke driver, yang tahu bagaimana berkomunikasi dengan NFS server.
nfs.csi.k8s.io)NFS CSI Driver adalah driver GA yang mengubah NFS biasa menjadi storage dynamic di Kubernetes. Kemampuannya yang membuat segalanya mungkin: dynamic provisioning sub-direktori di NFS export, per-PVC.
Artinya, satu NFS server bisa melayani puluhan PVC, masing-masing dengan sub-direktori sendiri — isolasi antar aplikasi tercapai tanpa harus membuat export baru per aplikasi.
Berikut alur lengkapnya ketika sebuah Pod memakai PVC RWX:
Tahapannya:
storageClassName: nfs-rwx.nfs.csi.k8s.io.csi-provisioner memanggil driver → driver membuat subdirektori di NFS export (misal /srv/k8s-shared/<namespace>/<pvc-name>/).csi-nfs-node (node plugin) melakukan mount NFS ke path subdirektori tersebut.Note
Keindahan arsitektur ini: NFS tidak peduli node mana yang mount. Asalkan node satu jaringan dengan server, mount berhasil. Di sinilah "RWX" menjadi natural — bukan karena feature khusus, melainkan karena semua Pod melihat file yang sama di server terpusat.
Pada episode 2 ini, kalian telah membangun fondasi teknis yang dibutuhkan mengikuti series ini:
Inti yang harus dibawa pulang:
csi-provisioner, csi-attacher, csi-resizer, csi-snapshotter menjembatani Kubernetes dengan driver.nfs.csi.k8s.io) memungkinkan dynamic provisioning sub-direktori per PVC.Di episode 3 selanjutnya kita masuk ke praktik pertama: setup NFS Server untuk Kubernetes — install nfs-kernel-server, konfigurasi /etc/exports dengan flag yang tepat, menyalakan service, dan memverifikasi export dari sisi client. Sampai jumpa di episode 3!