https://drive.google.com/file/d/1yVoSxB5QJMPyJNJsXhcLM9KFROm4PAgb/view?usp=sharing

๐Ÿ” What Youโ€™ve Built

Step Purpose
1. NFS Server Setup Shared storage backend (/k8sdata on 10.0.0.99)
2. Client Tools Verify NFS access from k3s nodes
3. Helm Install Provisioner Deploys NFS Subdir External Provisioner in storagenfs namespace
4โ€“5. PVC + Deployment Apps dynamically request storage via storageClassName: nfs-client

๐Ÿ”‘ Key Innovation:

No manual PV creation!

When you create a PVC โ†’ provisioner auto-creates a PV as a subdirectory on NFS.


๐Ÿ“Œ How Dynamic Provisioning Works

graph LR
  A[PVC: sample-nfs-pvc] -->|storageClassName: nfs-client| B(StorageClass)
  B -->|provisioner: k8s-sigs.io/nfs-subdir-external-provisioner| C[NFS Provisioner]
  C -->|Creates subdir| D[NFS Server: /k8sdata/default-sample-nfs-pvc-pvc-<uid>]
  D --> E[PV Bound to PVC]

๐Ÿ’ก Directory Format:

${namespace}-${pvcName}-${pvName} โ†’ e.g., default-sample-nfs-pvc-pvc-12345


๐Ÿงช k3s Lab: Full Dynamic NFS Workflow

๐Ÿ”ง Step 1: Set Up NFS Server (On a Dedicated Machine)

๐Ÿ’ก Run on your NFS server (10.0.0.99):

# Install NFS server
sudo apt update && sudo apt install -y nfs-kernel-server

# Create shared directory
sudo mkdir /k8sdata
sudo chown nobody:nogroup /k8sdata
sudo chmod 777 /k8sdata

# Export directory
echo "/k8sdata *(rw,sync,no_subtree_check)" | sudo tee -a /etc/exports
sudo exportfs -a

๐Ÿ”ง Step 2: Verify NFS Access from k3s Nodes

๐Ÿ’ก Run on every k3s node:

sudo apt update && sudo apt install -y nfs-common
showmount -e 10.0.0.99
# Should show: /k8sdata *

๐Ÿ”ง Step 3: Install NFS Provisioner via Helm

# Install Helm (if not present)
curl <https://baltocdn.com/helm/signing.asc> | sudo gpg --dearmor -o /usr/share/keyrings/helm.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] <https://baltocdn.com/helm/stable/debian/> all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt update && sudo apt install helm

# Add repo + install provisioner
helm repo add nfs-store <https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/>
kubectl create ns storagenfs
helm install nfs-sc nfs-store/nfs-subdir-external-provisioner \\\\
  --set nfs.server=10.0.0.99 \\\\
  --set nfs.path=/k8sdata \\\\
  --set storageClass.onDelete=delete \\\\
  -n storagenfs

# Verify
kubectl get storageclass
# NAME         PROVISIONER                                    AGE
# nfs-client   k8s-sigs.io/nfs-subdir-external-provisioner    1m

โš ๏ธ Critical Note:

Your PVCs must use storageClassName: nfs-client (the default name).

๐Ÿ”ง Step 4: Deploy First App (Nginx)