Container dan Kubernetes menaruh tuntutan baru pada filesystem: efisiensi image, volume yang fleksibel, dan semantik yang benar untuk workload stateful. Episode ini membahas OverlayFS, rootless container, lalu CSI seperti Rook-Ceph dan TopoLVM, serta local persistent volumes.

Container tidak menyimpan data sendiri — image bersifat read-only dan setiap tulis membutuhkan lapisan baru. Inilah alasan mengapa pemahaman filesystem menjadi fondasi bagi container dan Kubernetes. Episode 15 menghubungkan konsep filesystem yang sudah kalian pelajari dengan dunia container modern.
Kita mulai dari OverlayFS — mesin copy-on-write yang menjadi inti manajemen image container. Lalu kita bahas volume dan snapshot, rootless container, dan masuk ke Kubernetes: CSI dengan Rook-Ceph dan TopoLVM, local persistent volumes, dan semantik filesystem untuk workload stateful.
Di akhir episode, kalian akan paham mengapa storage di Kubernetes bukan sekadar "pasang disk", melainkan keputusan arsitektur.
OverlayFS adalah filesystem yang menggabungkan beberapa direktori (layer) menjadi satu view. Layer bawah bersifat read-only (image), layer atas menampung perubahan (container). Saat container menulis file, OverlayFS menyalin blok yang diubah ke layer atas — ini Copy-on-Write yang persis seperti btrfs dan ZFS.
Lihat bagaimana runtime container memakai overlay:
mount | grep overlay
df -hT /var/lib/dockerOutput mount | grep overlay menampilkan baris dengan tipe overlay dan opsi lowerdir, upperdir, serta workdir — itulah tiga layer pembentuk filesystem container.
Periksa image dan lapisannya dengan tool container:
docker image inspect ubuntu:24.04 --format '{{.RootFS.Layers}}'Setiap layer adalah delta dari layer sebelumnya. Karena itu image container efisien: dua container dari image yang sama berbagi semua layer read-only, hanya layer atas yang berbeda per container.
Tulis di dalam container hilang saat container dihapus. Volume menyimpan data di luar layer container — dan di sinilah filesystem host berperan. Volume container pada dasarnya adalah direktori di filesystem host (biasanya btrfs atau ZFS jika dipasang driver storage tersebut).
Dengan driver btrfs atau ZFS, snapshot image container hampir gratis:
sudo zfs snapshot docker-pool/ubuntu@v1
sudo zfs clone docker-pool/ubuntu@v1 docker-pool/ubuntu-stagingPola snapshot + clone ini membuat image staging atau rollback environment tanpa menggandakan penyimpanan — teknik yang sama seperti episode 10, sekarang diterapkan pada image container.
Container rootless menjalankan seluruh proses user space tanpa root, sehingga mengurangi dampak kerentanan runtime. Konsekuensinya, filesystem dipasang di namespace user — mount overlay di bawah /etc/subuid dan fuse-overlayfs untuk kasus tertentu:
dockerd-rootless-setuptool.sh install
systemctl --user start dockerPeriksa mount yang dihasilkan:
mount | grep -E "overlay|fuse" | headfuse-overlayfs adalah fallback berbasis FUSE ketika kernel tidak mengizinkan overlay biasa di namespace user. Tradeoff-nya: performa sedikit lebih rendah dibanding overlay kernel native.
Kubernetes memisahkan manajemen storage melalui CSI — driver yang berjalan sebagai pod dan menangani provision, mount, dan snapshot. Dua contoh populer:
Melihat storage class yang tersedia:
kubectl get storageclass
kubectl get pv,pvcOutput kubectl get pv,pvc menampilkan PersistentVolume dan PersistentVolumeClaim — abstraksi yang memisahkan konsumen storage (pod) dari penyedia (CSI).
Untuk workload yang harus menempel pada node tertentu (misalnya database dengan data besar), local persistent volume memakai disk atau filesystem lokal tanpa replikasi jaringan:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-fast
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumervolumeBindingMode: WaitForFirstConsumer menunda pengikatan sampai pod dijadwalkan — memastikan PV dibuat di node yang sama dengan pod.
Workload stateful (database) sangat bergantung pada semantik filesystem: fsync, O_DIRECT, dan konsistensi crash. Ini beberapa pertimbangan:
fsync yang jujur — ZFS dengan ZIL atau ext4 dengan data=ordered.dataSource dari PVC untuk meng-clone volume dari snapshot.Simulasikan pembuatan PVC dari snapshot dengan CSI Rook-Ceph:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: restore-pg
spec:
storageClassName: rook-ceph-block
dataSource:
name: pg-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20GiPola ini menerjemahkan snapshot filesystem (episode 9) ke dalam dunia Kubernetes: memulihkan database dari titik waktu tanpa mengembalikan seluruh klaster.
Info
Semantik filesystem host menembus hingga ke pod: apakah volume menjamin fsync yang durable, mendukung snapshot konsisten, dan menangani resize online. Selalu baca dokumentasi CSI tentang perilaku ini sebelum memilih storage class.
Container dan Kubernetes tidak menggantikan filesystem — mereka membungkusnya dengan abstraksi baru. OverlayFS memberi image yang efisien, volume meneruskan data ke filesystem host, dan CSI menerjemahkan semantik filesystem ke API Kubernetes. Konsep yang kalian pelajari di episode 0-14 tetap relevan, hanya dengan lapisan baru di atasnya.
Inti yang harus dibawa pulang:
Di episode 16 selanjutnya kita membahas performance tuning — mount options noatime/discard/compress, recordsize, scheduler I/O mq-deadline dan bfq, tuning page cache, lalu benchmarking dengan fio dan dd. Kalian akan belajar mengukur dan mengoptimalkan filesystem secara ilmiah.