A hostPath volume mounts a file or directory from the file system of the host node to a pod. This topic describes how to mount hostPath volumes to pods.
Background information
For more information about the solution provided by Container Service for Kubernetes (ACK) to mount hostPath volumes, see HostPath.
Volume mount modes
hostPath volumes can be mounted in the following modes:
Volume mount mode | Description |
---|---|
DirectoryOrCreate | In this mode, if no content is found in the specified path, an empty directory is created on demand. The permission on the created directory is set to 0755. The directory has the same group and ownership with kubelet. |
Directory | Therefore, a directory must exist in the specified path. |
FileOrCreate | In this mode, if no content is found in the specified path, an empty file is created. The permission of the created file is set to 0644. The file has the same group and ownership with kubelet. |
File | In this mode, a file must exist in the specified path. |
Examples
-
Use the following template to directly mount a
hostPath
volume to a pod:apiVersion: v1 kind: Pod metadata: name: test spec: containers: - image: nginx:1.7.9 name: test volumeMounts: - mountPath: /test name: test-volume volumes: - name: test-volume hostPath: path: /data type: DirectoryOrCreate
-
You can also provision a
hostPath
volume as a persistent volume (PV). Then, you can create a persistent volume claim (PVC) to mount the PV to pods.apiVersion: v1 kind: PersistentVolume metadata: name: task-pv-volume labels: type: local spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce hostPath: path: "/data" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: hostpath spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi
- Mount hostPath volumes to running pods.
In Kubernetes, after a pod starts to run, you cannot change the PVs that are mounted to the pod. If you need to dynamically mount external volumes to the running pod, perform the following steps:Note
- This method uses the mount propagation feature provided by Linux. You must specify the mountPropagation field as Bidirectional when you mount a hostPath volume to the pod. This propagates a directory on the host node to containers in the pod.
- The pod must be running in privileged mode. This is required if you set mountPropagation to Bidirectional.
- The pod must be mounted with a directory from the file system of the host node. This way, running containers in the pod can receive all subsequent mounts to this directory.
Use the following template to create an NGINX application that has a hostPath volume mounted:apiVersion: apps/v1 kind: Deployment metadata: name: deployment-nas labels: app: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 command: ["sh", "-c"] args: ["sleep 10000"] securityContext: privileged: true capabilities: add: ["SYS_ADMIN"] allowPrivilegeEscalation: true volumeMounts: - name: dynamic-volume mountPropagation: "Bidirectional" mountPath: "/dynamic-volume" volumes: - name: dynamic-volume hostPath: path: /mnt/dynamic-volume type: DirectoryOrCreate
Note- Directory on the host node: /mnt/dynamic-volume.
- Mount path in the pod: /dynamic-volume.
The preceding configuration propagates external mounts targeting the /mnt/dynamic-volume/**** directory on the host node to the pod that is mounted with a hostPath volume of the /mnt/dynamic-volume directory. This allows you to dynamically mount external volumes to running pods.