Kubernetes is the operating system of the cloud—and understanding it is essential for modern DevOps, SaaS, and full-stack development. Whether you're a beginner or looking to deepen your knowledge, this tutorial will walk you through every core concept with real-world examples.
📦 What is Kubernetes?
Kubernetes (K8s) is an open-source container orchestration platform that helps you deploy, scale, and manage containerized applications.
Imagine running 100+ microservices. How do you keep them alive, ensure networking, balance traffic, and roll out updates safely? That’s what Kubernetes automates.
🔧 Why Use Kubernetes?
- 🚀 Auto-scaling and load balancing
 - 🔁 Self-healing (crash recovery, restart)
 - 🛠️ Rolling updates with zero downtime
 - 🔐 Secrets & configuration management
 - 🗃️ Persistent storage
 - 🌐 Ingress + traffic routing
 - 🧱 Infrastructure-as-Code (YAML)
 
🛠️ Kubernetes Core Components (Visualized)
| Component | Description | 
|---|---|
| Pod | Smallest unit in K8s. Runs 1+ containers. | 
| Deployment | Manages pods & versions over time. | 
| Service | Exposes your pods within/outside the cluster. | 
| Ingress | Manages HTTP/HTTPS routing to services. | 
| ConfigMap | Externalizes config data (non-sensitive). | 
| Secret | Injects sensitive data (passwords, tokens). | 
| PVC | Persistent storage requests for stateful apps. | 
| Node | A VM or physical machine in the cluster. | 
🧱 Hands-On: Create a Complete K8s App Stack
We'll now walk through creating:
- A simple Node.js app
 - A Deployment to manage it
 - A Service to expose it
 - A ConfigMap and Secret
 - A PersistentVolumeClaim
 
  
  
  📁 Step 1: deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: node:18
          command: ["node", "-e", "require('http').createServer((_,res)=>res.end('Hi')).listen(3000)"]
          ports:
            - containerPort: 3000
✅ What it does:
- Launches 2 pods of a Node.js app
 - Uses node:18 as base image
 - Exposes port 3000 inside the container
 
  
  
  🌐 Step 2: service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 3000
      nodePort: 30080
✅ What it does:
- Makes the app available via port 
30080on your node - Load-balances between the pods
 - Accepts requests on port 
80, routes to3000 
  
  
  ⚙️ Step 3: configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_ENV: production
✅ What it does:
- Stores non-sensitive environment variables
 - Can be injected into your pod like this:
 
envFrom:
  - configMapRef:
      name: app-config
  
  
  🔐 Step 4: secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  DB_PASSWORD: bXlTZWNyZXRQYXNz
✅ What it does:
- Encodes secrets in base64 (e.g. 
mySecretPass) - You can inject it in your pod:
 
env:
  - name: DB_PASSWORD
    valueFrom:
      secretKeyRef:
        name: db-secret
        key: DB_PASSWORD
  
  
  💾 Step 5:pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
✅ What it does:
- Requests 1 GB of storage
 - You can mount it into your pod at 
/data: 
volumes:
  - name: storage
    persistentVolumeClaim:
      claimName: my-pvc
volumeMounts:
  - name: storage
    mountPath: /data
🚀 Running Everything
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f configmap.yaml
kubectl apply -f secret.yaml
kubectl apply -f pvc.yaml
📚 Bonus: Useful K8s Commands
kubectl get pods
kubectl get svc
kubectl describe pod <pod-name>
kubectl logs <pod-name>
kubectl delete -f deployment.yaml
❤️ Support & Follow
If you found this helpful:
- 🧠 Follow me for more DevOps + Cloud tutorials
 - 💬 Comment your Kubernetes use-case
 - ⭐ Save this post for later
 

    
Top comments (0)