7. Minikube Local Development#
flowchart TB
subgraph Host["Host Machine"]
MK[minikube CLI]
KC[kubectl]
end
subgraph VM["Minikube VM / Container"]
CP[Control Plane]
W[Worker]
CP --> ETCD[(etcd)]
CP --> API[API Server]
W --> KL[kubelet]
W --> CR[containerd]
CR --> P1[Pod]
CR --> P2[Pod]
end
MK --> VM
KC --> API
Installation#
# macOS
brew install minikube
# Linux (amd64)
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# Verify
minikube version
Cluster Management#
# Start with default driver (auto-detect)
minikube start
# Start with specific driver and resources
minikube start --driver=docker --cpus=4 --memory=8192 --disk-size=40g
# Start with specific K8s version
minikube start --kubernetes-version=v1.29.0
# Multi-node cluster
minikube start --nodes=3
# Stop cluster (preserves state)
minikube stop
# Delete cluster
minikube delete
# Delete all clusters and profiles
minikube delete --all --purge
# Status
minikube status
# SSH into node
minikube ssh
Driver Options#
Driver |
Platform |
Notes |
|---|---|---|
|
All |
Recommended, runs K8s in Docker containers |
|
macOS |
Lightweight hypervisor |
|
All |
Cross-platform VM |
|
Linux/macOS |
KVM-based |
|
Linux |
Runs directly on host (requires root) |
Addons#
# List available addons
minikube addons list
# Enable essential addons
minikube addons enable dashboard
minikube addons enable ingress
minikube addons enable metrics-server
minikube addons enable registry
# Open dashboard
minikube dashboard
# Disable addon
minikube addons disable dashboard
Accessing Services#
# Get service URL
minikube service myapp --url
# Open service in browser
minikube service myapp
# Tunnel for LoadBalancer services
minikube tunnel
# (runs in foreground, assigns external IPs to LoadBalancer services)
# Port forward (alternative)
kubectl port-forward svc/myapp 8080:80
Using Local Docker Images#
# Point shell to minikube's Docker daemon
eval $(minikube docker-env)
# Build image (now available inside minikube)
docker build -t myapp:dev .
# Use in K8s (set imagePullPolicy: Never)
kubectl run myapp --image=myapp:dev --image-pull-policy=Never
# Reset Docker env
eval $(minikube docker-env -u)
Resource Configuration#
# View current config
minikube config view
# Set defaults
minikube config set cpus 4
minikube config set memory 8192
minikube config set driver docker
Alternatives Comparison#
Tool |
Nodes |
Speed |
Resource Usage |
Best For |
|---|---|---|---|---|
minikube |
1-N |
Medium |
Medium |
General local dev |
kind |
1-N |
Fast |
Low |
CI/CD, testing |
k3d |
1-N |
Fast |
Low |
Lightweight, edge |
Docker Desktop |
1 |
Slow |
High |
Docker + K8s combo |
kind (Kubernetes IN Docker)#
# Install
brew install kind
# Create cluster
kind create cluster --name dev
# Create 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
# Load local image
kind load docker-image myapp:dev --name dev
# Delete
kind delete cluster --name dev
k3d (k3s in Docker)#
# Install
brew install k3d
# Create cluster
k3d cluster create dev --servers 1 --agents 2 -p "8080:80@loadbalancer"
# Import image
k3d image import myapp:dev -c dev
# Delete
k3d cluster delete dev