Use kind to install different Kubernetes version
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.
Introduction
With kind, the Kubernetes version comes from the node image you choose when creating the cluster. You do not typically "upgrade" the version inside an existing kind cluster. Instead, you create a cluster with the specific kindest/node image tag that matches the Kubernetes release you want to test.
Pick the Kubernetes Version Through the Node Image
A basic cluster using a specific Kubernetes release looks like this:
That command tells kind which node image to boot. The Kubernetes version inside the cluster comes from that image tag.
You can verify the server version afterward:
If you want multiple versions side by side, create multiple named clusters:
That is one of the main advantages of kind: fast, disposable version-specific clusters for testing.
Use a Config File for Multi-Node Clusters
If you want a specific version plus a predictable topology, combine the node image with a cluster config file:
Then create the cluster:
This is useful for testing scheduling behavior, upgrades across environments, or compatibility with a specific Kubernetes minor release.
Do Not Assume Every Version Works with Every kind Release
kind is built around versioned node images, and support is tied to what the project publishes. The safest approach is:
- install a recent
kindrelease - use
kindest/nodeimage tags published by the project - check release notes when using older or unusual Kubernetes versions
If you pick an arbitrary image tag that is not published or not compatible with your kind version, cluster creation may fail or behave unpredictably.
Recreate Instead of Mutating In Place
Unlike a managed Kubernetes environment, kind is meant to be disposable. If you want to switch versions, delete and recreate the cluster:
That workflow is normal. Trying to treat a local kind cluster like a long-lived environment usually creates more friction than value.
Useful Testing Pattern
A practical version-compatibility check might look like this:
Now you can compare whether your manifests, controllers, or admission policies behave consistently across versions.
Common Pitfalls
The biggest pitfall is assuming kind has a flag like --kubernetes-version separate from the node image. In practice, the image tag is the version selector.
Another mistake is trying to change the version of an existing cluster in place. For kind, recreation is the normal path.
Teams also sometimes forget the kubectl context name. A cluster created with --name demo uses the context kind-demo, not just demo.
Finally, be careful with old blog posts that reference outdated image tags. Use image versions published by the kind project rather than guessing.
Summary
- In
kind, the Kubernetes version is chosen through thekindest/nodeimage tag. - Create clusters with
kind create cluster --image ...for the version you want. - Use named clusters and config files to test multiple versions and topologies.
- Recreate clusters to change versions instead of mutating them in place.
- Prefer published, supported node images that match your
kindrelease.
Related reading
- Use Prometheus operator with DB volume for k8s
- Use relative paths in Kubernetes config
- Use sub directory with kubernetes gitRepo volume mounts
- Using --sort-by with kubectl get pods --all-namespaces to sort by both namespace AND name doesn't work
- Use of Supervisor in docker
- Use private docker registry with Authentication in Jenkinsfile
- Use terraform to set up a lambda function triggered by a scheduled event source
- Using aws cli, what is best way to determine the current region

System Design Fundamentals
Build a strong foundation in designing scalable, reliable distributed systems.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.