Share storage/volume between worker nodes in Kubernetes?
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.
In Kubernetes, sharing storage or volumes between worker nodes is a common need, especially when dealing with stateful applications that require data persistence across multiple nodes. This capability allows containers in different pods to access the same files, which is crucial for certain applications like databases or clustered applications that need shared access to file systems.
Understanding Storage in Kubernetes
In Kubernetes, storage is managed using various Kubernetes objects:
- Persistent Volumes (PV): Represent a piece of physical storage in the cluster. They are independent of any individual pod’s lifecycle and are provisioned by administrators.
- Persistent Volume Claims (PVC): Allow users to request and consume PV resources. A PVC specifies size, access modes, and other desired characteristics of the storage.
- Storage Classes: Define different storage types provided by the infrastructure, facilitating dynamic volume provisioning.
Access Modes
When configuring volumes, it is crucial to understand the different access modes that Kubernetes supports:
ReadWriteOnce(RWO): The volume can be mounted as read-write by a single node.ReadOnlyMany(ROX): The volume can be mounted as read-only by many nodes.ReadWriteMany(RWX): The volume can be mounted as read-write by many nodes.
Sharing a volume across nodes requires a volume that supports either ReadOnlyMany or ReadWriteMany access modes.
Technologies Enabling Shared Storage
Various storage technologies support RWX or ROX modes, enabling shared storage across multiple nodes:
- NFS (Network File System): Offers a straightforward way to set up shared storage. Kubernetes can interact with existing NFS servers using an NFS persistent volume.
- GlusterFS: An open-source distributed file system that can scale storage resources horizontally. It integrates well with Kubernetes through its dynamic provisioning capabilities.
- CephFS: Provides a highly available distributed filesystem which supports RWX.
- Portworx: Offers cloud-native storage for Kubernetes supporting clustering, snapshots, and other advanced data management features.
- Cloud Native Storage Solutions like AWS EFS or Google Cloud Filestore also support RWX.
Example: Sharing Storage with NFS
Example of how to configure an NFS server and share its volume between Kubernetes nodes:
- Setting Up NFS on a Server
- Install NFS utilities.
- Configure the
/etc/exportsfile to specify which directories should be shared. - Restart the NFS service.
- Configuring Kubernetes
- Create a PersistentVolume that uses NFS as its storage backend.
- Create a PersistentVolumeClaim to use this PV:
- Use the PVC in pods across different nodes.
Challenges and Considerations
When using shared volumes, several challenges and considerations need attention:
- Data consistency: Ensure the application managing the data can handle concurrent access or modifications.
- Performance: High IO operations might degrade performance over networked storage.
- Security: Proper configurations and restrictions should be in place to prevent unauthorized access.
Summary Table
| Feature | Description | Importance |
| Access Modes | Defines how volumes can be accessed from nodes. | Critical |
| Storage Technologies | Various technologies like NFS, GlusterFS, CephFS etc. | High |
| Data Consistency | Ensures correct data handling during concurrency. | High |
| Performance & Security | Must be managed effectively for stable operations. | Essential |
Conclusion
Sharing storage between worker nodes in Kubernetes requires careful planning around the choice of technology and its configuration. Solutions like NFS, GlusterFS, and cloud-native options provide flexibility and convenience, but always review and align their capabilities with the specific needs of your applications.
Related reading
- Shared dependencies with HELM
- Should dependencies between Helm charts reflect dependencies between microservices?
- Show metrics in Grafana from the Kubernetes Pod that was scraped last by Prometheus
- sidecar vs init container in kubernetes
- Sharing data in distributed system environment
- Sharing resources between workers in a message queue setup
- Skaffold syncs files but pod doesn't refresh
- Skipping service no endpoints found when attempting to fetch certificate with traefik 2 cert-manager http-01 challenge

System Design Fundamentals
Build a strong foundation in designing scalable, reliable distributed systems.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.