4 min read | by Jordi Prats
kind is a tool for runnint local Kubernetes clusters on Docker, just in the same way minikube can work (if configuring it to use docker). It was primarily designed for testing Kubernetes itself, but we can use it for local development or CI as well.
Taking a look at the releases page on GitHub, we'll find it available for both linux and Mac:
To spin up a new local cluster the syntax it's just the same you would use with minikube:
$ kind create cluster
Creating cluster "kind" ...
β Ensuring node image (kindest/node:v1.24.0) πΌ
β Preparing nodes π¦
β Writing configuration π
β Starting control-plane πΉοΈ
β Installing CNI π
β Installing StorageClass πΎ
Set kubectl context to "kind-kind"
You can now use your cluster with:
kubectl cluster-info --context kind-kind
Not sure what to do next? π
Check out https://kind.sigs.k8s.io/docs/user/quick-start/
Creating a container just as minikube do:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
kind-control-plane Ready control-plane 68s v1.24.0
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34e50a57f958 kindest/node:v1.24.0 "/usr/local/bin/entrβ¦" About a minute ago Up About a minute 127.0.0.1:63453->6443/tcp kind-control-plane
bb55273c8df0 kicbase/stable:v0.0.33 "/usr/local/bin/entrβ¦" 6 hours ago Up 6 hours 0.0.0.0:49162->22/tcp, :::49162->22/tcp, 0.0.0.0:49161->2376/tcp, :::49161->2376/tcp, 0.0.0.0:49160->5000/tcp, :::49160->5000/tcp, 0.0.0.0:49159->8443/tcp, :::49159->8443/tcp, 0.0.0.0:49158->32443/tcp, :::49158->32443/tcp minikube
We can delete it just as easy:
$ kind delete cluster
Deleting cluster "kind" ...
The big difference with minikube is that we can use a yaml manifest to configure the cluster, so for example, with the following manifest we can create a simulated two node cluster:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
We just need to use the --config option to set it:
$ kind create cluster --config clusterdef.yaml
Creating cluster "kind" ...
β Ensuring node image (kindest/node:v1.24.0) πΌ
β Preparing nodes π¦ π¦
β Writing configuration π
β Starting control-plane πΉοΈ
β Installing CNI π
β Installing StorageClass πΎ
β Joining worker nodes π
Set kubectl context to "kind-kind"
You can now use your cluster with:
kubectl cluster-info --context kind-kind
Not sure what to do next? π
Check out https://kind.sigs.k8s.io/docs/user/quick-start/
Once it finishes doing its thing, we'll be able to see the new worker node:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
kind-control-plane Ready control-plane 32s v1.24.0
kind-worker NotReady <none> 9s v1.24.0
We can rename it as well using the yaml definition:
$ cat clusterdef.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: kindest
nodes:
- role: control-plane
- role: worker
$ kind create cluster --config clusterdef.yaml
Creating cluster "kindest" ...
β Ensuring node image (kindest/node:v1.24.0) πΌ
β Preparing nodes π¦ π¦
β Writing configuration π
β Starting control-plane πΉοΈ
β Installing CNI π
β Installing StorageClass πΎ
β Joining worker nodes π
Set kubectl context to "kind-kindest"
You can now use your cluster with:
kubectl cluster-info --context kind-kindest
Have a nice day! π
There are other options we can configure using this definition, we just need to check kind's documentation.
The only thing I find annoying is the fact that it uses .name instead of .metadata.name that you would expect on any kubernetes object (although it's not a kubernetes object)
$ kind create cluster --config clusterdef.yaml
ERROR: failed to create cluster: unable to decode config: yaml: unmarshal errors:
line 3: field metadata not found in type v1alpha4.Cluster
Posted on 29/09/2021