Kind (Kubernetes in Docker) and Minikube are the two most popular ways to run Kubernetes locally. Kind runs Kubernetes nodes as Docker containers. Minikube runs a VM (or Docker containers) with a full Kubernetes installation.
Quick comparison
| Feature | Kind | Minikube |
|---|---|---|
| Runtime | Docker containers | VM (default), Docker, or Podman |
| Startup time | ~30 seconds | ~60-120 seconds |
| Multi-node | Yes (native) | Yes (experimental) |
| Kubernetes versions | Any (node images) | Any (ISO/images) |
| Load balancer | Manual (cloud-provider-kind) | minikube tunnel (built-in) |
| Ingress | Manual (NGINX/Contour) | minikube addons enable ingress |
| Dashboard | Not included | minikube dashboard |
| GPU support | No | Yes (NVIDIA passthrough) |
| Persistent storage | hostPath | hostPath + CSI drivers |
| CI/CD suitability | Excellent (fast, Docker-native) | Slower (VM overhead) |
| Memory usage | ~300 MB per node | ~900 MB+ (VM) |
Installation
# Kind
go install sigs.k8s.io/kind@latest
# or
brew install kind
# Minikube
brew install minikube
# or
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikubeCreating clusters
Kind
# Single node
kind create cluster
# Multi-node cluster
cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
EOF
# Specific Kubernetes version
kind create cluster --image kindest/node:v1.31.0
# Load local Docker images (no registry needed)
kind load docker-image myapp:latestMinikube
# Single node
minikube start
# Multi-node
minikube start --nodes 3
# Specific Kubernetes version
minikube start --kubernetes-version=v1.31.0
# Custom resources
minikube start --cpus 4 --memory 8192 --disk-size 50g
# Different driver
minikube start --driver=docker # or virtualbox, hyperkit, qemuCI/CD usage
Kind dominates in CI/CD pipelines because it is fast and Docker-native:
# GitHub Actions with Kind
- name: Create Kind cluster
uses: helm/kind-action@v1
with:
cluster_name: test-cluster
- name: Run tests against cluster
run: |
kubectl get nodes
helm install myapp ./charts/myapp
kubectl wait --for=condition=ready pod -l app=myapp --timeout=120sKind creates a cluster in 30 seconds in CI. Minikube takes 60-120 seconds and requires more setup.
Developer experience
Minikube advantages
Minikube is more developer-friendly for daily use:
# Built-in dashboard
minikube dashboard
# Built-in LoadBalancer support
minikube tunnel # assigns external IPs to LoadBalancer services
# Addons ecosystem
minikube addons list
minikube addons enable ingress
minikube addons enable metrics-server
minikube addons enable registry
# Access services directly
minikube service myapp --url
# Docker environment (build directly inside Minikube)
eval $(minikube docker-env)
docker build -t myapp . # Image is available to Kubernetes immediatelyKind advantages
Kind is simpler and closer to production:
# Extra port mappings for host access
cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 30000
hostPort: 80
protocol: TCP
EOF
# Load images without a registry
docker build -t myapp .
kind load docker-image myapp:latest
# Multiple clusters simultaneously
kind create cluster --name dev
kind create cluster --name staging
kind get clustersResource usage
| Configuration | Kind (1 node) | Kind (3 nodes) | Minikube (VM) | Minikube (Docker) |
|---|---|---|---|---|
| RAM idle | ~300 MB | ~900 MB | ~900 MB | ~500 MB |
| RAM under load | ~500 MB | ~1.5 GB | ~1.5 GB | ~1 GB |
| Disk | ~1 GB | ~3 GB | ~5 GB | ~2 GB |
| Startup | ~30s | ~45s | ~90s | ~60s |
Decision guide
Choose Kind when:
- CI/CD β fast startup, Docker-native, minimal overhead
- You need multi-node clusters for testing HA, anti-affinity, or node selectors
- You want to run multiple clusters simultaneously
- You are testing Kubernetes controllers or operators
- Speed matters β 30 seconds vs 90 seconds adds up
Choose Minikube when:
- Daily development β dashboard, tunnel, addons make life easier
- You need GPU passthrough for AI/ML development
- You want built-in LoadBalancer and ingress without extra setup
- You prefer addons (one command to enable ingress, metrics, registry)
- You need a Docker environment inside the cluster (
eval $(minikube docker-env))
Also consider
- K3s β runs on bare metal, production-grade, 512 MB RAM
- K3d β K3s in Docker (similar to Kind but uses K3s)
- Docker Desktop Kubernetes β one-click, but resource-heavy