BlueXP Blog

Kubernetes NFS: Two Quick Tutorials

Written by Yifat Perry, Technical Content Manager | Dec 25, 2019 10:35:45 AM

Kubernetes Storage allows containerized applications to access storage resources seamlessly, without being aware of the containers consuming the data. One of the ways Kubernetes allows applications to access storage is the standard Network File Service (NFS) protocol.

In this post, we offer two quick tutorials that will show how to mount NFS file shares directly from a container in a Kubernetes pod, and set up a Kubernetes Persistent Volume accessed via NFS. In addition, we’ll show how NetApp Cloud Volumes ONTAP can help with setting up enterprise-grade NFS Persistent Volumes.

In this article:

Kubernetes Volumes and NFS

Kubernetes Volumes are abstracted storage units that allow nodes within a cluster to write, read and share data between them. Kubernetes offers many storage plugins that provide access to storage services and platforms. One of these is the NFS plugin.

Network File System (NFS) is a standard protocol that lets you mount a storage device as a local drive. Kubernetes allows you to mount a Volume as a local drive on a container. The NFS integration is very useful for migrating legacy workloads to Kubernetes, because very often legacy code accesses data via NFS.

There are two ways to access data via NFS in Kubernetes:

  • Ephemeral NFS Volume - this lets you connect to existing NFS storage you already possess.
  • Persistent Volume with NFS - this lets you set up a managed resource within the cluster which is accessed via NFS. To understand the basics of persistency in Kubernetes, see our post on Kubernetes Persistent Volumes.

Advantages of Using NFS with Kubernetes

Here are a few reasons you should consider using NFS in Kubernetes:

  • Use existing storage - you can mount existing data volumes you are currently using, on-premises or in the cloud, with a standard interface.
  • Persistency - a regular Kubernetes Volume is ephemeral, meaning it is torn down when its parent pod shuts down. However, an NFS Volume, which you define within pod definitions, gives you persistency without having to define a Persistent Volume. Any data saved via NFS will be stored in the connected storage device, even after the pod shuts down. You also have the option of defining a Kubernetes Persistent Volume that exposes its data via an NFS interface.
  • Share data - because of its persistent nature, NFS Volumes can be used to share data between containers, whether in the same pod or different pods.
  • Simultaneous mounting - NFS Volumes can be mounted by multiple nodes at the same time, and multiple nodes can write to the same NFS Volume at the same time.

One important caveat is that for an NFS Volume to work, you must set up a server that exposes storage via NFS. Kubernetes will not manage your existing NFS Volumes for you.

Quick Tutorial #1: Mounting an Ephemeral NFS Share on a Container

Here is how to add an NFS Volume to your pod definition, so that containers can mount a share from an existing NFS server:

1. Pod definition

In your pod YAML file, include the following directive under the container definition (substitute bold text with your own data):
volumeMounts:
  - name: your-nfs-volume
  mountPath: /var/your-destination

Define the volume as follows (substitute bold text with your own data):
volumes:
  - name: your-nfs-volume
nfs:
  server: nfs-server.yourdomain.com
  path:/path/to/shared-folder

2. Deploy the pod

Create the pod, and ensure it is deployed correctly, using:
$ kubectl create -f your-pod-definition.yaml
$ kubectl get pods

3. Verify NFS share is working

Check that the relevant container has mounted the NFS share correctly:
$ kubectl exec -it your-pod-definition sh
/ #
/ # mount | grep nfs-server.yourdomain.com

Quick Tutorial #2: Setting up an NFS Persistent Volume

The flipside of the Kubernetes NFS integration is that you can set up an NFS Persistent Volume which is managed within Kubernetes.

Below we summarize an official Kubernetes example that shows how to set up a complete application that saves data to an NFS Persistent Volume. See the full details and download the code from the official Kubernetes examples report.

This step will look a bit different depending on which underlying storage you want to use for your NFS service. On Azure, use this command.

1. Define the NFS service

$ kubectl create -f examples/staging/volumes/nfs/provisioner/nfs-server-gce-pv.yaml
2. Create an NFS server and service

Run these commands to create the NFS server from the service definition and expose it as a service. Finally, check that pods have deployed correctly
$ kubectl create -f examples/staging/volumes/nfs/nfs-server-rc.yaml
$ kubectl create -f examples/staging/volumes/nfs/nfs-server-service.yaml
$ kubectl get pods -l role=nfs-server.

3. Create the Persistent Volume Claim

Find the cluster IP of your server using this command:
$ kubectl describe services nfs-server
Now, edit the NFS Persistent Volume and replace the IP with the correct one. You need to hard-code the IP for now because there are no service names yet.

4. Create the Persistent Volume

Use these commands to set up the persistent volume that uses the NFS service.
$ kubectl create -f examples/staging/volumes/nfs/nfs-pv.yaml
$ kubectl create -f examples/staging/volumes/nfs/nfs-pvc.yaml

That’s it! In the full example, you can run a fake backend and web server that use the NFS Persistent Volume to share data between them.

Kubernetes NFS with Cloud Volumes ONTAP

NetApp Cloud Volumes ONTAP, the leading enterprise-grade storage management solution, delivers secure, proven storage management services on AWS, Azure and Google Cloud. Cloud Volumes ONTAP supports up to a capacity of 368TB, and supports various use cases such as file services, databases, DevOps or any other enterprise workload.

In particular, Cloud Volumes ONTAP can help you setup Kubernetes storage based on NFS, with high-performance data access, built-in backup, high availability, and more. Learn how to provision Kubernetes Persistent Volumes for NFS with Cloud Volumes ONTAP and NetApp Trident.