Skip to main content

Command Palette

Search for a command to run...

Understanding Kubernetes Storage: Implementing Storage Classes, Persistent Volumes, and Claims

Published
Understanding Kubernetes Storage: Implementing Storage Classes, Persistent Volumes, and Claims
R

I'm Rudraksh Laddha — a DevOps engineer and emerging full-stack developer, passionate about building scalable, reliable systems that solve real-world problems.

With a solid foundation in cloud infrastructure automation using tools like Kubernetes, Docker, Terraform, and AWS, I thrive in environments where efficiency, resilience, and automation are key.

But my journey doesn't stop at infrastructure. I'm actively expanding into full-stack development, building dynamic applications using React, Node.js, and MongoDB. Whether it's designing cloud-native CI/CD pipelines or developing intuitive user interfaces, I enjoy creating end-to-end solutions — from server to screen.

Right now, I'm: 🧩 Building full-stack applications that merge DevOps reliability with engaging frontend experiences 🛠️ Contributing to open-source projects, learning through collaboration and real-world scenarios 🚀 Growing Virendana Ui, my own UI library focused on expressive, clean design systems 🚀 Growing Learn Virendana, where I share my personalized learning journey — from beginner to experienced 🎮 Developing side projects like 2048 Rush, blending product thinking with scalable infrastructure My long-term goal? To bridge DevOps and development — building products that are not just functional and fast, but also resilient, beautiful, and ready for scale.

For great practical learning and detailed breakdowns, subscribe my newsletter: https://rudraksh-tech.beehiiv.com/subscribe


Here’s a step-by-step practical implementation of using Kubernetes Storage Classes in a real environment:

Prerequisites:

  • A running Kubernetes cluster (Minikube, GKE, EKS, etc.)

  • kubectl CLI installed and configured to manage your cluster.

Step-by-Step Practical Implementation:

1. Set Up the Kubernetes Cluster

You need a Kubernetes cluster to implement the example. If you’re using Minikube locally, start Minikube:

minikube start

Or if you're using a cloud platform like Google Kubernetes Engine (GKE), make sure your cluster is up and running.


2. Create a Storage Class

Define a Storage Class that Kubernetes will use to dynamically provision storage. Here’s an example YAML file for the StorageClass:

# storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-storage  # Name of the storage class
provisioner: kubernetes.io/aws-ebs  # Replace with the provisioner relevant to your environment (GCE, Azure, etc.)
parameters:
  type: gp2  # Specify the type of storage (e.g., gp2 in AWS for General Purpose SSD)
  fsType: ext4  # Filesystem type

Apply the StorageClass:

kubectl apply -f storageclass.yaml

Verify it was created:

kubectl get storageclass

You should see fast-storage listed.


3. Create a PersistentVolumeClaim (PVC)

Next, create a PersistentVolumeClaim that will use this StorageClass to dynamically provision storage:

# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc  # Name of the PVC
spec:
  accessModes:
    - ReadWriteOnce  # Access mode, can be ReadWriteMany for shared access
  storageClassName: fast-storage  # Use the StorageClass you defined earlier
  resources:
    requests:
      storage: 5Gi  # Request 5 GB of storage

Apply the PVC:

kubectl apply -f pvc.yaml

Verify the PVC is created and bound:

kubectl get pvc

The status should show Bound, indicating that a persistent volume has been dynamically provisioned.


4. Create a Pod to Use the PVC

Now, deploy a Pod (for example, a simple MySQL database) that will use the dynamically provisioned persistent storage:

# mysql-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mysql
spec:
  containers:
  - name: mysql
    image: mysql:5.6
    ports:
    - containerPort: 3306
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: password
    volumeMounts:
    - name: mysql-storage
      mountPath: /var/lib/mysql  # MySQL data directory
  volumes:
  - name: mysql-storage
    persistentVolumeClaim:
      claimName: my-pvc  # Refer to the PVC created earlier

Apply the Pod definition:

kubectl apply -f mysql-pod.yaml

5. Verify the Pod and Storage

Check if the Pod is running:

kubectl get pods

The Pod should be in the Running state. Now, check if the Persistent Volume has been provisioned:

kubectl get pv

This will show a dynamically provisioned PersistentVolume associated with your PVC.


6. Test Persistence

  1. Access the MySQL Pod: Connect to the MySQL container and create some data:

     kubectl exec -it mysql -- mysql -u root -p
    

    Inside MySQL, create a database and a table:

     CREATE DATABASE testdb;
     USE testdb;
     CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(100));
     INSERT INTO users (id, name) VALUES (1, 'Rudraksh');
    
  2. Delete the Pod: Now, delete the MySQL Pod and re-create it to test if the data persists:

     kubectl delete pod mysql
    

    Reapply the Pod:

     kubectl apply -f mysql-pod.yaml
    
  3. Verify Data Persistence: Access the MySQL Pod again and check if the data still exists:

     kubectl exec -it mysql -- mysql -u root -p
    

    Check the database:

     USE testdb;
     SELECT * FROM users;
    

    You should see the data (Rudraksh) still present, confirming that the storage persisted even though the Pod was restarted.


Conclusion:

This practical implementation demonstrates how you can use Kubernetes Storage Classes to dynamically provision persistent storage for stateful applications like MySQL. With Storage Classes, Kubernetes simplifies storage management by automating the creation and management of Persistent Volumes based on the application’s needs.

#Kubernetes #KubernetesStorage #StorageClass #CloudNative #PersistentStorage #DevOps #KubernetesTutorial #Minikube #DynamicProvisioning #CloudComputing #PersistentVolumeClaim #Containers #InfrastructureAutomation #StatefulApplications #KubernetesTips #TechForDevelopers #CloudStorage #K8sBestPractices #OpenSourceDevOps #KubernetesForBeginner