Data cannot be stored in the pod, when the pod is deleted or is terminated the data within it does not stay on the system. To provide long-term and temporary storage to Pods in the cluster, Kubernetes provides different types of storage mechanisms.
In this article, we will see examples of only 2 types of storage mechanisms.
- hostPath:
A hostPath volume mounts a file or directory from the host node’s filesystem into your Pod. This type of volume can be used to allow a Pod to specify whether a given hostPath should exist prior to the Pod running or whether it should be created. This volume type is not something that most Pods will need. DirectoryOrCreate type will create an empty directory if it does not exist with permission set to 0755 and Directory type helps to make sure a directory exists at the given path before that pod is created. - emptyDir:
An emptyDir volume is first created when a Pod is assigned to a Node and exists as long as that Pod is running on that node. By default, emptyDir volumes are stored on the type of storage our environment has. We can also set the emptyDir.medium field to Memory to tell Kubernetes to mount a RAM-backed filesystem
To know about other storage mechanisms in Kubernetes, click here.
Pre-requisites
- Kubernetes Cluster with at least 1 worker node.
If you want to learn to create a Kubernetes Cluster, click here. This guide will help you create a Kubernetes cluster with 1 Master and 2 Nodes on AWS Ubuntu 18.04 EC2 Instances.
What will we do?
- Create a pod with a volume of different types mounted in it
Create a pod with a volume of different types mounted in it
Host path volume with type: Directory
Create an object definition file for mounting an existing directory in the pod.
vim volume-hostpath-1.yml
apiVersion: v1 kind: Pod metadata: name: volume-hostpath-example-1 spec: containers: - image: nginx name: my-container volumeMounts: - mountPath: /opt/mounted-here name: my-volume-1 volumes: - name: my-volume-1 hostPath: path: /dir type: Directory
Get a list of pods and create a pod that will mount “/opt/mounted-here” within the pod on “/dir” from the host.
kubectl get pods
kubectl create -f volume-hostpath-1.yml
kubectl get pods
kubectl describe pod volume-hostpath-example-1
Now if you describe the pod you will see that the pod creation has failed. The Mount failed because the directory “/dir” does not exist on the host. To mount a volume in the pod with “type: Directory”, the host directory must exist.
Now let’s create a directory “/dir” on host i.e. on the worker node.
sudo mkdir /dir
Once we have created a directory on the worker nodes, we can delete the previously created pod and try to recreate a new pod.
kubectl delete -f volume-hostpath-1.yml
kubectl create -f volume-hostpath-1.yml
kubectl get pods
kubectl describe pod volume-hostpath-example-1
This time you can see that the pod has been created successfully and under volumes the mounted path “/dir” can be seen.
Now let’s login into the pod and create a file
kubectl get pods
kubectl exec -it volume-hostpath-example-1 /bin/bash
touch /opt/mounted-here/new-file
The file we created in the pod now can be seen from the worker node under the mounted directory “/dir”
ll /dir/ #Execute this command on the worker node
This time let’s delete the pod we created and see if the file still exists on the host directory “/dir” or not.
exit
kubectl get pods
kubectl delete pod volume-hostpath-example-1
List the files under “/dir” on the worker node.
ll /dir/ #Execute this command on the worker node
We can see that even after deleting the pod the file still exists under “/dir” on the worker node. This means that the data persists even after the pod is deleted or terminated.
In this example, we observed that the host directory that needs to be mounted within the port must exist.
Host path volume with type: DirectoryOrCreate
To make sure that a host directory is available before mounting we can use “type: DirectoryOrCreate” instead of “type: Directory” in hostpath volume.
Create a new file with type “type: DirectoryOrCreate”.
vim volume-hostpath-2.yml
apiVersion: v1 kind: Pod metadata: name: volume-hostpath-example-2 spec: containers: - image: nginx name: my-container volumeMounts: - mountPath: /opt/mounted-here name: my-volume-2 volumes: - name: my-volume-2 hostPath: # directory location on host path: /mount-this type: DirectoryOrCreate
Get a list of existing pods and create a new pod with the file created in the above state.
kubectl get pods
kubectl create -f volume-hostpath-2.yml
kubectl get pods
kubectl describe pod volume-hostpath-example-2
When we describe the pod it can be seen that the pod has successfully been created. And the directory “/mount-this” which does not exist on the host/worker node got created on the host while mounting it in the volume.
Go to the worker nodes and check if the directory has been created or not
ll /mount-this/ #Execute this command on the worker node
Now create a new file on the worker nodes in the directory “/mount-this” that is mounted in the pod.
sudo touch /mount-this/created-on-host #Execute this command on the worker node
Let’s login to the pod and check “/opt/mounted-here/” directory to see if the file “/mount-this/created-on-host” we created on the work node exists in the pod.
kubectl get pods
kubectl exec -it volume-hostpath-example-2 /bin/bash
ls -l /opt/mounted-here/
Now delete the pod and see if the file is still exists on the worker node at “/mount-this/”
exit
kubectl get pods
kubectl delete pod volume-hostpath-example-2
Execute the following command to list the file on the worker node at “/mount-this/”
sudo ls -lt /mount-this/ #Execute this command on the worker node
In this example, we saw that even if the host directory does not exist it gets created on the host machine before it is mounted in the pod.
emptyDir volume
Create an object definition file using the following.
vim volume-emptydir.yml
apiVersion: v1 kind: Pod metadata: name: volume-emptydir-example spec: containers: - image: nginx name: my-container volumeMounts: - mountPath: /opt/this name: my-volume-3 volumes: - name: my-volume-3 emptyDir: {}
Get a list of pods and create a new pod to mount a volume with type “emptyDir”
kubectl get pods
kubectl create -f volume-emptydir.yml #Create an object using the file
kubectl get pods
kubectl describe pod volume-emptydir-example #Get details of the specified pod
In the above screenshot, it can be seen that the pod has been created and the volume is available.
Now login to the pod and create a directory under the mount path “/opt/this”. This time we do not have any volume from the host.
kubectl exec -it volume-emptydir-example /bin/bash #Login into the Pod
Now we can delete the pod if it is no longer required.
kubectl get pods #Get a list of Pods
kubectl delete pod volume-emptydir-example #Delete the specified pod
Conclusion
In this article, we saw the steps and example files to create pods with a volume of type hostPath and emptyDir. We saw how “type:DirectoryOrCreate” under hostPath volume type can help us mount a directory that does not exist on the worker node/host.
Đăng ký liền tay Nhận Ngay Bài Mới
Subscribe ngay
Cám ơn bạn đã đăng ký !
Lỗi đăng ký !
Add Comment