Kubernetes Backend Storage NFS

Naufal Gholib Shiddiq
6 min readAug 21, 2023

--

https://cdn3.iconfinder.com/data/icons/file-formats-12/750/1_404-512.png

Saat kita deploy aplikasi kita dengan kubernetes, semua data aplikasi berada di dalam pods dan bersifat non-persistent. Artinya semisal deployment tersebut kita hapus atau kita lakukan sesuatu terhadap deployment nya yang mengakibatkan pods di dalam deployment itu hilang, restart, dan semacamnya, maka data di dalamnya juga akan ikut hilang.

Contoh kasusnya ketika kita deploy prometheus dan grafana, dashboard yang kita buat dan data metric didalam prometheus akan hilang ketika pod grafana dan prometheus nya kita restart. Maka itu kita memerlukan persistent storage untuk memastikan data-data tersebut tidak hilang. Pada lab kali ini saya akan mengkonfigurasi kubernetes backend storage menggunakan Kubernetes NFS Subdir External Provisioner.

Environment Untuk NFS Server

Untuk spesifikasi yang saya gunakan, yaitu 8 vcpu dan 12G ram, 2 disk dimana 1 untuk root dan satu lagi untuk menyimpan data nya

Persiapkan NFS Server terlebih dahulu

Sebelum menghubungkan kubernetes dan NFS server tentu kita harus punya NFS servernya terlebih dahulu. Lakukan update dan upgrade pada server

apt update -y && apt upgrade -y && reboot

Buat lvm untuk di mounting dan menyimpan data nfs

pvcreate /dev/vdb
vgcreate vol-data /dev/vdb
lvcreate -l 100%FREE -n lv-data vol-data
lvs

Lalu format lvm nya

mkfs.ext4 /dev/vol-data/lv-data

Setelah itu mounting lvm nya. Saya akan mounting lvm nya di direktori /data

mkdir /data
mount /dev/vol-data/lv-data /data/

Agar mounting persistent, kita edit fstab juga, tambahkan line berikut

nano /etc/fstab
##add line berikut
/dev/vol-data/lv-data /data ext4 defaults 0 0

##exit lalu jalankan command dibawah
mount -a

Install dan Konfigurasi NFS Server

Setelah persiapan selesai, lanjut install nfs servernya

apt -y install nfs-kernel-server

Buat juga direktori untuk menyimpan data storage dari kubernetes

mkdir -p /data/kubernetes

Konfigurasi file /etc/idmapd.conf

Domain = na-node-1

Konfigurasikan juga file /etc/exports, tambahkan settingan untuk NFS exportnya. Kita define path yang telah tadi disiapkan, lalu define juga allowed subnet nya serta option export nya

/data/kubernetes 20.2.2.0/24(rw,no_root_squash)

Lalu restart service nfs nya

Jika NFS sudah siap, kita lanjut untuk konfigurasi di kubernetes clusternya

Setup Kubernetes NFS Subdir External Provisioner

Kita install dulu paket nfs-client di semua node kubernetes

apt -y install nfs-common

Selanjutnya kita tambahkan repo nfs external provisioner nya di helm, lalu kita edit valuenya

helm repo add nfs-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm repo update
helm show values nfs-provisioner/nfs-subdir-external-provisioner > helm-nfs-provisioner.yaml

Edit beberapa line berikut, sesuaikan dengan environment

nfs:
server: 20.2.2.9
path: /data/kubernetes
mountOptions:
volumeName: nfs-provisioner

Save lalu deploy nfs provisioner nya. Dengan command dibawah akan deploy nfs provisioner nya dengan nama nfs-provisioner di namespace nfs-provisioner menggunakan file yaml yang sudah kita edit tadi

helm install -n nfs-provisioner nfs-provisioner nfs-provisioner/nfs-subdir-external-provisioner -f helm-nfs-provisioner.yaml --create-namespace

Tunggu beberapa saat , lalu cek apakah sudah running atau belum

Testing Operational

Buat PVC serta deployment menggunakan file yaml berikut

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-nfs-provisioner
spec:
accessModes:
- ReadWriteOnce
storageClassName: nfs-client
resources:
requests:
storage: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-with-nfs
name: test-nfs-nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx-with-nfs
template:
metadata:
labels:
app: nginx-with-nfs
spec:
volumes:
- name: nfs-test-operational
persistentVolumeClaim:
claimName: test-nfs-provisioner
containers:
- image: nginx
name: nginx
volumeMounts:
- name: nfs-test-operational
mountPath: /usr/share/nginx/html

File yaml tersebut akan membuat pvc bernama test-nfs-provisioner dengan size 2Gi, lalu membuat deployment bernama test-nfs-nginx yang merupakan web server nginx dimana di path /usr/share/nginx/html kita akan mount dengan volume yang sudah dibuat, nantinya data di folder tersebut persistent dan bisa kita lihat atau ubah langsung di nfs-server nya

kubectl apply -f testing-nfs-pod.yaml
kubectl get pods
kubectl expose deployment test-nfs-nginx --type LoadBalancer --port 80

Setelah di apply dan di expose service nya, kita akan coba akses

Bisa dilihat ketika curl muncul 403 forbidden , mengapa? Folder /usr/share/nginx/html kosong karena kita mount dengan nfs, maka dari itu kita perlu isi manual.

echo 'Hi There' > index.html
cat index.html
kubectl cp index.html test-nfs-nginx-7794777cf8-t2lrk:/usr/share/nginx/html/index.html
curl 20.2.2.101

Saya buat index.html di local dengan isi “Hi There”, lalu copy file tersebut ke dalam salah satu pods tadi, setelah itu coba curl lagi maka akan bisa di akses

Testing Terminate Pods Tanpa Persistent Storage

Biasanya setiap konfigurasi atau data yang ada di dalam pod ketika kita restart pod tersebut maka datanya akan menghilang. Sekarang kita akan coba test restart pod tanpa persistent storage dan kita lihat data nya

kubectl get pods | grep ngetest
kubectl get svc | grep ngetest
curl 20.2.2.105
kubectl cp index.html ngetest-6f85b59668-6xcfd:/usr/local/apache2/htdocs/index.html
kubectl cp index.html ngetest-6f85b59668-dxnc8:/usr/local/apache2/htdocs/index.html
kubectl cp index.html ngetest-6f85b59668-lfbwf:/usr/local/apache2/htdocs/index.html
curl 20.2.2.105
kubectl rollout restart deployment ngetest
kubectl get pods | grep ngetest
curl 20.2.2.105

Bisa dilihat, pods deployment ngetest-* awalnya running 18h ago lalu ketika saya curl muncul tampilan It works!, setelah itu saya mencoba copy file index.html dari local ke masing-masing pods deployment tersebut, ketika di curl lagi tampilan berubah menjadi Hi There.

Setelah itu saya melakukan restart kepada deployment yang menyebabkan semua pods di deployment itu terminate dan digantikan oleh pods baru, terlihat pods muncul sekitar 11–23 detik yang lalu. Ketika saya curl kembali content didalam nya kembali menjadi It works!. Ini berarti data yang ada didalam nya tidak persistent dan akan hilang ketika pods terminate atau restart.

Testing Terminate Pods Dengan Persistent Storage

Sekarang kita akan coba test restart pod dengan persistent storage dan kita lihat data di dalamnya. Sebelumnya pada bagian Test Operational saya telah mengubah index html default bawaan nginx menjadi Hi There. Jika menggunakan persistent storage data tidak akan berubah atau hilang meskipun saya restart deployment nya

kubectl get pods | grep nfs
kubectl rollout restart deployment test-nfs-nginx
kubectl get pods | grep nfs

Bisa dilihat pod satu persatu terminating lalu digantikan oleh pod yang baru. Namun ketika kita curl lagi service nya , isi file nya tetap ada dan sama seperti yang ada pada bagian Test Operational.

Sekian untuk post mengenai Kubernetes Backend Storage Using NFS. Untuk post selanjutnya saya akan coba deploy monitoring system pada kubernetes cluster.

--

--