kind cluster - how to see docker-images that are loaded?
Master System Design with Codemia
Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.
Introduction
Kind (Kubernetes IN Docker) runs Kubernetes clusters using Docker containers as nodes. Since Kind nodes are Docker containers themselves, images loaded into a Kind cluster are not visible with docker images on the host. To see images inside a Kind cluster, use docker exec to run crictl images inside the node container, or use kind load docker-image to load local images and then verify with crictl. Understanding this separation between the host Docker daemon and the Kind node's container runtime is key to debugging image pull issues.
Loading Images into Kind
Kind nodes use containerd as their container runtime, not the host's Docker daemon. You must explicitly load images from the host into the cluster:
After loading, the image is available inside the Kind node's containerd storage, and Kubernetes can pull it with imagePullPolicy: Never or imagePullPolicy: IfNotPresent.
Viewing Images Inside a Kind Cluster
Method 1: crictl images (Recommended)
Method 2: ctr (containerd CLI)
Method 3: kubectl (Indirect)
Loading from a tar Archive
If you have images saved as tar files:
This is useful in CI/CD pipelines where images are built in one step and loaded in another.
Kubernetes Deployment with Local Images
When using locally loaded images, set imagePullPolicy to avoid pulling from a remote registry:
If you omit imagePullPolicy: Never, Kubernetes defaults to Always for :latest tags, causing ErrImagePull since the image is not in any remote registry.
Using a Local Registry Instead
For development workflows with frequent image changes, a local registry avoids repeated kind load:
Multi-Node Clusters
In multi-node Kind clusters, kind load docker-image loads the image into all nodes:
Common Pitfalls
- Running
docker imageson the host to find Kind images: Images loaded into Kind are stored inside the node container's containerd, not the host Docker daemon. Usedocker exec <node> crictl imagesto list them. - Forgetting
imagePullPolicy: Neverfor local images: Kubernetes defaults toimagePullPolicy: Alwaysfor:latesttags. WithoutNeverorIfNotPresent, Kubernetes tries to pull from a remote registry and fails withErrImagePull. - Loading images before the cluster is created:
kind load docker-imagerequires a running cluster. Create the cluster withkind create clusterfirst, then load images. - Image name mismatch between load and deployment: The image name in
kind load docker-image my-app:v1must exactly match theimage:field in the Kubernetes manifest, including the tag. A mismatch causesImagePullBackOff. - Not rebuilding before reloading:
kind load docker-imageloads the current image from the host Docker daemon. If you change code, you mustdocker buildagain before runningkind load— it does not automatically rebuild.
Summary
- Use
kind load docker-image <name>to load local Docker images into a Kind cluster - View loaded images with
docker exec -it <node-name> crictl images - Set
imagePullPolicy: Neverin Kubernetes manifests for locally loaded images - Use
kind load image-archivefor tar-based image loading in CI/CD pipelines - For frequent development cycles, set up a local Docker registry connected to the Kind network

