0
0
KubernetesHow-ToBeginner · 4 min read

How to Use NFS Volume in Kubernetes: Simple Guide

To use an nfs volume in Kubernetes, define a PersistentVolume that points to your NFS server and export path, then create a PersistentVolumeClaim to request storage. Finally, mount the claim inside your pod's volumes and volumeMounts sections.
📐

Syntax

Using an NFS volume in Kubernetes involves three main parts:

  • PersistentVolume (PV): Defines the NFS server address and export path.
  • PersistentVolumeClaim (PVC): Requests storage from the PV.
  • Pod volume and volumeMount: Mounts the PVC inside the container.
yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: <NFS_SERVER_IP_OR_HOSTNAME>
    path: <NFS_EXPORT_PATH>
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: nfs-test-pod
spec:
  containers:
  - name: app
    image: busybox
    command: ["sleep", "3600"]
    volumeMounts:
    - name: nfs-volume
      mountPath: /mnt/nfs
  volumes:
  - name: nfs-volume
    persistentVolumeClaim:
      claimName: nfs-pvc
💻

Example

This example shows a complete setup to use an NFS volume in Kubernetes. Replace <NFS_SERVER_IP_OR_HOSTNAME> and <NFS_EXPORT_PATH> with your actual NFS server details. The pod mounts the NFS share at /mnt/nfs and runs a simple sleep command to keep running.

yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.1.100
    path: /exported/path
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: nfs-test-pod
spec:
  containers:
  - name: app
    image: busybox
    command: ["sleep", "3600"]
    volumeMounts:
    - name: nfs-volume
      mountPath: /mnt/nfs
  volumes:
  - name: nfs-volume
    persistentVolumeClaim:
      claimName: nfs-pvc
Output
pod/nfs-test-pod created persistentvolumeclaim/nfs-pvc created persistentvolume/nfs-pv created
⚠️

Common Pitfalls

Common mistakes when using NFS volumes in Kubernetes include:

  • Using incorrect NFS server IP or export path, causing mount failures.
  • Not setting accessModes to ReadWriteMany which is required for NFS.
  • Forgetting to create the PersistentVolume before the PersistentVolumeClaim.
  • Network issues blocking access to the NFS server from Kubernetes nodes.
  • Permissions on the NFS export not allowing the Kubernetes nodes to read/write.

Always verify NFS server accessibility and export permissions before deploying.

yaml
Wrong accessModes example:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce  # Incorrect for NFS
  nfs:
    server: 192.168.1.100
    path: /exported/path

Correct accessModes example:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany  # Correct for NFS
  nfs:
    server: 192.168.1.100
    path: /exported/path
📊

Quick Reference

Remember these key points when using NFS volumes in Kubernetes:

  • PersistentVolume: Defines NFS server and path.
  • PersistentVolumeClaim: Requests storage with matching access mode.
  • Pod: Mounts the PVC as a volume.
  • Access Mode: Use ReadWriteMany for NFS.
  • Permissions: Ensure NFS export permissions allow Kubernetes nodes.

Key Takeaways

Define a PersistentVolume with NFS server and export path using accessMode ReadWriteMany.
Create a PersistentVolumeClaim that matches the PersistentVolume's storage and access mode.
Mount the PersistentVolumeClaim inside your pod under volumes and volumeMounts.
Verify NFS server accessibility and export permissions before deploying.
Use correct access modes and ensure network connectivity to avoid mount errors.