What is Kubernetes and when should I use it instead of Docker Compose?
Kubernetes (K8s) is a container orchestration platform that automates deployment, scaling, and management of containerized applications across clusters of servers. Use it when your application outgrows a single server and needs multi-node orchestration, auto-scaling, and self-healing.
DETAILED EXPLANATION:
Docker Compose manages containers on a single host. Kubernetes manages containers across many hosts (nodes), handling: automatic container placement across nodes, health monitoring and auto-restart, horizontal scaling (add replicas under load), rolling updates with zero downtime, service discovery and load balancing across pods.
K8s Architecture:
- Control Plane: API Server, etcd (state store), Scheduler, Controller Manager
- Worker Nodes: kubelet (agent), kube-proxy (networking), container runtime
- Pods: Smallest deployable unit (1+ containers sharing network/storage)
- Services: Stable DNS endpoints for pod groups
- Ingress: HTTP/HTTPS routing to services
WHEN TO USE:
- Application runs on 3+ servers
- You need auto-scaling based on CPU/memory metrics
- Zero-downtime deployments required
- SaaS platform with variable traffic
STEP-BY-STEP — Deploy app to Kubernetes (using kubectl):
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: LoadBalancer
# Apply
kubectl apply -f nginx-deployment.yaml
# Check pods
kubectl get pods
# Scale
kubectl scale deployment nginx-deployment --replicas=5
# Rolling update
kubectl set image deployment/nginx-deployment nginx=nginx:1.25
# Check rollout status
kubectl rollout status deployment/nginx-deployment
FLOW:
[ kubectl apply ] → API Server → Scheduler → [ Node 1: 1 pod ] + [ Node 2: 1 pod ] + [ Node 3: 1 pod ] → [ LoadBalancer Service ] → Users
KEY POINTS:
- k3s is a lightweight K8s distribution ideal for Connect Quest VPS clusters
- Helm charts simplify complex application deployments (WordPress, Prometheus)
- Kubernetes adds operational complexity — only use when Docker Compose is insufficient
- Managed K8s (EKS, GKE) removes control plane management burden
COMMON MISTAKES:
- Running K8s for single-server simple apps (Docker Compose is sufficient)
- Not setting resource limits (one pod can OOM the entire node)
- Storing sensitive data in plain ConfigMaps (use Secrets with encryption)
QUICK FIX:
Pod CrashLoopBackOff → kubectl logs pod-name --previous (see why last instance crashed)
Pod Pending → kubectl describe pod pod-name (usually insufficient resources or image pull error)
DIFFICULTY: Advanced
RELATED: Docker, CI/CD, Cloud Hosting, DevOps
DETAILED EXPLANATION:
Docker Compose manages containers on a single host. Kubernetes manages containers across many hosts (nodes), handling: automatic container placement across nodes, health monitoring and auto-restart, horizontal scaling (add replicas under load), rolling updates with zero downtime, service discovery and load balancing across pods.
K8s Architecture:
- Control Plane: API Server, etcd (state store), Scheduler, Controller Manager
- Worker Nodes: kubelet (agent), kube-proxy (networking), container runtime
- Pods: Smallest deployable unit (1+ containers sharing network/storage)
- Services: Stable DNS endpoints for pod groups
- Ingress: HTTP/HTTPS routing to services
WHEN TO USE:
- Application runs on 3+ servers
- You need auto-scaling based on CPU/memory metrics
- Zero-downtime deployments required
- SaaS platform with variable traffic
STEP-BY-STEP — Deploy app to Kubernetes (using kubectl):
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: LoadBalancer
# Apply
kubectl apply -f nginx-deployment.yaml
# Check pods
kubectl get pods
# Scale
kubectl scale deployment nginx-deployment --replicas=5
# Rolling update
kubectl set image deployment/nginx-deployment nginx=nginx:1.25
# Check rollout status
kubectl rollout status deployment/nginx-deployment
FLOW:
[ kubectl apply ] → API Server → Scheduler → [ Node 1: 1 pod ] + [ Node 2: 1 pod ] + [ Node 3: 1 pod ] → [ LoadBalancer Service ] → Users
KEY POINTS:
- k3s is a lightweight K8s distribution ideal for Connect Quest VPS clusters
- Helm charts simplify complex application deployments (WordPress, Prometheus)
- Kubernetes adds operational complexity — only use when Docker Compose is insufficient
- Managed K8s (EKS, GKE) removes control plane management burden
COMMON MISTAKES:
- Running K8s for single-server simple apps (Docker Compose is sufficient)
- Not setting resource limits (one pod can OOM the entire node)
- Storing sensitive data in plain ConfigMaps (use Secrets with encryption)
QUICK FIX:
Pod CrashLoopBackOff → kubectl logs pod-name --previous (see why last instance crashed)
Pod Pending → kubectl describe pod pod-name (usually insufficient resources or image pull error)
DIFFICULTY: Advanced
RELATED: Docker, CI/CD, Cloud Hosting, DevOps