Canarys | IT Services

Blogs

Volume management in Kubernetes

Share

Since pods created in k8s are ephemeral, we are able to get the data as long as pods are alive, but if pods are terminated data stored in it completely lost and it cannot get back, for that we need to mount a volume to write the data into that of a pod. To do that we have different ways. Let’s look at those things.

Host path:  with this type, we can configure a directory on the host itself (node) and specify a path /data.  Once the volume is created, we mount the volume to a directory inside the container to access it. Even when the pod deleted, the data processed will be still on the host and it can get back once the pod is up. Sample YAML for host path volumes is as follows;

pods/storage/redis.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis
    volumeMounts:
    - name: redis-storage
      mountPath: /data/redis
  volumes:
  - name: redis-storage
    emptyDir: {}

this type is fine for a single node, but it is not good for multi node clusters. This is because the pods will use /data directory in all the nodes and expects all of them to be the same and have the same data. Since they are on different nodes, they are not same, unless you configured external replicated cluster storage solution. Kubernetes supports several types of storage solutions such as NFS, FLOCKER, EBS, Azure Disk, etc. for example to configure AZURE DISK as the storage option for the volume we will do as follows

On Azure VM, create a Pod using the volume spec based on azure.

In the pod, you need to provide the following information:

  • disk name: (required) the name of the VHD blob object OR the name of an Azure managed data disk if Kind is Managed.
  • disk URI: (required) the URI of the vhd blob object OR the resource of an Azure managed data disk if Kind is Managed.
  • kind: (optional) kind of disk. Must be one of Shared (multiple disks per storage account), Dedicated (single blob disk per storage account), or Managed (Azure managed data disk). Default is Shared.
  • caching mode: (optional) disk caching mode. Must be one of None, ReadOnly, or ReadWrite. Default is None.
  • type: (optional) the filesystem type to mount. Default is ext4.
  • readOnly: (optional) whether the filesystem is used as readOnly. Default is false.
#azure.yml
apiVersion: v1
kind: Pod
metadata:
 name: azure
spec:
 containers:
  - image: kubernetes/pause
    name: azure
    volumeMounts:
      - name: azure
        mountPath: /mnt/azure
 volumes:
      - name: azure
        azureDisk:
          diskName: test.vhd
          diskURI: https://someaccount.blob.microsoft.net/vhds/test.vhd
kubectl create -f azure.yaml

persistent volumes:

in the above type, we configured the volumes within the pod definition files, when you have a large environment, where lot pods are running inside it, every time you deploy a pod you have to configure volume for each pod. Instead of that, we will configure a large pool of volume centrally, then the pods will use small pieces out of that pool, that is where persistent volumes can help us, A persistent volume (PV) is a cluster-wide pool of storage volumes configured by an administrator to be used by pods on the cluster, and pods can use the storage using volume claims (PVCs). We can use persistent volumes as below, where I’m not gonna talk about host path with PV and PVC because that is not recommended for production oriented. Here I’m using the Azure file storage class for dynamic provisioning, An Azure disk can only be mounted with Access mode type ReadWriteOnce, which makes it available to one node in AKS. If you need to share a persistent volume across multiple nodes, use Azure Files.

1.Create a file named azure-file-sc.yaml and copy in the following example manifest. 

apiVersion: storage.k8s.io/v1
kind: StorageClass 
metadata:
  name: slow
provisioner: kubernetes.io/azure-disk
parameters:
  skuName: Standard_LRS
  location: eastus

2.create PVC for that storage class

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-azurefile
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: my-azurefile
  resources:
    requests:
      storage: 5Gi

3.mount the claim to pod

apiVersion: v1 
kind: Pod 
metadata:  
 name: webserver-pd 
spec:  
 containers:  
 - image: httpd    
   name: webserver    
   volumeMounts: 
   - mountPath: "/mnt/azure" 
     name: volume 
 volumes: 
 - name: volume 
   persistentVolumeClaim: 
     claimName: my-azurefile

apply the yamls to configure and claim the volumes

Leave a Reply

Your email address will not be published. Required fields are marked *

Reach Us

With Canarys,
Let’s Plan. Grow. Strive. Succeed.