Here are the notes on how I enabled dynamic provisioning for persistent volumes in my garage Kubernetes cluster, using a combination of:
- NFS server
- CSI driver for NFS
- PersistentVolumeClaim
NFS server
I used a typical installation of NFS server on Ubuntu Linux. Here’s the documentation from Ubuntu.
CSI driver for NFS
From the Github repo there are Helm templates provided to install csi-driver-nfs easily into a Kubernetes cluster. Since I rely on ArgoCD to deploy stuff in my cluster, I created an ArgoCD application for csi-driver-nfs:
# csi-driver-nfs.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: csi-driver-nfs
  namespace: argocd
spec:
  destination:
    namespace: kube-system
    server: https://kubernetes.default.svc
  project: default
  source:
    chart: csi-driver-nfs
    repoURL: https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts
    targetRevision: v4.9.0
    helm:
      values: |
        # avoid deploying onto master node
        controller:
          tolerations: [] 
        node:
          tolerations: []
        # create the default storage class using local NFS driver settings
        storageClass:
          create: true
          name: nfs-csi
          annotations:
            storageclass.kubernetes.io/is-default-class: "true"
          parameters:
            server: 192.168.1.101
            share: /var/nfs
          # set to Retain if files are to be preserved after the volume's deletion.
          reclaimPolicy: Delete
          volumeBindingMode: Immediate
          mountOptions:
            - nfsvers=4.1
  syncPolicy:
    automated:
      prune: true
    syncOptions:
      - CreateNamespace=trueOnce checked in and deployed by ArgoCD, I confirmed it’s running properly
> k get storageclass -A NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nfs-csi (default) nfs.csi.k8s.io Delete Immediate false 2d5h
PersistentVolumeClaim
Here’s an example PVC to create a volume dynamically
# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: raytest
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: nfs-csiLet’s see how it works when deployed
> k apply -f pvc.yaml persistentvolumeclaim/raytest created > k get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE raytest Bound pvc-ef9ecd8f-2ca2-4b96-8dc1-c7bb2e5c96ea 10Gi RWX nfs-csi <unset> 9s > k get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE pvc-ef9ecd8f-2ca2-4b96-8dc1-c7bb2e5c96ea 10Gi RWX Delete Bound default/raytest nfs-csi <unset> 22s # in the NFS server > ls -lht /var/nfs total 68K drwxr-xr-x 2 nobody nogroup 4.0K Oct 11 16:51 pvc-ef9ecd8f-2ca2-4b96-8dc1-c7bb2e5c96ea ...
🙂
