https://drive.google.com/file/d/1yVoSxB5QJMPyJNJsXhcLM9KFROm4PAgb/view?usp=sharing
| 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.
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
๐ก 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
๐ก Run on every k3s node:
sudo apt update && sudo apt install -y nfs-common
showmount -e 10.0.0.99
# Should show: /k8sdata *
# 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).