Skip to main content

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 valueComponentControls
dapr_placement.volumeclaims.storageSizePlacementSize of each replica's data volume
dapr_placement.volumeclaims.storageClassNamePlacementStorageClass used to provision the volumes
dapr_scheduler.cluster.storageSizeSchedulerSize of each replica's data volume
dapr_scheduler.cluster.storageClassNameSchedulerStorageClass used to provision the volumes
dapr_scheduler.cluster.inMemoryStorageSchedulerIf 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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
Version requirement

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

ChangeWhat Conductor doesData impact
Storage size increaseExpands each PVC in place, then recreates the StatefulSetPreserved
Storage size decreaseRejected with an error; nothing is changedPreserved (unchanged)
Storage class changeRecreates the StatefulSet; existing volumes keep their original class and sizePreserved, not migrated
Scheduler switched to in-memoryRecreates the StatefulSet without volumes; previous PVCs are retained but unusedRetained on the old PVCs