After spending a couple of hours I found that the relative path is not supported as a mounted path in Kubernetes. I found the reference here mountpath should be absolute if it is yes then why it doesn't have that capability of the relative path could anyone please explain a bit deeper?
Example code:
apiVersion: v1
kind: Pod
metadata:
name: task-pv-pod
spec:
volumes:
- name: task-pv-storage
hostPath:
# directory location on host
# path: "./code" # this is not supporting
path: "/var/www/html/kubernetes/code" # this is supporting
# this field is optional
type: DirectoryOrCreate
containers:
- name: task-pv-container
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: task-pv-storage
Under the code
directory in the above code example, I just have an index.html
page
Screenshot of the project structure:
If I use path: "./code"
then the error shows like this:
Error response from daemon: create ./code: "./code" includes invalid
characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed.
If you intended to pass a host directory, use absolute path.
Thanks in advance!!
I believe the source of your confusion is that you are running a single node Cluster, like Minikube.
Kubectl > Kube-API(master) > Kubelet agent (node) > Pod creation (as specified on the yaml manifest).
In a single node cluster all these agents are on the same computer, that's why the files in /var/www/html/kubernetes/code
were mounted to the pod.
When you use hostPath
the files must exist on the node
, not on your notebook, because it's not the kubectl
on your computer that will trigger the creation of the pod and mount the files/directories.
This is the job of the kubelet
agent of the node that will create the pod and apply it's manifest. This is why you need to specify the full path of the file/dir you want to mount.
According to PersistentVolumes documentation:
Kubernetes supports
hostPath
for development and testing on a single-node cluster. A hostPath PersistentVolume uses a file or directory on the Node to emulate network-attached storage.In a production cluster, you would not use hostPath. Instead a cluster administrator would provision a network resource like a Google Compute Engine persistent disk, an NFS share, or an Amazon Elastic Block Store volume. Cluster administrators can also use StorageClasses to set up dynamic provisioning.
Watch out when using hostPath type, because:
hostPath
.hostPath
volumeIf you have any question let me know in the comments.