More about Kubernetes Storage
- Kubernetes vs. Nomad: Understanding the Tradeoffs
- How to Set Up MySQL Kubernetes Deployments with Cloud Volumes ONTAP
- Kubernetes Volume Cloning with Cloud Volumes ONTAP
- Container Storage Interface: The Foundation of K8s Storage
- Kubernetes Deployment vs StatefulSet: Which is Right for You?
- Kubernetes for Developers: Overview, Insights, and Tips
- Kubernetes StatefulSet: A Practical Guide
- Kubernetes CSI: Basics of CSI Volumes and How to Build a CSI Driver
- Kubernetes Management and Orchestration Services: An Interview with Michael Shaul
- Kubernetes Database: How to Deploy and Manage Databases on Kubernetes
- Kubernetes and Persistent Apps: An Interview with Michael Shaul
- Kubernetes: Dynamic Provisioning with Cloud Volumes ONTAP and Astra Trident
- Kubernetes Cloud Storage Efficiency with Cloud Volumes ONTAP
- Data Protection for Persistent Data Storage in Kubernetes Workloads
- Managing Stateful Applications in Kubernetes
- Kubernetes: Provisioning Persistent Volumes
- An Introduction to Kubernetes
- Google Kubernetes Engine: Ultimate Quick Start Guide
- Kubernetes Persistent Volumes, Claims, Storage Classes, and More
- Azure Kubernetes Service Tutorial: How to Integrate AKS with Azure Container Instances
- Kubernetes Workloads with Cloud Volumes ONTAP: Success Stories
- Container Management in the Cloud Age: New Insights from 451 Research
- How to Use NetApp Cloud Manager with Trident for Provisioning Persistent Volumes in Kubernetes Deployments
- Kubernetes Storage: An In-Depth Look
- Monolith vs. Microservices: How Are You Running Your Applications?
- Kubernetes Shared Storage: The Basics and a Quick Tutorial
- Kubernetes NFS Provisioning with Cloud Volumes ONTAP and Trident
- Azure Kubernetes Service How-To: Configure Persistent Volumes for Containers in AKS
- Kubernetes NFS: Quick Tutorials
- NetApp Trident and Docker Volume Tutorial
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:
- What are Kubernetes Volumes and how they work with NFS
- Advantages of using NFS with Kubernetes
- Quick tutorial #1: Mounting an NFS share on a container
- Quick tutorial #2: Creating an NFS Persistent Volume
- Kubernetes NFS with Cloud Volumes ONTAP
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):
- name: your-nfs-volume
Define the volume as follows (substitute bold text with your own data):
- name: your-nfs-volume
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.