Bird
Raised Fist0
Kubernetesdevops~5 mins

PersistentVolumeClaim (PVC) definition in Kubernetes - Commands & Configuration

Choose your learning style10 modes available
Introduction
When you want to save data in Kubernetes so it stays safe even if your app restarts or moves, you use a PersistentVolumeClaim. It asks Kubernetes for storage space that your app can use like a hard drive.
When your app needs to save files or databases that must not disappear after a restart.
When you want to share storage between different parts of your app.
When you want to separate storage setup from your app code for easier management.
When you need to request a specific size and type of storage for your app.
When you want Kubernetes to handle storage allocation automatically.
Config File - pvc.yaml
pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: example-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: standard

apiVersion: Specifies the Kubernetes API version used.

kind: Defines this resource as a PersistentVolumeClaim.

metadata.name: The name to identify this claim.

spec.accessModes: How the volume can be accessed; ReadWriteOnce means one node can mount it for reading and writing.

spec.resources.requests.storage: The amount of storage requested.

spec.storageClassName: The storage class that defines the type of storage to use.

Commands
This command creates the PersistentVolumeClaim in Kubernetes, asking for 1Gi of storage with ReadWriteOnce access.
Terminal
kubectl apply -f pvc.yaml
Expected OutputExpected
persistentvolumeclaim/example-pvc created
This command checks the status of the PersistentVolumeClaim to see if it has been bound to a PersistentVolume.
Terminal
kubectl get pvc example-pvc
Expected OutputExpected
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE example-pvc Bound pvc-12345678-90ab-cdef-1234-567890abcdef 1Gi RWO standard 10s
This command shows detailed information about the PersistentVolumeClaim, including events and which volume it is using.
Terminal
kubectl describe pvc example-pvc
Expected OutputExpected
Name: example-pvc Namespace: default StorageClass: standard Status: Bound Volume: pvc-12345678-90ab-cdef-1234-567890abcdef Labels: <none> Annotations: <none> Finalizers: [kubernetes.io/pvc-protection] Capacity: 1Gi Access Modes: RWO VolumeMode: Filesystem Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ProvisioningSucceeded 20s persistentvolume-controller Successfully provisioned volume pvc-12345678-90ab-cdef-1234-567890abcdef
Key Concept

If you remember nothing else from this pattern, remember: a PersistentVolumeClaim is how your app asks Kubernetes for storage space it can use safely and persistently.

Common Mistakes
Not specifying the storageClassName and expecting automatic binding.
Without a storage class, Kubernetes may not know which storage to allocate, causing the claim to stay pending.
Always specify a valid storageClassName or ensure a default storage class is set in the cluster.
Requesting more storage than available in the cluster.
The claim will remain unbound because no volume can satisfy the request.
Check available storage and request a size that can be fulfilled.
Using accessModes that do not match the volume capabilities.
The claim will fail to bind if the requested access mode is unsupported by the volume.
Use accessModes compatible with your storage class and volume type, commonly ReadWriteOnce.
Summary
Create a PersistentVolumeClaim YAML file to request storage with specific size and access mode.
Apply the YAML file with kubectl apply to create the claim in Kubernetes.
Check the claim status with kubectl get pvc and kubectl describe pvc to confirm it is bound and ready.

Practice

(1/5)
1. What is the main purpose of a PersistentVolumeClaim (PVC) in Kubernetes?
easy
A. To configure network policies
B. To define a container image for a pod
C. To schedule pods on specific nodes
D. To request storage resources from the cluster

Solution

  1. Step 1: Understand PVC role

    A PVC is used to request storage resources in Kubernetes, separating storage use from storage details.
  2. Step 2: Compare options

    Options A, B, and D relate to other Kubernetes features, not storage requests.
  3. Final Answer:

    To request storage resources from the cluster -> Option D
  4. Quick Check:

    PVC = Storage request [OK]
Hint: PVC always requests storage, not images or network [OK]
Common Mistakes:
  • Confusing PVC with Pod or Deployment definitions
  • Thinking PVC schedules pods
  • Mixing PVC with network policies
2. Which of the following is the correct minimal YAML snippet to define a PVC requesting 5Gi of storage with ReadWriteOnce access mode?
easy
A. apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadOnlyMany resources: requests: storage: 5Gi
B. apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi
C. apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteMany resources: limits: storage: 5Gi
D. apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteOnce resources: requests: cpu: 5Gi

Solution

  1. Step 1: Check accessModes and storage request

    apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi correctly uses ReadWriteOnce and requests 5Gi storage under resources.requests.
  2. Step 2: Identify errors in other options

    apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadOnlyMany resources: requests: storage: 5Gi uses ReadOnlyMany (not requested). apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteMany resources: limits: storage: 5Gi uses limits instead of requests. apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteOnce resources: requests: cpu: 5Gi incorrectly requests cpu instead of storage.
  3. Final Answer:

    Correct minimal PVC YAML with 5Gi and ReadWriteOnce -> Option B
  4. Quick Check:

    accessModes + storage request = apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi [OK]
Hint: Use resources.requests.storage for size, accessModes for access [OK]
Common Mistakes:
  • Using limits instead of requests for storage
  • Wrong accessModes value
  • Requesting cpu instead of storage
3. Given this PVC YAML snippet, what will be the requested storage size and access mode?
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: fast-storage
medium
A. 10Gi storage with ReadWriteMany access
B. 10Gi storage with ReadWriteOnce access
C. 5Gi storage with ReadWriteMany access
D. 10Gi storage with ReadOnlyMany access

Solution

  1. Step 1: Read storage size

    The YAML requests 10Gi storage under resources.requests.storage.
  2. Step 2: Read access mode

    Access mode is ReadWriteMany as specified under accessModes.
  3. Final Answer:

    10Gi storage with ReadWriteMany access -> Option A
  4. Quick Check:

    storage=10Gi, access=ReadWriteMany [OK]
Hint: Check resources.requests.storage and accessModes list [OK]
Common Mistakes:
  • Confusing ReadWriteOnce with ReadWriteMany
  • Misreading storage size
  • Ignoring storageClassName as it doesn't affect size or access
4. Identify the error in this PVC YAML snippet:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2GB
medium
A. metadata name is missing
B. accessModes should be ReadOnlyMany
C. storage size unit should be Gi, not GB
D. apiVersion should be apps/v1

Solution

  1. Step 1: Check storage size unit

    Kubernetes expects storage size units like Gi, Mi, not GB. '2GB' is invalid.
  2. Step 2: Verify other fields

    accessModes and metadata name are correct. apiVersion for PVC is v1, not apps/v1.
  3. Final Answer:

    storage size unit should be Gi, not GB -> Option C
  4. Quick Check:

    Use Gi for storage size units [OK]
Hint: Use Gi, Mi units for storage size, not GB [OK]
Common Mistakes:
  • Using GB instead of Gi for storage size
  • Wrong apiVersion for PVC
  • Changing accessModes unnecessarily
5. You want to create a PVC that requests 20Gi storage with ReadWriteOnce access and uses a storage class named "premium-ssd". Which YAML snippet correctly defines this PVC?
hard
A. apiVersion: v1 kind: PersistentVolumeClaim metadata: name: premium-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi storageClassName: premium-ssd
B. apiVersion: v1 kind: PersistentVolumeClaim metadata: name: premium-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 20Gi storageClassName: premium-ssd
C. apiVersion: v1 kind: PersistentVolumeClaim metadata: name: premium-pvc spec: accessModes: - ReadWriteOnce resources: limits: storage: 20Gi storageClassName: premium-ssd
D. apiVersion: v1 kind: PersistentVolumeClaim metadata: name: premium-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 20GB storageClassName: premium-ssd

Solution

  1. Step 1: Verify accessModes and storage size

    apiVersion: v1 kind: PersistentVolumeClaim metadata: name: premium-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi storageClassName: premium-ssd uses ReadWriteOnce and requests 20Gi storage correctly.
  2. Step 2: Check storageClassName and units

    apiVersion: v1 kind: PersistentVolumeClaim metadata: name: premium-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi storageClassName: premium-ssd correctly sets storageClassName to premium-ssd and uses Gi units. Other options have wrong accessModes, use limits instead of requests, or wrong units (GB).
  3. Final Answer:

    Correct PVC with 20Gi, ReadWriteOnce, and premium-ssd storage class -> Option A
  4. Quick Check:

    accessModes=ReadWriteOnce + requests.storage=20Gi + storageClassName= premium-ssd [OK]
Hint: Use requests.storage with Gi units and correct accessModes [OK]
Common Mistakes:
  • Using limits instead of requests for storage
  • Wrong accessModes value
  • Using GB instead of Gi for storage size
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard