Memahami permainan UID/GID di NFS: perilaku squash terhadap root di container, perbandingan all_squash vs no_root_squash untuk lab dan produksi, membatasi client di /etc/exports, serta memperbaiki permission file dengan chown dan stat

NFS sudah berjalan dan aplikasi menulis file. Lalu suatu hari muncul error yang paling dibenci: Permission denied. Bukan salah konfigurasi mount, bukan jaringan — ini masalah UID/GID. NFS memetakan pengguna berdasarkan angka (UID), bukan nama; jika UID file di sisi server beda dari UID user aplikasi di container, akses ditolak.
Episode 13 adalah pelajaran yang paling sering membuat orang bingung dan paling sering diabaikan sampai produksi meledak. Kita bongkar tuntas cara kerja pemetaan user di NFS.
Ketika container menulis ke NFS, sistem menulis file dengan UID dari proses — misalnya www-data yang ber-UID 33. Di sisi server, file itu tampak milik user dengan UID 33 (apapun namanya). Dua kondisi yang harus selaras:
kubectl exec deploy/laravel -- id www-datals -ln /srv/k8s-shared/dynamic/default/rwx-media/app/uploads/id www-data menunjukkan uid=33 di container.ls -ln menunjukkan owner numerik file; tujuannya: keduanya sama-sama 33.Selisih satu angka = Permission denied. Ini tidak memandang bulu: root pun bisa kena bila no_root_squash tidak diaktifkan.
Root di container (UID 0) tidak secara otomatis menjadi root di NFS. Default NFS memetakan (squash) root ke user anonim nobody (UID 65534). Konsekuensinya: proses root di container tidak bisa menulis ke folder milik www-data:33 di server.
Dua kebijakan:
no_root_squash — root di container TETAP root di server. Gampang untuk lab, tetapi berbahaya (root bisa menulis ke mana pun di export).all_squash — semua user (termasuk yang bukan root) dipetakan ke satu identitas anonuid/anongid. Aman dan terkontrol untuk produksi.| Aspek | no_root_squash | all_squash + anonuid |
|---|---|---|
| Root di container | Menjadi root di server | Dipetakan ke anonuid |
| Kemudahan lab | Tinggi | Menengah |
| Keamanan | Rendah | Tinggi |
| Cocok | Lab/personal | Production, multi-tenant |
| Contoh | /srv/k8s-shared *(...no_root_squash...) | /srv/k8s-shared worker(rw,all_squash,anonuid=33,anongid=33) |
Untuk lab seri ini kita memakai no_root_squash (agar inisialisasi container dengan USER root lancar). Untuk produksi, beralihlah ke all_squash dengan anonuid = UID aplikasi.
*Di episode 3 kita memakai * demi kemudahan. Di produksi, batasi ke IP worker:
/srv/k8s-shared 192.168.10.21(rw,sync,no_subtree_check,all_squash,anonuid=33,anongid=33) \
192.168.10.22(rw,sync,no_subtree_check,all_squash,anonuid=33,anongid=33)Terapkan ulang setelah mengubah:
sudo exportfs -ra
showmount -efsid=0 — menandai root export; berguna untuk topologi mount yang rumit.crossmnt — mengizinkan traversal ke mount di dalamnya.sec=krb5p — enkripsi transport via Kerberos (butuh KDC); kita bahas di episode 15.Warning
Ubah ekspor menjadi IP-spesifik sesegera mungkin. * pada jaringan office memungkinkan mesin tak dikenal mount direktori upload — kebocoran data tinggal menunggu.
Saat file di NFS salah owner (mis. tertulis sebagai 65534/nobody), perbaiki dengan chown langsung di server:
sudo chown -R 33:33 /srv/k8s-sharedDebug dengan membandingkan angka:
ls -ln /srv/k8s-shared/dynamic/default/rwx-media/
stat -c "%u:%g %n" /srv/k8s-shared/dynamic/default/rwx-media/stat menampilkan UID/GID aktual dan path-nya — pertanyaan kunci ketika user melapor "folder tak bisa ditulis".
Tip
Jangan perbaiki permission hanya di sisi volume. Perbaiki akar masalah: konsistensi UID. Atur fsGroup: 33 pada Pod (episode 10) + anonuid=33 pada ekspor → seluruh lapisan sepakat bahwa "files = 33".
Pada episode 13 ini, kalian telah menaklukkan masalah UID/GID:
Inti yang harus dibawa pulang:
www-data (33) harus sama di container dan server.nobody kecuali ekspor memakai no_root_squash.no_root_squash; Produksi: all_squash + anonuid=33/anongid=33./etc/exports ke IP worker — jangan *.chown -R 33:33 dan debug dengan ls -ln/stat.Di episode 14 selanjutnya kita akan memperkuat keamanan jaringan: NetworkPolicy & isolasi storage traffic — membatasi akses NFS hanya dari Pod tertentu, membuka port yang tepat di firewall server, dan opsi VPN untuk cluster terdistribusi. Sampai jumpa di episode 14!