---
title: 'Addon: Hostpath Storage'
description: Canonical makes open source secure, reliable and easy to use, providing
  support for Ubuntu and a portfolio of enterprise-grade technologies. Founded in
  2004, Canonical operates globally with team members in over 80 countries.
url: https://canonical.com/microk8s/docs/addon-hostpath-storage?format=md
---

*Submit*

# Addon: Hostpath Storage

The hostpath storage MicroK8s add-on can be used to easily provision PersistentVolumes backed by a host directory. It is ideal for local development, but for all uses it is important to be aware:

* PersistentVolumeClaims created by the hostpath storage provisioner are bound to the local node, so it is *impossible to move them to a different node*.
* A hostpath volume can *grow beyond the capacity set in the volume claim manifest*.

## [Enable](https://canonical.com/microk8s/docs/addon-hostpath-storage?format=md#p-35208-enable)

```
microk8s enable hostpath-storage
```

## [Verify](https://canonical.com/microk8s/docs/addon-hostpath-storage?format=md#p-35208-verify)

Create an example pod with a PVC, using the `microk8s-hostpath` storage class. Note that the `microk8s-hostpath` storage class is marked as default, so you do not have to specify a `storageClassName` for the PVC definition:

```
microk8s kubectl apply -f - <<EOF
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  accessModes: [ReadWriteOnce]
  resources: { requests: { storage: 1Gi } }
---
apiVersion: v1
kind: Pod
metadata:
  name: test-nginx
spec:
  volumes:
    - name: pvc
      persistentVolumeClaim:
        claimName: test-pvc
  containers:
    - name: nginx
      image: nginx
      ports:
        - containerPort: 80
      volumeMounts:
        - name: pvc
          mountPath: /usr/share/nginx/html
EOF
```

Then use `microk8s kubectl get pod,pvc` to verify that the volume and the container were successfully created:

```
NAME             READY   STATUS    RESTARTS   AGE
pod/test-nginx   1/1     Running   0          32s

NAME                             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE
persistentvolumeclaim/test-pvc   Bound    pvc-c48dbcc1-ca7e-482d-954f-b9e80119e438   1Gi        RWO            microk8s-hostpath   52s
```

You can also use `microk8s kubectl describe pv` to see more details about the volume that was provisioned. Two fields of note are `Node Affinity` (which mentions the node that the provisioned volume is bound to) and `Source` (which mentions the local directory where the volume data is stored).

```
Name:              pvc-c48dbcc1-ca7e-482d-954f-b9e80119e438
Labels:            <none>
Annotations:       hostPathProvisionerIdentity: u2
                   pv.kubernetes.io/provisioned-by: microk8s.io/hostpath
Finalizers:        [kubernetes.io/pv-protection]
StorageClass:      microk8s-hostpath
Status:            Bound
Claim:             default/test-pvc
Reclaim Policy:    Delete
Access Modes:      RWO
VolumeMode:        Filesystem
Capacity:          1Gi
Node Affinity:
  Required Terms:
    Term 0:        kubernetes.io/hostname in [u2]
Message:
Source:
    Type:          HostPath (bare host directory volume)
    Path:          /var/snap/microk8s/common/default-storage/default-test-pvc-pvc-c48dbcc1-ca7e-482d-954f-b9e80119e438
    HostPathType:  DirectoryOrCreate
```

## [Customize directory used for PersistentVolume](https://canonical.com/microk8s/docs/addon-hostpath-storage?format=md#p-35208-customize-directory-used-for-persistentvolume)

> *NOTE*: This feature is available starting from MicroK8s 1.25

By default, the hostpath provisioner will store all volume data under `/var/snap/microk8s/common/default-storage`. It is possible that a cluster administrator might want to change this path, or support different paths (e.g. so that they specify a path backed by SSD storage).

This is possible via the use of custom storage classes, by specifying the `pvDir` parameter. For example, to create an `ssd-hostpath` storage class that stores data under `/mnt/ssd-disk`:

1. Create the storage class definition like so:

   ```
   ---
   # ssd-hostpath-sc.yaml
   kind: StorageClass
   apiVersion: storage.k8s.io/v1
   metadata:
     name: ssd-hostpath
   provisioner: microk8s.io/hostpath
   reclaimPolicy: Delete
   parameters:
     pvDir: /mnt/ssd-disk
   volumeBindingMode: WaitForFirstConsumer
   ```
2. Apply the storage class on the cluster:

   ```
   microk8s kubectl apply -f ssd-hostpath-sc.yaml
   ```
3. Ensure that the storage class was created successfully with `microk8s kubectl get storageclass ssd-hostpath`:

   ```
   NAME           PROVISIONER            RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
   ssd-hostpath   microk8s.io/hostpath   Delete          WaitForFirstConsumer   false                  52s
   ```
4. Create an example PVC using the `ssd-hostpath` storageclass:

   ```
   microk8s kubectl apply -f - <<EOF
   ---
   apiVersion: v1
   kind: PersistentVolumeClaim
   metadata:
     name: test-pvc-ssd
   spec:
     storageClassName: ssd-hostpath
     accessModes: [ReadWriteOnce]
     resources: { requests: { storage: 1Gi } }
   ---
   apiVersion: v1
   kind: Pod
   metadata:
     name: test-nginx-ssd
   spec:
     volumes:
       - name: pvc
         persistentVolumeClaim:
           claimName: test-pvc-ssd
     containers:
       - name: nginx
         image: nginx
         ports:
           - containerPort: 80
         volumeMounts:
           - name: pvc
             mountPath: /usr/share/nginx/html
   EOF
   ```
5. Ensure that the volume data is stored under `/mnt/ssd-disk` with `microk8s kubectl describe pv`. The output should look like this:

   ```
   Name:              pvc-e8991951-ed72-4c62-978e-7f01621a0828
   Labels:            <none>
   Annotations:       hostPathProvisionerIdentity: u2
                      pv.kubernetes.io/provisioned-by: microk8s.io/hostpath
   Finalizers:        [kubernetes.io/pv-protection]
   StorageClass:      ssd-hostpath
   Status:            Bound
   Claim:             default/test-pvc-ssd
   Reclaim Policy:    Delete
   Access Modes:      RWO
   VolumeMode:        Filesystem
   Capacity:          1Gi
   Node Affinity:
   Required Terms:
       Term 0:        kubernetes.io/hostname in [u2]
   Message:
   Source:
       Type:          HostPath (bare host directory volume)
       Path:          /mnt/ssd-disk/default-test-pvc-ssd-pvc-e8991951-ed72-4c62-978e-7f01621a0828
       HostPathType:  DirectoryOrCreate
   Events:            <none>
   ```

Last updated 3 years ago. [Help improve this document in the forum](https://discuss.kubernetes.io/t/addon-hostpath-storage/20878).
