Manage Dapr Storage
Grow the storage of your Dapr control plane directly from the Conductor console, without manual volume surgery on the cluster.
The Dapr control plane has two stateful components — Placement and Scheduler — which run as Kubernetes StatefulSets backed by PersistentVolumeClaims (PVCs). This page explains exactly what Conductor does to those StatefulSets and volumes when you change storage settings, what your cluster must support, and how to verify and troubleshoot the result.
Storage settings
The following Helm values control control-plane storage. You can set them in the Conductor console on the cluster update form, under the advanced Helm arguments:
| Helm value | Component | Controls |
|---|---|---|
dapr_placement.volumeclaims.storageSize | Placement | Size of each replica's data volume |
dapr_placement.volumeclaims.storageClassName | Placement | StorageClass used to provision the volumes |
dapr_scheduler.cluster.storageSize | Scheduler | Size of each replica's data volume |
dapr_scheduler.cluster.storageClassName | Scheduler | StorageClass used to provision the volumes |
dapr_scheduler.cluster.inMemoryStorage | Scheduler | If true, the Scheduler keeps state in memory and has no PVCs |
Values set at install time apply directly: the StatefulSets are created with the requested size and class, and Kubernetes provisions fresh volumes to match.
Changing these values on an existing cluster is where the mechanics below apply.
What Conductor does when a storage setting changes
Kubernetes forbids mutating most StatefulSet fields — including volumeClaimTemplates, where the storage size and class live. Conductor works around this restriction for you. During an upgrade where one of the storage values changed, the Conductor agent performs the following sequence:
- Expands the existing volumes (size increases only). For each replica of the affected component, the agent patches the PVC's requested storage (
spec.resources.requests.storage) to the new size. Kubernetes then expands the underlying volume in place — data is preserved. Volumes already at or above the requested size are left unchanged, so volumes that were expanded manually in the past do not block the upgrade. - Validates before deleting anything. If the change cannot be applied — the size was decreased, or the volumes' StorageClass does not allow expansion — the upgrade fails at this step with a descriptive error, and no StatefulSet is deleted. Volumes already expanded by the same operation remain expanded (expansion cannot be undone); retrying after fixing the cause resumes safely, since volumes at the target size are skipped.
- Deletes the StatefulSet (not the volumes). The PVCs are retained by Kubernetes — deleting a StatefulSet never deletes its volumes, so a storage change never deletes data.
- Recreates the StatefulSet via the Helm upgrade, with a template that reflects the new settings. The recreated StatefulSet re-attaches the same — now larger — volumes by name, and the pod restart completes any remaining filesystem resize.
In-place volume expansion (step 1) requires a Conductor agent from conductor-dataplane v1.62.0 or later. On older agents the StatefulSet is still recreated, but the existing volumes are re-attached at their original size — the disks do not grow.
Prerequisites and limits
The StorageClass must allow volume expansion. The agent verifies that the volumes' StorageClass has allowVolumeExpansion: true before resizing, and fails the upgrade with a clear error if it does not. Check yours with:
kubectl get storageclass
The ALLOWVOLUMEEXPANSION column must read true for the class backing the Dapr volumes. Most default StorageClasses on managed Kubernetes services support expansion — verify with the command above rather than assuming. To enable it on a class you manage:
kubectl patch storageclass <name> -p '{"allowVolumeExpansion": true}'
Sizes can only grow. Kubernetes cannot shrink a volume. Conductor rejects a storage-size decrease with an explicit error instead of applying it. To reduce storage you would need to recreate the installation with the smaller size (losing the existing volumes).
Storage class changes do not migrate data. Changing storageClassName on an existing cluster recreates the StatefulSet, but the retained volumes keep their original class — existing data is neither moved nor re-provisioned. The new class only applies to volumes created after the existing PVCs are removed manually.
In-memory Scheduler has no volumes. With dapr_scheduler.cluster.inMemoryStorage: true there are no Scheduler PVCs, and storage-size settings have no effect on it.
Verify a resize
After the upgrade completes:
# The PVCs should show the new requested size
kubectl get pvc -n dapr-system
# The filesystem inside the pod should reflect it
kubectl exec -n dapr-system dapr-scheduler-server-0 -- df -h /var/run/data/dapr-scheduler
For Placement, run kubectl exec -n dapr-system dapr-placement-server-0 -- df -h and check the raft-log volume mount.
Troubleshooting
The upgrade fails with "StorageClass … does not allow volume expansion". The class backing the volumes has allowVolumeExpansion unset or false. Enable it (see above) or move to a class that supports expansion, then retry the upgrade. The failed attempt changed nothing.
The upgrade fails with "cannot shrink". The new size is smaller than the currently recorded one. Set the value back to the current size or larger.
The PVC shows the new size but the pod still sees the old capacity. The CSI driver may still be resizing. Check the PVC's events and conditions (kubectl describe pvc …) — a FileSystemResizePending condition clears after the pod restarts, which the StatefulSet recreation normally triggers.
The size was increased in the past but the disks never grew. On agents older than v1.62.0, a size increase updated Conductor's recorded configuration without expanding the volumes. Because expansion only triggers when the value changes, re-applying the same size does nothing: set a value strictly larger than the one already recorded, and the agent will expand the volumes to it.
Behavior reference
| Change | What Conductor does | Data impact |
|---|---|---|
| Storage size increase | Expands each PVC in place, then recreates the StatefulSet | Preserved |
| Storage size decrease | Rejected with an error; nothing is changed | Preserved (unchanged) |
| Storage class change | Recreates the StatefulSet; existing volumes keep their original class and size | Preserved, not migrated |
| Scheduler switched to in-memory | Recreates the StatefulSet without volumes; previous PVCs are retained but unused | Retained on the old PVCs |
Related documentation
- Upgrade Dapr — the upgrade flow these storage changes ride on
- Configuration Guide — managing the Dapr control plane via the Conductor agent