Bird
Raised Fist0
Kubernetesdevops~5 mins

Storage classes for dynamic provisioning in Kubernetes - Commands & Configuration

Choose your learning style10 modes available
Introduction
When you need storage for your applications in Kubernetes, you can create it automatically using storage classes. This saves you from manually setting up storage every time. Storage classes tell Kubernetes how to create storage on demand.
When you want your app to get storage automatically without manual setup.
When you need different types of storage like fast SSD or cheaper HDD for different apps.
When you want to manage storage policies like encryption or replication easily.
When you want to avoid errors from manually creating storage volumes.
When you want to scale storage dynamically as your app grows.
Config File - storageclass.yaml
storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-storage
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
  fsType: ext4
reclaimPolicy: Delete
volumeBindingMode: Immediate

This file defines a StorageClass named fast-storage. It uses the AWS Elastic Block Store (EBS) provisioner to create gp2 type volumes formatted with ext4 filesystem. The reclaimPolicy: Delete means storage is deleted when no longer used. volumeBindingMode: Immediate means volumes are created right when requested.

Commands
This command creates the StorageClass in your Kubernetes cluster so it can be used for dynamic storage provisioning.
Terminal
kubectl apply -f storageclass.yaml
Expected OutputExpected
storageclass.storage.k8s.io/fast-storage created
This command lists all StorageClasses available in the cluster to verify that your new StorageClass was created.
Terminal
kubectl get storageclass
Expected OutputExpected
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE fast-storage kubernetes.io/aws-ebs Delete Immediate false 10s
This command creates a PersistentVolumeClaim that requests storage using the StorageClass named fast-storage. Kubernetes will dynamically create the storage volume.
Terminal
kubectl apply -f pvc.yaml
Expected OutputExpected
persistentvolumeclaim/my-pvc created
This command checks the status of the PersistentVolumeClaim to see if the storage has been successfully provisioned and bound.
Terminal
kubectl get pvc my-pvc
Expected OutputExpected
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE my-pvc Bound pvc-12345678-90ab-cdef-1234-567890abcdef 5Gi RWO fast-storage 15s
Key Concept

If you remember nothing else from this pattern, remember: StorageClasses let Kubernetes create storage automatically when your app asks for it.

Common Mistakes
Not specifying the correct provisioner in the StorageClass.
Kubernetes won't know how to create the storage and the PVC will stay pending.
Use the provisioner that matches your cloud or storage system, like kubernetes.io/aws-ebs for AWS.
Creating a PersistentVolumeClaim without specifying the StorageClass name.
Kubernetes may use the default StorageClass or fail if none is set, causing unexpected storage types or errors.
Always specify the storageClassName field in your PVC to use the desired StorageClass.
Deleting the StorageClass while PVCs are still using it.
Existing volumes may become unmanaged or cause errors when deleted unexpectedly.
Only delete StorageClasses when no PVCs are using them or after cleaning up PVCs.
Summary
Create a StorageClass YAML file to define how storage is dynamically provisioned.
Apply the StorageClass to the cluster using kubectl apply.
Create a PersistentVolumeClaim that requests storage from the StorageClass.
Check the PVC status to confirm storage was provisioned and bound.

Practice

(1/5)
1. What is the main purpose of a StorageClass in Kubernetes?
easy
A. To define how storage volumes are dynamically provisioned
B. To schedule pods on specific nodes
C. To manage network policies
D. To configure container resource limits

Solution

  1. Step 1: Understand StorageClass role

    A StorageClass defines parameters for dynamic volume provisioning in Kubernetes.
  2. Step 2: Compare with other options

    Scheduling pods, managing network policies, and resource limits are unrelated to StorageClass.
  3. Final Answer:

    To define how storage volumes are dynamically provisioned -> Option A
  4. Quick Check:

    StorageClass = dynamic provisioning [OK]
Hint: StorageClass controls storage creation, not pods or network [OK]
Common Mistakes:
  • Confusing StorageClass with pod scheduling
  • Thinking StorageClass manages network policies
  • Assuming StorageClass sets container CPU/memory limits
2. Which of the following is the correct YAML snippet to specify a StorageClass named fast-storage for a PersistentVolumeClaim?
easy
A. StorageClass: fast-storage
B. storageclass: fast-storage
C. storageClassName: fast-storage
D. storage_class_name: fast-storage

Solution

  1. Step 1: Recall correct field name

    The correct field in PVC spec is storageClassName with camelCase.
  2. Step 2: Check other options

    Options B, C, and D use incorrect casing or underscores, which are invalid in Kubernetes YAML.
  3. Final Answer:

    storageClassName: fast-storage -> Option C
  4. Quick Check:

    Correct YAML key = storageClassName [OK]
Hint: Use exact camelCase 'storageClassName' in PVC spec [OK]
Common Mistakes:
  • Using wrong casing like 'storageclass' or 'StorageClass'
  • Replacing camelCase with underscores
  • Misspelling the field name
3. Given this StorageClass YAML snippet:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Retain

What will happen when a PersistentVolumeClaim requests storage from this class?
medium
A. The volume will not be dynamically provisioned; manual provisioning is required
B. The volume will be deleted automatically when released
C. The volume will be dynamically provisioned immediately
D. The volume will be provisioned but bound immediately without waiting

Solution

  1. Step 1: Analyze provisioner field

    The provisioner is kubernetes.io/no-provisioner, meaning no dynamic provisioning.
  2. Step 2: Understand reclaimPolicy and binding mode

    ReclaimPolicy is Retain (volume kept after release), and volumeBindingMode waits for pod scheduling.
  3. Final Answer:

    The volume will not be dynamically provisioned; manual provisioning is required -> Option A
  4. Quick Check:

    No provisioner = manual provisioning [OK]
Hint: No provisioner means no dynamic provisioning [OK]
Common Mistakes:
  • Assuming dynamic provisioning happens with no-provisioner
  • Confusing reclaimPolicy with provisioning behavior
  • Ignoring volumeBindingMode effect
4. You created a StorageClass with volumeBindingMode: Immediate but your pods fail to schedule because volumes are not available in the node's zone. What is the likely cause and fix?
medium
A. Cause: StorageClass name mismatch; Fix: Correct PVC storageClassName
B. Cause: Reclaim policy is Retain; Fix: Change to Delete
C. Cause: Provisioner is missing; Fix: Add a provisioner
D. Cause: Immediate binding ignores pod location; Fix: Change to WaitForFirstConsumer

Solution

  1. Step 1: Understand volumeBindingMode impact

    Immediate binding provisions and binds volume before pod scheduling, ignoring node zone.
  2. Step 2: Identify fix

    Changing to WaitForFirstConsumer delays binding until pod scheduling, ensuring volume is in correct zone.
  3. Final Answer:

    Cause: Immediate binding ignores pod location; Fix: Change to WaitForFirstConsumer -> Option D
  4. Quick Check:

    Immediate binding ignores pod zone [OK]
Hint: Use WaitForFirstConsumer to bind volume after pod scheduling [OK]
Common Mistakes:
  • Changing reclaimPolicy instead of binding mode
  • Adding provisioner when already present
  • Fixing storageClassName without checking binding mode
5. You want to create a StorageClass that dynamically provisions SSD-backed volumes with fast performance, deletes volumes when released, and delays binding until pod scheduling. Which YAML snippet correctly implements this?
hard
A. apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast-ssd provisioner: kubernetes.io/aws-ebs parameters: type: standard reclaimPolicy: Retain volumeBindingMode: Immediate
B. apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast-ssd provisioner: kubernetes.io/aws-ebs parameters: type: gp2 reclaimPolicy: Delete volumeBindingMode: WaitForFirstConsumer
C. apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast-ssd provisioner: kubernetes.io/no-provisioner parameters: type: io1 reclaimPolicy: Delete volumeBindingMode: WaitForFirstConsumer
D. apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast-ssd provisioner: kubernetes.io/aws-ebs parameters: type: io1 reclaimPolicy: Delete volumeBindingMode: Immediate

Solution

  1. Step 1: Identify correct provisioner and parameters

    For AWS SSD, provisioner is kubernetes.io/aws-ebs and type gp2 is general SSD.
  2. Step 2: Check reclaimPolicy and binding mode

    ReclaimPolicy should be Delete to remove volumes after release; binding mode WaitForFirstConsumer delays binding until pod scheduling.
  3. Step 3: Validate options

    apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast-ssd provisioner: kubernetes.io/aws-ebs parameters: type: standard reclaimPolicy: Retain volumeBindingMode: Immediate uses wrong type and policies; apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast-ssd provisioner: kubernetes.io/no-provisioner parameters: type: io1 reclaimPolicy: Delete volumeBindingMode: WaitForFirstConsumer uses no provisioner; apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast-ssd provisioner: kubernetes.io/aws-ebs parameters: type: io1 reclaimPolicy: Delete volumeBindingMode: Immediate uses Immediate binding which is not desired; apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast-ssd provisioner: kubernetes.io/aws-ebs parameters: type: gp2 reclaimPolicy: Delete volumeBindingMode: WaitForFirstConsumer matches all requirements.
  4. Final Answer:

    YAML with provisioner kubernetes.io/aws-ebs, type gp2, reclaimPolicy Delete, and WaitForFirstConsumer -> Option B
  5. Quick Check:

    Correct provisioner + Delete + WaitForFirstConsumer = apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast-ssd provisioner: kubernetes.io/aws-ebs parameters: type: gp2 reclaimPolicy: Delete volumeBindingMode: WaitForFirstConsumer [OK]
Hint: Match provisioner, parameters, reclaimPolicy, and bindingMode exactly [OK]
Common Mistakes:
  • Using no-provisioner disables dynamic provisioning
  • Choosing wrong volume type parameter
  • Setting reclaimPolicy to Retain instead of Delete
  • Using Immediate binding when delayed binding is needed
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