Skip to main content
Persistent Volume Claims (PVCs) are requests for storage by users. They allow pods to request specific storage resources without needing to know the underlying storage infrastructure details.

Key Concepts

PVC

A request for storage that can be bound to a Persistent Volume (PV).

Storage Class

Defines the type of storage (SSD, HDD, network) and provisioner to use.

Access Modes

Defines how the volume can be accessed (single node, multiple nodes, read-only).

Capacity

The amount of storage requested and allocated.

Required Permissions

ActionPermission
View PVCsiam:project:infrastructure:kubernetes:read
Create PVCiam:project:infrastructure:kubernetes:write
Edit PVCiam:project:infrastructure:kubernetes:write
Delete PVCiam:project:infrastructure:kubernetes:delete

PVC Status Values

StatusDescription
BoundPVC is successfully bound to a Persistent Volume
PendingWaiting for a suitable PV to be provisioned or available
LostThe PVC lost its binding to the underlying PV
A PVC in “Pending” status typically means the storage provisioner is creating storage, or no matching PV exists. Check events for details.

Access Modes

ModeAbbreviationDescription
ReadWriteOnceRWOVolume can be mounted read-write by a single node
ReadOnlyManyROXVolume can be mounted read-only by many nodes
ReadWriteManyRWXVolume can be mounted read-write by many nodes
ReadWriteOncePodRWOPVolume can be mounted read-write by a single pod
Not all storage backends support all access modes. Check your StorageClass documentation for supported modes.

How to View PVCs

1

Select Cluster

Choose a cluster from the cluster dropdown.
2

Select Namespace

Choose a namespace or select “all” to view PVCs across all namespaces.
3

Filter and Search

Use the search box to find PVCs by name, storage class, or volume name. Filter by status (Bound, Pending, Lost).

How to View PVC Details

1

Find the PVC

Locate the PVC in the list.
2

Click PVC Name

Click on the PVC name to open the detail drawer.
3

Review Details

View PVC information including:
  • Overview: Name, namespace, status, storage class, age
  • Storage: Requested size, actual capacity, volume name
  • Access: Access modes, volume mode (Filesystem/Block)
  • Selector: Label selector for PV matching (if specified)
  • Conditions: PVC controller conditions
  • Events: Recent provisioning and binding events

How to Create a PVC

1

Click Create PVC

Click the Create PVC button in the page header.
2

Write YAML

Enter the PVC manifest in YAML format. Key fields:
  • spec.accessModes - How the volume can be accessed
  • spec.resources.requests.storage - Amount of storage requested
  • spec.storageClassName - Storage class to use for provisioning
3

Select Namespace

Choose the target namespace for the PVC.
4

Create

Click Create to apply the manifest.
If you don’t specify a storageClassName, the default StorageClass will be used (if one exists).

How to Edit a PVC

1

Open Actions Menu

Click the actions menu (three dots) on the PVC row.
2

Click Edit YAML

Select Edit YAML to open the YAML editor.
3

Modify Spec

Edit the PVC specification. Note that most fields are immutable after creation.
4

Save

Click Update to apply changes.
Most PVC fields are immutable after creation. You can only expand storage (if supported by the StorageClass) and modify labels/annotations.

How to Delete a PVC

1

Open Actions Menu

Click the actions menu on the PVC row.
2

Click Delete

Select Delete from the menu.
3

Confirm

Confirm the deletion. Data on the volume may be lost depending on the reclaim policy.
Deleting a PVC that is in use by a pod will fail until all pods using it are terminated. The underlying data may be deleted depending on the PV’s reclaim policy (Delete, Retain, Recycle).

Volume Modes

PVCs support two volume modes:
ModeDescription
FilesystemVolume is mounted as a directory (default)
BlockVolume is presented as a raw block device
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: block-pvc
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Block
  resources:
    requests:
      storage: 10Gi

Example PVC

Basic PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: standard

PVC with Selector

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-with-selector
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      environment: production
      tier: database

Using PVCs in Pods

apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
    - name: app
      image: myapp:latest
      volumeMounts:
        - name: data
          mountPath: /data
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: my-pvc

Storage Expansion

If the StorageClass allows volume expansion (allowVolumeExpansion: true), you can increase PVC size:
spec:
  resources:
    requests:
      storage: 20Gi  # Increased from 10Gi
Volume expansion is supported by most cloud providers. Shrinking volumes is generally not supported.

Troubleshooting

  • Check if a matching StorageClass exists
  • Verify the StorageClass provisioner is running
  • Check PVC events for provisioning errors
  • Ensure sufficient cluster resources for storage
  • Verify access mode is supported by the storage backend
  • The underlying PV has been deleted or become unavailable
  • Check PV status and events
  • The storage backend may have failed
  • Manual intervention may be required to recover data
  • PVC may still be in use by pods
  • Check for pods mounting the PVC: kubectl get pods --all-namespaces -o json | grep <pvc-name>
  • Delete or update pods to remove the volume reference
  • Check for finalizers blocking deletion
  • Verify StorageClass has allowVolumeExpansion: true
  • Check if the storage backend supports expansion
  • Pod restart may be required for filesystem resize
  • Check PVC conditions for resize status
  • Verify PVC is in Bound status
  • Check if access mode is compatible with pod’s node
  • For RWO volumes, ensure no other node has it mounted
  • Check kubelet logs on the node
  • Verify the underlying storage is accessible
  • If storageClassName is empty, the default class is used
  • Explicitly set storageClassName in the PVC spec
  • Check cluster’s default StorageClass: kubectl get sc -o wide

FAQ

PV (Persistent Volume) is the actual storage resource in the cluster. PVC (Persistent Volume Claim) is a request for storage by a user. PVCs bind to PVs, abstracting storage details from users.
It depends on the PV’s reclaim policy:
  • Delete: PV and data are deleted (default for dynamic provisioning)
  • Retain: PV is kept for manual data recovery
  • Recycle: Data is scrubbed (deprecated)
Yes, if the access mode allows it. ReadWriteMany (RWX) allows multiple pods on different nodes. ReadWriteOnce (RWO) allows multiple pods only on the same node.
Create a new PVC, run a data copy job between volumes, then update your workload to use the new PVC. Tools like kubectl cp or custom jobs with both volumes mounted can help.
When a PVC is created with a StorageClass, the provisioner automatically creates a matching PV. No manual PV creation is needed. Most cloud providers support dynamic provisioning.
No. StorageClass is immutable after PVC creation. Create a new PVC with the desired class and migrate your data.
A StorageClass with volumeBindingMode: WaitForFirstConsumer delays PV provisioning until a pod using the PVC is scheduled. This ensures the PV is created in the correct availability zone.
Use volume snapshots (if supported), application-level backups, or tools like Velero. The best approach depends on your storage backend and consistency requirements.