This document describes the steps to cut a new kind release. It is intended for maintainers who have push access to the upstream repository and the staging image registry.
- GNU sed (macOS:
brew install gnu-sed) - Docker with buildx support
craneinstalled (for image promotion to Docker Hub)- Push access to
github.com/kubernetes-sigs/kind - Push access to
gcr.io/k8s-staging-kind - Push access to
kindeston Docker Hub
Node images must be built, tested, and promoted to Docker Hub before the kind release so their digest hashes are known and can be embedded in the release binary.
Use hack/release/push-node.sh for Kubernetes v1.31 and later:
./hack/release/push-node.sh v1.35.0This builds amd64 and arm64 node images and pushes them to
gcr.io/k8s-staging-kind/node:v1.35.0, then creates a multi-arch manifest
list.
You can override the registry or add architectures:
REGISTRY=gcr.io/k8s-staging-kind ARCHES="amd64 arm64" ./hack/release/push-node.sh v1.35.0Update the default image in pkg/apis/config/defaults/image.go to point to the
staging image with its digest, then run CI to validate:
const Image = "gcr.io/k8s-staging-kind/node:v1.35.0@sha256:<digest-from-push>"Get the digest from the push output, or by inspecting the manifest:
crane digest gcr.io/k8s-staging-kind/node:v1.35.0Once testing passes, copy the image from staging to kindest/node on Docker Hub:
crane cp \
gcr.io/k8s-staging-kind/node:v1.35.0@sha256:<staging-digest> \
kindest/node:v1.35.0After promotion, retrieve the Docker Hub digest (it may differ from the staging digest):
crane digest kindest/node:v1.35.0Update pkg/apis/config/defaults/image.go with the promoted kindest/node
reference and its digest, then open a PR:
const Image = "kindest/node:v1.35.0@sha256:<dockerhub-digest>"- The default node image (
pkg/apis/config/defaults/image.go) should reference a promotedkindest/nodeimage, not a staging image. - All CI is green on
main. - The current alpha version in
pkg/cmd/kind/version/version.gomatches the version you are about to release (e.g.,versionCore = "0.31.0"withversionPreRelease = "alpha").
./hack/release/create.sh 0.31.0 0.32.0The two arguments are:
0.31.0- the version being released0.32.0- the next version (the script will create a0.32.0-alphapre-release)
The script will:
- Set
versionCore = "0.31.0"andversionPreRelease = ""inpkg/cmd/kind/version/version.go - Commit with message
version v0.31.0and tagv0.31.0 - Build cross-platform release binaries into
bin/:kind-linux-amd64,kind-linux-arm64kind-darwin-amd64,kind-darwin-arm64kind-windows-amd64.sha256sumfile for each binary
- Set
versionCore = "0.32.0"andversionPreRelease = "alpha" - Commit with message
version v0.32.0-alphaand tagv0.32.0-alpha
At the end the script prints follow-up instructions. Continue with the steps below.
git push origin HEADOpen a PR with the two version commits against main and wait for it to merge.
After the PR is merged, push both tags to the upstream repository:
git push https://github.com/kubernetes-sigs/kind.git v0.31.0
git push https://github.com/kubernetes-sigs/kind.git v0.32.0-alphaWhile the PR is merging or shortly after, generate the list of contributors since the previous release to include in the GitHub release notes:
LAST_VERSION_TAG=v0.30.0 GITHUB_OAUTH_TOKEN=<token> ./hack/release/get-contributors.shThe token is optional but avoids GitHub API rate limits. The output is a markdown-formatted bulleted list of GitHub usernames.
Go to https://github.com/kubernetes-sigs/kind/releases/new and:
- Select the tag
v0.31.0. - Set the title to
v0.31.0. - Write release notes summarizing changes since the previous release. Include the contributor list generated above.
- Upload the binaries from
bin/as release assets:kind-linux-amd64+kind-linux-amd64.sha256sumkind-linux-arm64+kind-linux-arm64.sha256sumkind-darwin-amd64+kind-darwin-amd64.sha256sumkind-darwin-arm64+kind-darwin-arm64.sha256sumkind-windows-amd64+kind-windows-amd64.sha256sum
- Publish the release.
After the GitHub release is published, update the documentation to reference the new stable version. This is typically done as a separate PR immediately after the release.
Replace all occurrences of the old version string (e.g., v0.30.0) with the
new one (v0.31.0). The README contains several hardcoded download URLs and
go install commands that need updating.
Update the stable parameter:
[params]
stable = "v0.31.0"This value is used by the {{< stableVersion >}} shortcode throughout the
website documentation, so this single change updates all version references on
the site.
Commit both files and open a PR. The commit message convention is:
bump docs to 0.31.0
- Build and push node image(s) to staging:
./hack/release/push-node.sh vX.Y.Z - Test with staging image in
pkg/apis/config/defaults/image.go - Promote to Docker Hub:
crane cp gcr.io/k8s-staging-kind/node:vX.Y.Z@sha256:... kindest/node:vX.Y.Z - Update
pkg/apis/config/defaults/image.goto promotedkindest/nodereference + merge PR
- Confirm
mainis green and default image is the promotedkindest/nodeimage - Run
./hack/release/create.sh <version> <next-version> - Open PR with the two version commits, wait for merge
- Push tags:
git push upstream v<version>andgit push upstream v<next-version>-alpha - Generate contributor list:
LAST_VERSION_TAG=v<prev-version> ./hack/release/get-contributors.sh - Create GitHub release from
v<version>tag, upload binaries frombin/
- Update
README.md- replace all old version references - Update
site/config.toml- setstable = "v<version>" - Open docs PR and merge