In the previous post, we learned how to setup an NFS share on a Linux machine. Today, we are going to learn how to mount this share in a Kubernetes cluster.

The first thing we need to define is a PersistentVolume:

persistent-volume.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-shared-folder-pv
  labels:
    usage: my-shared-folder-pv
spec:
  capacity:
    storage: 50Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    server: my-other-server
    path: /var/nfs/my_shared_folder

Then we can create a PersistentVolumeClaim pointing to the volume:

persistent-volume-claim.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-shared-folder-pvc
  annotations:
    volume.beta.kubernetes.io/storage-class: ""
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 50Gi
  selector:
    matchLabels:
      usage: my-shared-folder-pv

We can now deploy these to our Kubernetes cluster:

kubectl apply -f persistent-volume.yaml
kubectl apply -f persistent-volume-claim.yaml

To use it in a deployment, you can mount it now as a volume:

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-server
  labels:
    app: my-server
spec:
  replicas: 1
selector:
    matchLabels:
      app: my-server
  template:
    metadata:
      labels:
        app: my-server
    spec:
      containers:
      - name: my-server
        image: "alpine:3.12"
        command: ["/bin/sh"]
        args: ["-c", "while true; do date >> /mnt/my_shared_folder/dates.txt; sleep 5; done"]
        volumeMounts:
        - name: my-shared-folder
          mountPath: /mnt/my_shared_folder
      volumes:
      - name: my-shared-folder
        persistentVolumeClaim:
          claimName: my-shared-folder-pvc

If you also want to setup the NFS share itself inside the cluster, there are examples available showing you how to do that in the Kubernetes Example repository.

Related Posts

  • My favourite Kubernetes client: Lens
  • Using Docker private repos in Kubernetes
  • Installing Helm on your Kubernetes cluster
  • Stern 1.13.0, templates and line-endings
  • 413 Request Entity Too Large with the Nginx Ingress controller