> ## Documentation Index
> Fetch the complete documentation index at: https://docs.akua.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Local Path Provisioner

> Direct local disk storage for development, single-node setups, and latency-sensitive workloads

<Frame>
  <img className="block dark:hidden" src="https://mintcdn.com/akua-1dce587a/3H5lVc027NQakOso/images/heros/local-path-light.svg?fit=max&auto=format&n=3H5lVc027NQakOso&q=85&s=590cb598d9f1a45807f520d66b8de01e" alt="A local-path volume bound to one worker node with pod placement constraints made visible." width="1536" height="864" data-path="images/heros/local-path-light.svg" />

  <img className="hidden dark:block" src="https://mintcdn.com/akua-1dce587a/3H5lVc027NQakOso/images/heros/local-path-dark.svg?fit=max&auto=format&n=3H5lVc027NQakOso&q=85&s=9f63e9a4da9e19e0d968aa73c3ab12d2" alt="A local-path volume bound to one worker node with pod placement constraints made visible." width="1536" height="864" data-path="images/heros/local-path-dark.svg" />
</Frame>

Local Path Provisioner uses the worker node's local disk to create <Tooltip headline="Persistent Volumes" tip="Persistent Volumes (PVs) are storage resources in a Kubernetes cluster that exist independently of any individual pod. When a pod is deleted or restarted, the data on a persistent volume remains intact.">persistent volumes</Tooltip>. It requires no external dependencies or configuration, and delivers fast I/O since data lives on the same machine as your application.

## When to use

* **Development and testing**: get persistent storage running in seconds
* **Single-node clusters**: local testing with [Multipass](/clusters/local-testing) or a single production server
* **Latency-sensitive production workloads**: databases on NVMe SSDs where direct disk access matters and the application handles its own replication (for example, PostgreSQL with streaming replication or MongoDB replica sets)
* **Simple production setups**: single-node servers where replication isn't needed

<Warning>
  Local Path Provisioner stores data on a single node with **no replication**. If the node fails or is replaced, the data is lost. For production workloads that need storage-level durability, use [Piraeus (LINSTOR)](/clusters/storage/piraeus) instead, unless your application handles replication itself.
</Warning>

## How it works

When an application requests storage, Local Path Provisioner creates a directory on the node's local filesystem and mounts it into the <Tooltip headline="Pod" tip="A pod is the smallest deployable unit in Kubernetes. It runs one or more containers and can mount volumes for persistent storage.">pod</Tooltip>. The volume is tied to that specific node. If Kubernetes needs to reschedule the pod, it schedules it back to the same node so it can access its data.

**Key characteristics:**

* One volume per <Tooltip headline="PersistentVolumeClaim" tip="A PersistentVolumeClaim (PVC) is a request for storage by an application. Kubernetes matches the claim to a StorageClass and provisions a volume automatically.">PersistentVolumeClaim</Tooltip>
* Pods using local storage are pinned to the node where the volume was created
* No network overhead: reads and writes go directly to local disk, providing the lowest possible latency

## Deploy

Navigate to your cluster's **Storage** tab, click **Deploy Storage**, and select **Local Path Provisioner**. The provider deploys in under a minute and creates a default <Tooltip headline="StorageClass" tip="A StorageClass defines what type of storage is available in your cluster and how volumes are provisioned. When an application requests storage, Kubernetes uses the StorageClass to automatically create the right kind of volume.">StorageClass</Tooltip> automatically.

After deployment, any application that requests a PersistentVolumeClaim will get a local volume provisioned on the node where the pod is scheduled.

## Limitations

* **Single-node only**: data lives on one node and is not replicated
* **No failover**: if the node goes down, pods using local storage can't be rescheduled elsewhere until the node recovers
* **No snapshots**: volume snapshots are not supported
* **No volume size enforcement**: requested storage sizes in PersistentVolumeClaims are not enforced. Since each volume is just a directory on the node's filesystem, it can grow to use all available disk space regardless of the size you request ([GitHub #107](https://github.com/rancher/local-path-provisioner/issues/107)).
* **No volume expansion**: resizing a PVC after creation is not supported. Attempting to expand a volume causes the controller to log repeated errors because the provisioner has no resize capability ([GitHub #190](https://github.com/rancher/local-path-provisioner/issues/190)).
* **<Tooltip headline="Node Affinity" tip="Node affinity is a Kubernetes scheduling constraint that ties a pod to a specific node. With local storage, the pod must run on the node where its volume exists.">Node affinity</Tooltip>**: pods are pinned to the node where their volume was created

## Local storage in production

Local Path Provisioner can be a valid production choice when your priority is raw disk performance and your application handles data replication at the application level. Databases like PostgreSQL, MySQL, and MongoDB have built-in replication that keeps copies of data across multiple instances; they don't need the storage layer to replicate for them. In these cases, local storage on NVMe SSDs gives you the lowest latency without the overhead of network-based replication.

The trade-off is operational: you're responsible for ensuring your application's replication is configured correctly. If it isn't, a node failure means data loss.

## Moving to replicated storage

When you want storage-level replication instead of managing it at the application layer:

1. Deploy [Piraeus (LINSTOR)](/clusters/storage/piraeus) for replicated storage across nodes
2. Migrate your data by backing up and restoring from the application level (database dumps, file exports)
3. Remove Local Path Provisioner once all workloads have moved

<Tip>
  You can run both storage providers simultaneously during migration. Set Piraeus as the default StorageClass, and new volumes will automatically use replicated storage while existing local volumes continue to work.
</Tip>

## Related topics

<CardGroup cols={2}>
  <Card title="Piraeus (LINSTOR)" icon="database" href="/clusters/storage/piraeus">
    Production-grade replicated storage across multiple nodes.
  </Card>

  <Card title="Storage overview" icon="circle-info" href="/clusters/storage">
    Compare providers and deploy storage to your cluster.
  </Card>

  <Card title="Add workers" icon="server" href="/clusters/add-workers">
    Connect worker nodes that provide local disk for this provider.
  </Card>

  <Card title="Local Path Provisioner on GitHub" icon="github" href="https://github.com/rancher/local-path-provisioner">
    Project source and upstream documentation.
  </Card>
</CardGroup>
