Kubernetes Volumes

Explore Kubernetes Volumes. Our guide provides insights, examples, and practical explanations for managing persistent storage in Kubernetes using volumes
E
Edtoks6:00 min read

What is a Kubernetes Volume?

A Kubernetes Volume is a directory accessible to containers in a Pod, which can store data. Unlike a container's filesystem, a Volume's lifecycle is tied to the Pod, not to the individual container. This means that Volumes allow for data to persist across container restarts within a Pod and can provide shared storage for multiple containers within the same Pod.

Background and Concepts

Why Volumes?

  • Persistence: Containers have ephemeral storage that is lost when the container restarts. Volumes provide a way to persist data across container restarts.

  • Sharing Data: Volumes allow multiple containers within the same Pod to share data.

  • Different Storage Backends: Kubernetes supports various storage backends (local, cloud storage, network storage, etc.) via Volumes.

Volume Lifecycle

  • A Volume exists as long as the Pod exists.

  • The data in a Volume is preserved across container restarts within the same Pod.

  • When a Pod is deleted, the Volume is deleted as well.

Volume Types

Kubernetes supports various types of Volumes, each suitable for different use cases:

  1. emptyDir: A volume that is initially empty. It is typically used for temporary storage and data sharing between containers in a Pod. The data is lost when the Pod is deleted.

  2. hostPath: A volume that mounts a file or directory from the host node's filesystem into a Pod. This is useful for exposing host-specific data to the containers.

  3. persistentVolumeClaim: A way to claim storage resources defined by a PersistentVolume. This allows Pods to use storage that persists beyond the lifecycle of any individual Pod.

  4. configMap: A volume that exposes a ConfigMap as a file or directory. This is useful for injecting configuration data into Pods.

  5. secret: A volume that exposes a Secret as a file or directory. This is useful for injecting sensitive data, such as passwords or API keys, into Pods.

  6. nfs: A volume that mounts an NFS (Network File System) share into a Pod. This is useful for shared storage across multiple nodes.

  7. awsElasticBlockStore, gcePersistentDisk, azureDisk, etc.: Volumes that integrate with cloud provider-specific storage solutions.

Persistent Volumes (PVs) and Persistent Volume Claims (PVCs)

Persistent Volumes

A Persistent Volume (PV) is a piece of storage in the cluster that has been provisioned by an administrator or dynamically provisioned using Storage Classes. PVs are resources in the cluster just like nodes are resources.

  • Lifecycle: PVs exist beyond the lifecycle of individual Pods.

  • Provisioning: PVs can be statically provisioned by administrators or dynamically provisioned using Storage Classes.

  • Reclaim Policies: PVs have reclaim policies such as Retain, Recycle, and Delete, which determine what happens to the volume after it is released.

Persistent Volume Claims

A Persistent Volume Claim (PVC) is a request for storage by a user. It is similar to a Pod in that Pods consume node resources, and PVCs consume PV resources.

  • Binding: A PVC will be bound to a suitable PV based on the requested storage size and access modes.

  • Access Modes: PVCs can specify access modes like ReadWriteOnce (RWO), ReadOnlyMany (ROX), and ReadWriteMany (RWX).

Example: PV and PVC

# PersistentVolume (pv.yaml)
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-example
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /mnt/data

# PersistentVolumeClaim (pvc.yaml)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-example
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

Projected Volumes

A Projected Volume is a volume that can contain data from multiple sources such as ConfigMaps, Secrets, downward API, and serviceAccountToken. It allows for the projection of these sources into a single directory.

Example: Projected Volume

apiVersion: v1
kind: Pod
metadata:
  name: projected-volume-example
spec:
  containers:
  - name: myapp
    image: myapp:latest
    volumeMounts:
    - name: myprojectedvolume
      mountPath: /projected
  volumes:
  - name: myprojectedvolume
    projected:
      sources:
      - configMap:
          name: myconfigmap
      - secret:
          name: mysecret
      - downwardAPI:
          items:
          - path: "labels"
            fieldRef:
              fieldPath: metadata.labels
      - serviceAccountToken:
          path: "token"
          expirationSeconds: 3600

Ephemeral Volumes

Ephemeral Volumes are volumes that are created and deleted with the Pod. They are useful for temporary storage needs within the lifecycle of a Pod.

emptyDir

An emptyDir volume is created when a Pod is assigned to a Node and exists as long as that Pod runs on that Node. It is initially empty and is often used for scratch space, caching, or for sharing files between containers in a Pod.

Example: emptyDir

apiVersion: v1
kind: Pod
metadata:
  name: emptydir-example
spec:
  containers:
  - name: myapp
    image: myapp:latest
    volumeMounts:
    - name: temp-storage
      mountPath: /tmp
  volumes:
  - name: temp-storage
    emptyDir: {}

Good to Know Topics

Volume Plugins

Kubernetes supports a variety of volume plugins for different storage backends, including:

  • In-tree plugins: Built-in to Kubernetes and support a variety of storage solutions.

  • CSI (Container Storage Interface): A standard interface for exposing arbitrary block and file storage systems to Kubernetes.

Storage Classes

Storage Classes provide a way to describe the "classes" of storage available in a cluster. Administrators can define multiple storage classes, each with different quality-of-service levels, such as IOPS, backup policies, or arbitrary policies.

Example: Storage Class

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-ssd
  replication-type: none

Conclusion

Understanding Kubernetes Volumes is critical for managing data storage in a Kubernetes environment. Volumes provide a flexible and powerful mechanism to handle persistent and ephemeral storage needs, enabling applications to maintain state across restarts, share data between containers, and use various storage backends efficiently.

By mastering concepts such as Persistent Volumes, Projected Volumes, and Ephemeral Volumes, and knowing how to leverage storage classes and volume plugins, you can design and deploy robust, scalable, and highly available applications on Kubernetes.

Let's keep in touch!

Subscribe to keep up with latest updates. We promise not to spam you.