Tech With Ngurah Bagus
Tech With Ngurah Bagus
Published on 2025-09-23 / 92 Visits
0
0

Part-2: Kubernetes Persisten Volume dengan NFS

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 sebagai root, 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.yaml

Deploy 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

k8s storage

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-po

Jika 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-kube

Sekarang cluster Kubernetes kalian sudah sepenuhnya siap dengan penyimpanan dinamis menggunakan NFS.

folder list in persisten volume


Comment