Faster inner-loop Kubernetes: use a local registry with kind and Minikube

When you’re iterating on a service, waiting for image pushes and slow pulls is the opposite of flow. Running a local registry so your cluster can pull images directly (or letting the cluster reuse images you’ve already built) makes the inner loop feel like a live jam instead of a slow rehearsal. Below I explain the two common patterns for local development: how kind integrates with a local registry, and how Minikube provides several options (image load, registry addons, and docker-env). Practical examples and the important gotchas are included.

Why a local registry?

Kind: connect a local registry to the cluster

Minimal example (inspired by the kind docs)

# create a local registry container
docker run -d --restart=always -p "127.0.0.1:5001:5000" --name kind-registry registry:2

# create a kind cluster that uses containerd's certs dir (modern kind may not require the patch)
cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
containerdConfigPatches:
- |-
  [plugins."io.containerd.grpc.v1.cri".registry]
    config_path = "/etc/containerd/certs.d"
EOF

After the cluster is up, tag your image and push:

docker tag my-app:dev localhost:5001/my-app:dev
docker push localhost:5001/my-app:dev
kubectl create deployment my-app --image=localhost:5001/my-app:dev

kind’s documentation also includes the detail that code running inside pods that needs to reach the registry should use the registry container’s name directly (e.g., kind-registry:5000) because the containerd mapping is host/node scoped. That nuance explains a lot of “it works on my host but not in the pod” mysteries. (kind.sigs.k8s.io)

Minikube: three practical patterns Minikube is flexible, and there are three common patterns for getting local images into the cluster:

1) minikube image load

2) Use the built-in registry addon (or registry-creds)

3) Build directly into Minikube’s Docker environment (docker-env)

Important image-pull gotchas (applies to both kind and Minikube)

Example deployment snippet

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello
spec:
  replicas: 1
  template:
    spec:
      containers:
      - name: hello
        image: localhost:5001/hello:dev
        imagePullPolicy: IfNotPresent

Tradeoffs and when to pick which

Closing note — a practical mindset Think of the registry like a practice amp on stage: small and local gets you loud feedback quickly. Use tags (not :latest), set pull policies deliberately, and pick the integration pattern that matches whether you need repeatable CI behavior (kind + registry) or the fastest local iteration (minikube image load / docker-env). The official kind and Minikube docs have ready-made examples and scripts that work across platforms — they’re a helpful reference while you wire your loop. (kind.sigs.k8s.io)