Artikel ini adalah lanjutan dari artikel yang sebelumnya saya buat tentang High Avaliability Kubernetes Cluster dengan CAPI di LXD
Setelah cluster Kubernetes berjalan, langkah penting selanjutnya adalah menyiapkan penyimpanan persisten (persistent storage). Tanpa penyimpanan ini, data aplikasi akan hilang saat kontainer mati. Salah satu cara yang umum dan fleksibel adalah menggunakan NFS (Network File System).
Di artikel ini, kita akan menyiapkan NFS server dan memasang nfs-subdir-external-provisioner. Provisioner inilah yang nantinya akan membuat Persistent Volume (PV) secara otomatis setiap kali aplikasi meminta penyimpanan melalui Persistent Volume Claim (PVC).
Menyiapkan Disk untuk NFS di Server Manajemen
Langkah pertama adalah menyiapkan disk di server yang akan menjadi NFS server (di sini saya menggunakan management-server). Kita akan pakai LVM (Logical Volume Management) agar pengelolaan disk lebih fleksibel. Disk yang digunakan adalah /dev/sdb.
Eksekusi di
management-server/node-nfs-server
# Inisialisasi disk sebagai Physical Volume (PV)
sudo pvcreate /dev/sdb
# Buat Volume Group (VG) bernama "vg-nfs" dari PV tadi
sudo vgcreate vg-nfs /dev/sdb
# Buat Logical Volume (LV) bernama "lv-nfs" menggunakan semua sisa ruang di VG
sudo lvcreate --name lv-nfs -l 100%FREE vg-nfs
# Format LV dengan filesystem ext4
sudo mkfs.ext4 /dev/vg-nfs/lv-nfs
# Buat direktori mount point
sudo mkdir -p /mnt/nfs-kube
# Dapatkan UUID dari LV yang baru dibuat untuk mounting via /etc/fstab
UUID=$(sudo blkid -s UUID -o value /dev/vg-nfs/lv-nfs)
# Tambahkan entri ke /etc/fstab agar auto-mount saat boot
echo "UUID=$UUID /mnt/nfs-kube ext4 defaults 0 1" | sudo tee -a /etc/fstab
# Reload systemd dan mount direktori
sudo systemctl daemon-reload
sudo mount -a
# Verifikasi apakah sudah termount dengan benar
lsblk -f
df -h
Instalasi dan Konfigurasi NFS Server
Setelah disk siap, kita instal paket NFS server dan atur direktori mana yang akan dibagikan ke jaringan.
Eksekusi di
management-server
# Install paket NFS
sudo apt-get update
sudo apt-get install nfs-common nfs-kernel-server -y
# Atur kepemilikan dan izin pada direktori yang akan di-share
sudo chown nobody:nogroup /mnt/nfs-kube
sudo chmod 2770 /mnt/nfs-kube
# Ekspor direktori agar bisa diakses oleh worker node Kubernetes
# Ganti 10.236.16.0/24 dengan rentang IP jaringan node Kubernetes Anda
echo "/mnt/nfs-kube 10.236.16.0/24(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports
# Terapkan konfigurasi ekspor
sudo exportfs -av
# Aktifkan dan restart service NFS
sudo systemctl enable --now nfs-kernel-server
# Cek status service
sudo systemctl status nfs-kernel-server
Keterangan:
no_root_squash: Opsi ini penting. Ini mengizinkan klien (nantinya adalah provisioner Kubernetes) untuk menulis data ke NFS sebagairoot, yang dibutuhkan untuk mengatur izin di sub-direktori volume.10.236.16.0/24: Pastikan Anda menggunakan rentang IP yang benar agar semua node di cluster Kubernetes memiliki akses.
Instalasi nfs-common di semua Node Kubernetes
Setiap node di cluster Kubernetes harus punya paket nfs-common agar bisa terhubung ke NFS share. Cara paling efisien untuk menginstal ini di semua node sekaligus adalah dengan DaemonSet.
Buat file
nfs-common-installer.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nfs-installer
namespace: kube-system
spec:
selector:
matchLabels:
name: nfs-installer
template:
metadata:
labels:
name: nfs-installer
spec:
tolerations:
- operator: Exists
hostPID: true
containers:
- name: install-nfs
image: ubuntu:22.04
securityContext:
privileged: true
command:
- "sh"
- "-c"
- |
set -ex
apt-get update
apt-get install -y nfs-common
# Loop tak terbatas agar pod tidak restart setelah instalasi
sleep infinity
volumeMounts:
- name: rootfs
mountPath: /host
volumes:
- name: rootfs
hostPath:
path: /Terapkan DaemonSet ini, tunggu beberapa saat hingga semua Pod berjalan, lalu hapus kembali karena paket ini cukup diinstal sekali saja.
# Gunakan kubeconfig cluster production Anda
export KUBECONFIG=nb-cluster-prod.kubeconfig
kubectl apply -f nfs-common-installer.yaml
# Tunggu beberapa menit, lalu hapus DaemonSet
kubectl delete -f nfs-common-installer.yamlDeploy NFS Subdir External Provisioner
Sekarang kita akan men-deploy provisioner menggunakan Helm. Provisioner ini akan memantau cluster, dan setiap kali ada permintaan PVC baru, ia akan langsung membuatkan sub-direktori di dalam share NFS sebagai Persistent Volume.
# Tambahkan repo helm
helm repo add nfs-subdir-external-provisioner [https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/](https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/)
helm repo update
# Install provisioner
# Ganti 'kind-management' dengan IP atau hostname NFS server Anda
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--set nfs.server=kind-management \
--set nfs.path=/mnt/nfs-kube \
--namespace nfs-provisioner --create-namespace
# Jadikan StorageClass dari NFS sebagai default
kubectl patch storageclass nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'Verifikasi instalasi:
kubectl get all -n nfs-provisioner
kubectl get storageclass
Uji Coba dengan Membuat PVC dan Pod
Terakhir, mari kita uji apakah provisioner bekerja. Saya mencoba membuat sebuah PVC dan Pod yang menggunakannya.
# Buat PVC dan Pod pengujian
kubectl create -f [https://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/test-claim.yaml](https://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/test-claim.yaml)
kubectl create -f [https://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/test-pod.yaml](https://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/test-pod.yaml)Setelah beberapa saat, periksa statusnya:
# Pastikan status PVC adalah "Bound"
kubectl get pvc test-claim
# Pastikan Pod berjalan
kubectl get pod test-poJika semuanya Bound dan Running, kalian bisa cek langsung di NFS server. Seharusnya sudah ada direktori baru yang dibuat untuk PVC tersebut.
# Eksekusi di management-server
tree /mnt/nfs-kubeSekarang cluster Kubernetes kalian sudah sepenuhnya siap dengan penyimpanan dinamis menggunakan NFS.
-xah6.webp)