What Storage Does Kubernetes Use?

Kubernetes itself is agnostic regarding the underlying storage provider, meaning it does not come with a built-in storage solution. Instead, Kubernetes integrates with external storage systems through plugins and interfaces, allowing it to use various storage types such as:

  • Cloud-Based Storage: Integrates with cloud providers’ native storage solutions like Amazon EBS, Google Persistent Disk, and Azure Disk.
  • On-Premises Storage: Supports networked storage solutions such as NFS, iSCSI, and Ceph.
  • Ephemeral Storage: Uses temporary volumes like emptyDir, which store data for the lifecycle of the pod but are deleted upon pod termination.

By supporting multiple storage backends, Kubernetes ensures flexibility for users who can choose storage based on their performance, availability, and cost requirements.

What is the Storage Architecture of Kubernetes?

The storage architecture is built around several key abstractions that separate storage provisioning from consumption:

  1. Volumes: A storage resource attached to a pod, allowing data to persist across container restarts within the pod’s lifecycle.
  2. Persistent Volumes (PVs): PVs are long-lived storage resources provisioned independently of any specific pod, allowing data to persist beyond pod lifecycles.
  3. Persistent Volume Claims (PVCs): A PVC is a request by a user for a specific amount and type of storage. PVCs are matched to PVs that meet the storage requirements.
  4. StorageClasses: StorageClasses define types of storage available in a cluster and the parameters used to provision that storage dynamically (e.g., SSD, HDD, or cloud-based). By using StorageClasses, Kubernetes can automatically provision storage on demand.
  5. Dynamic Provisioning: When a PVC is created with a StorageClass, Kubernetes can automatically provision a PV that meets the PVC’s requirements, eliminating the need for manual provisioning.

This architecture enables Kubernetes to remain flexible and vendor-neutral while simplifying storage provisioning for applications.

How to Mount Storage in Kubernetes?

Create a Persistent Volume (PV) or specify a volume type directly in your pod specification, then create a Persistent Volume Claim (PVC) to request the storage. Here’s a high-level guide:

Define a PersistentVolume (PV): Create a PV specifying details like storage capacity and access modes (e.g., ReadWriteOnce or ReadOnlyMany).Example PV YAML:


  apiVersion: v1 kind: PersistentVolume metadata: name: example-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: standard hostPath: path: "/mnt/data"


Create a PersistentVolumeClaim (PVC): The PVC requests storage from Kubernetes based on the specified capacity and access mode.Example PVC YAML:


  apiVersion: v1 kind: PersistentVolumeClaim metadata: name: example-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: standard

Attach the PVC to a Pod: Define the volume in your pod specification and reference the PVC to mount the storage. Example Pod YAML:


  apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image: nginx volumeMounts: - mountPath: "/data" name: storage volumes: - name: storage persistentVolumeClaim: claimName: example-pvc

This setup mounts the specified storage at the /data path within the container, allowing the application to access it.

Where Are Kubernetes Services Stored?

Kubernetes services and configurations, including Persistent Volumes (PVs) and Persistent Volume Claims (PVCs), are stored in etcd, Kubernetes’ distributed key-value store. etcd is the primary data store in Kubernetes, maintaining cluster state information, including the configurations for services, pods, nodes, deployments, and storage resources.

Because etcd is critical to cluster operation, it’s typically backed up regularly, and high availability is maintained to protect against data loss or corruption.


How Do I Check Storage on Kubernetes?

You can check storage in Kubernetes to see the state of PVs, PVCs, and storage usage using the kubectl command. Here are some useful commands for monitoring storage:

  1. View All Persistent Volumes:
    kubectl get pv
    This command displays all Persistent Volumes in the cluster, showing their status, storage capacity, access modes, and reclaim policies.
  2. View Persistent Volume Claims:
    kubectl get pvc
    This command shows the PVCs, their status (e.g., Bound), requested storage size, and associated storage class.
  3. Describe Specific PVC or PV: To get detailed information about a specific PV or PVC, use the describe command:
    kubectl describe pvc example-pvc kubectl describe pv example-pv
    This provides more detailed information, including events and conditions related to the storage resource.
  4. Check Storage Usage Within a Pod: If the volume is mounted on a pod, you can check the actual usage by accessing the container and using storage monitoring commands like df or du:
    kubectl exec -it example-pod -- df -h
  5. Monitor Storage with Metrics: Use monitoring tools like Prometheus and Grafana to track storage metrics, such as volume usage and IOPS, across the cluster. Kubernetes metrics can be collected by Prometheus and visualized in Grafana dashboards, providing a comprehensive view of storage usage.

Resources and Further Reading

  1. Kubernetes Official Documentation on Storage
    Kubernetes Storage Concepts – Comprehensive guide on Kubernetes storage, covering volumes, Persistent Volumes, Persistent Volume Claims, and StorageClasses.
  2. StorageClass Documentation
    StorageClass in Kubernetes – Documentation on how StorageClasses define different storage types and enable dynamic provisioning.
  3. Container Storage Interface (CSI) Drivers
    Kubernetes CSI Documentation – Information on using CSI drivers to integrate external storage providers into Kubernetes.
  4. Managing etcd in Kubernetes
    etcd Documentation – Learn more about etcd, the distributed key-value store that stores Kubernetes cluster state, including storage configurations.