K8s Volume

ยท

7 min read

K8s Volume

Photo by Growtika on Unsplash

In Kubernetes (often abbreviated as K8s), a volume is an abstraction that allows containers within a pod to access and store data persistently. Volumes provide a way to decouple the storage lifecycle from the container lifecycle, enabling data to be preserved even when containers are terminated or moved to different nodes within the cluster.

Kubernetes volumes come in different types, each with its own characteristics and use cases. Some common types of volumes include:

  1. EmptyDir: This volume is created when a pod is scheduled on a node and exists for the lifetime of that pod. It is primarily used for sharing files between containers within the same pod.

  2. HostPath: With this volume, containers can access files and directories on the host node's filesystem. It is useful when you need to share data between the host and containers or when you want to access data stored on the host.

  3. PersistentVolume (PV): A PersistentVolume is a cluster-wide resource that represents a piece of networked storage in the cluster. It allows pods to request storage without knowing the underlying details. Administrators provision PersistentVolumes, and developers use PersistentVolumeClaims to request and consume them.

  4. PersistentVolumeClaim (PVC): A PersistentVolumeClaim is a request for a specific amount of storage defined by a developer. It binds to a PersistentVolume, which satisfies the claim. PVCs provide a way to abstract the underlying storage infrastructure from the pod, making it easier to manage storage requirements.

  5. ConfigMap and Secret: Although not strictly storage volumes, ConfigMaps and Secrets can be mounted as volumes. ConfigMaps store configuration data, while Secrets store sensitive information such as passwords or API keys. They allow you to inject data into containers as files or environment variables.

Hostpath

In Kubernetes, the HostPath volume type allows a container to access files and directories on the host node's filesystem. It is a simple way to share data between the host and containers running within a pod. When a HostPath volume is mounted, the container can read from and write to the specified path on the node's filesystem.

Here are some key details about HostPath volumes:

  1. Accessibility: Since the volume directly accesses the host node's filesystem, the container has full read and write access to the specified path. This can be useful when you need to access or modify files outside the container's file system, such as logs or configuration files.

  2. Pod Affinity and Anti-Affinity: When using HostPath volumes, it's important to consider pod scheduling and ensure that pods are placed on nodes that have the required files or directories. You can use pod affinity or anti-affinity rules to influence pod placement based on node labels.

  3. Limitations: HostPath volumes have some limitations to consider. Firstly, they are tied to a specific node, so if the pod gets rescheduled to another node, it won't have access to the same host's files. Secondly, if multiple pods on the same node use the same HostPath, they can potentially interfere with each other, causing conflicts or data corruption.

  4. Security Considerations: HostPath volumes can pose security risks if not used carefully. Since containers have direct access to the host's filesystem, it's important to ensure that the mounted path does not grant access to sensitive or critical files on the node. Additionally, allowing containers to modify files outside their own filesystem can introduce security vulnerabilities.

Here's an example YAML snippet that demonstrates the usage of a HostPath volume in a pod:

apiVersion: v1
kind: Pod
metadata:
  name: hostpath-pod
spec:
  containers:
    - name: my-container
      image: my-image # mention your image name here
      volumeMounts:
        - name: hostpath-volume
          mountPath: /host-data
  volumes:
    - name: hostpath-volume
      hostPath:
        path: /opt/data # this directory should exist in all node machine
kubectl create -f podfile-name

Once pod create and running, login into the pod/container by using below command

kubectl exec -it pod hostpath-pod /bin/bash

Add some data into container mount point as below

cd /hostpath-pod
touch file1
# exit for pod/container
exit

Check the file1 got backed up at /opt/data or not on worker machine

Persistance volume

In Kubernetes, a PersistentVolume (PV) is a storage abstraction that represents a piece of networked storage in the cluster. It provides a way to decouple the storage configuration from the pod specification, allowing for dynamic provisioning and easier management of storage resources.

PersistentVolumes are created and managed by cluster administrators, while developers consume them using PersistentVolumeClaims (PVCs). The PV/PVC model allows for a separation of concerns between storage administrators and application developers.

Here are some important aspects of PersistentVolumes:

  1. Provisioning: PersistentVolumes can be provisioned in different ways. They can be provisioned statically, where an administrator creates a PV beforehand and developers claim it using a PVC. Alternatively, they can be provisioned dynamically using a StorageClass, which allows for on-demand creation of PVs based on predefined policies and parameters.

  2. Access Modes: PersistentVolumes support different access modes that define how the storage can be accessed. The common access modes are ReadWriteOnce (RWO), ReadOnlyMany (ROX), and ReadWriteMany (RWX). RWO allows read and write access from a single node, ROX allows read access from multiple nodes, and RWX allows simultaneous read and write access from multiple nodes.

  3. Storage Classes: StorageClasses provide a way to define different classes of storage with specific provisioning and configuration requirements. Each StorageClass has its own set of parameters, such as the provisioner, reclaim policy, and volume attributes. Developers can request a PVC with a specific StorageClass, and the cluster will provision a PV that matches the requested class.

  4. Reclaim Policies: PersistentVolumes have reclaim policies that determine what happens to the storage when it is released. The common reclaim policies are Retain, Delete, and Recycle. With Retain, the PV is not deleted, allowing manual reclamation. Delete deletes the PV and associated data. Recycle performs basic cleanup, but the data may still remain on the volume.

  5. Volume Plugins: Kubernetes supports various volume plugins that integrate with different storage providers and technologies. These plugins enable Kubernetes to work with different storage systems, such as local disks, network-attached storage (NAS), cloud storage, and distributed file systems.

Here's an example of a PersistentVolume manifest:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /data
  storageClassName: my-storage-class

In this example, we define a PersistentVolume named "my-pv" with a storage capacity of 1Gi and access mode set to ReadWriteOnce. It uses a HostPath volume plugin to map the PV to the /data directory on the host node's filesystem. It also specifies a storageClassName, which can be used to match this PV with PVCs requesting the same storage class.

PersistentVolumes provide a way to manage and abstract storage resources in Kubernetes, enabling developers to request and consume persistent storage without having to worry about the underlying details of provisioning and management.

To consume a PersistentVolume (PV) in Kubernetes, you need to create a PersistentVolumeClaim (PVC) that requests the desired storage from the available PVs. The PVC acts as a request for storage, and once bound to a PV, it provides a volume that can be mounted into pods.

Here's an example of a PersistentVolumeClaim that corresponds to the PersistentVolume mentioned earlier:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: my-storage-class

In this example, we define a PersistentVolumeClaim named "my-pvc" with an access mode of ReadWriteOnce, indicating that the storage should be accessed by a single node at a time. The PVC requests 1Gi of storage capacity using the storage field in the resources section. It also specifies the same storageClassName as the PV to match the desired storage class.

Once you create the PVC, Kubernetes will attempt to find an available PV that satisfies the PVC's requirements, such as capacity, access mode, and storage class. If a suitable PV is found, the PVC will be bound to that PV, establishing a connection between the PVC and the PV.

To use the PVC in a pod, you can mount it as a volume. Here's an example of a pod manifest that uses the PVC:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-image
      volumeMounts:
        - name: my-volume
          mountPath: /data
  volumes:
    - name: my-volume
      persistentVolumeClaim:
        claimName: my-pvc

In this example, we define a pod named "my-pod" with a single container named "my-container." The PVC "my-pvc" is mounted as a volume named "my-volume" inside the container. The claimName field in the persistentVolumeClaim section specifies the name of the PVC to be used.

With this configuration, the pod will have access to the PV's storage as a mounted volume at the specified mount path (/data in this case).

Remember to create the PVC and PV in the same namespace, and ensure that the PV is available and matches the PVC's requirements before creating the pod.

Did you find this article valuable?

Support Naveen Elwaka by becoming a sponsor. Any amount is appreciated!

ย