Kubernetes Backend Storage NFS
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.