Persistent volume for on premise kubernetes cluster with NFS

Data will be stored on Debian VM with NFS. Provisioning persistent volumes will be automated like in the cloud. Every PVC will have his own sub directory on NFS. I will use Kubernetes NFS Subdir External Provisioner and Helm. Helm is installed on jumpbox with access to the existing cluster. Setup is for home lab, special security for NFS server will not be implemented.

Architecture:

PVC → StorageClass → NFS Subdir Provisioner → NFS VM 

On the VM:

apt update
apt install nfs-kernel-server -y

mkdir -p /srv/k8s
chmod 777 /srv/k8s
chown nobody:nogroup /srv/k8s

In /etc/exports add (where 172.16.18.0/24 is the subnet of the VM and k8s nodes) :

/srv/k8s 172.16.18.0/24(rw,sync,no_subtree_check,no_root_squash)

And

sudo exportfs -ra
sudo systemctl restart nfs-kernel-server

On every k8s node

sudo apt install nfs-common -y

From jumpbox add NFS provisioner repo

helm repo add nfs-subdir https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm repo update

Install with:

NFS VM : NFS server IP
Path: /srv/k8s
Nodes CIDR: 172.16.18.0/24

helm install nfs-provisioner nfs-subdir/nfs-subdir-external-provisioner \
  --set nfs.server=172.16.18.19 \
  --set nfs.path=/srv/k8s \
  --set storageClass.name=nfs-dynamic \
  --set storageClass.defaultClass=true

Check if it works:

kubectl get pods

Exprecting : nfs-provisioner-nfs-subdir-external-provisioner-xxxxx Running

Check StorageClass:

kubectl get storageclass

Create test PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-dynamic-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi

NB: Hey!!! It is you, from the future! NFS uses random ports for some internal checking. If you use firewall allow all ports to 1 IP only, or expect problems.

Leave a Reply

Your email address will not be published. Required fields are marked *