Skip to main content

Command Palette

Search for a command to run...

Creating Kubernetes Cluster Using Kind on local computer

Learning Kubernetes

Published
4 min read
Creating Kubernetes Cluster Using Kind on local computer
R

I am a Lead Engineer from India. Love to blog about serverless and help teams design and develop serverless architecture. An AWS cloud practitioner. Blogs about AWS Services utilising AWS CDK, CloudFormation, Terraform.

Kubernetes is an open-source tool for automating deployment, scaling, and management of containerized applications.

Developers push the code multiple times a day. Packaging our applications as containers, enables our application to be updated multiple times without downtime. Kubernetes helps us to run the containerized applications.

We can create a Kubernetes cluster in our local computer by using tools such as minikube and kind. In this blog, we will look into the Kind.

Prerequisite:

  • Docker

Tools :

  • kubectl - A Kubernetes command-line tool that allows us to run commands against Kubernetes clusters. We can deploy applications, inspect and monitor the cluster resources, and view logs using kubectl.

  • kind - It is a tool that lets us run the Kubernetes cluster on our local computer.

Install Kubectl

  1. macOS

  2. Windows

Install Kind

macOS

$brew install kind

Windows

$curl.exe -Lo kind-windows-amd64.exe https://kind.sigs.k8s.io/dl/v0.11.1/kind-windows-amd64
$Move-Item .\kind-windows-amd64.exe c:\some-dir-in-your-PATH\kind.exe

Create a Kubernetes cluster

Once kind is installed, create a kubernetes cluster using the command

$kind create cluster --name learning-kubernetes-dev

When the cluster is created, the cluster configuration file is stored at the location ${home}/.kube/config

We can create multiple kubernetes clusters. Let us define one more cluster for production

$kind create cluster --name learning-kubernetes-prod

To verify, if the cluster has been created, issue the below command.

$kind get clusters

learning-kubernetes-dev
learning-kubernetes-prod

To interact with a particular cluster, we need to specify the kind-<cluster-name> as a context in kubectl as shown below.

$kubectl cluster-info --context kind-learning-kubernetes-dev
Kubernetes control plane is running at https://127.0.0.1:52083
CoreDNS is running at https://127.0.0.1:52083/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

➜  $kubectl cluster-info --context kind-learning-kubernetes-prod
Kubernetes control plane is running at https://127.0.0.1:52449
CoreDNS is running at https://127.0.0.1:52449/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To verify which context is currently used, we can issue the below command.

$kubectl config get-contexts

CURRENT   NAME                            CLUSTER                         AUTHINFO                        NAMESPACE
          kind-learning-kubernetes-dev    kind-learning-kubernetes-dev    kind-learning-kubernetes-dev
*         kind-learning-kubernetes-prod   kind-learning-kubernetes-prod   kind-learning-kubernetes-prod

The indicates the current cluster. So the current cluster context is *kind-learning-kubernetes-prod

To switch between the clusters, we can issue the below command.

$kubectl config use-context kind-learning-kubernetes-dev

Switched to context "kind-learning-kubernetes-dev"

Let us verify again, this time, the current context is kind-learning-kubernetes-dev

$kubectl config get-contexts
CURRENT   NAME                            CLUSTER                         AUTHINFO                        NAMESPACE
*         kind-learning-kubernetes-dev    kind-learning-kubernetes-dev    kind-learning-kubernetes-dev
          kind-learning-kubernetes-prod   kind-learning-kubernetes-prod   kind-learning-kubernetes-prod

Namespace

The virtual clusters which are created within the physical cluster are called namespaces. If we have multiple teams/projects, we can use the same cluster, but for each team/project, we can define the namespaces.

If we do not define any namespaces, then we get a default namespace. We can use the below command to see the namespaces.

kubectl get namespaces

NAME                 STATUS   AGE
default              Active   23m

Create a namespace

We can define multiple namespaces in kubernetes clusters. In our learning-kubernetes-dev, we can have two namespaces. One is used by team-1 and the other is used by team-2.

Let's first switch the context to create a namespace in the learning-kubernetes-dev cluster

$kubectl config use-context kind-learning-kubernetes-dev

create a file called team1-namespace.json with the below content.

{
  "apiVersion": "v1",
  "kind": "Namespace",
  "metadata": {
    "name": "team-1",
    "labels": {
      "name": "team-1"
    }
  }
}

Use the below command to create a namespace.

$kubectl create -f team1-namespace.json

namespace/team-1 created

create a file called team2-namespace.json with the below content.

{
  "apiVersion": "v1",
  "kind": "Namespace",
  "metadata": {
    "name": "team-2",
    "labels": {
      "name": "team-2"
    }
  }
}

Use the below command to create a namespace.

$kubectl create -f team2-namespace.json

namespace/team-2 created

Use the below command to verify the namespaces.

$kubectl get namespace

NAME                 STATUS   AGE
default              Active   44m
team-1               Active   2m13s
team-2               Active   18s

Create a Pod in a Namespace

A Kubernetes namespace provides the scope for Pods, Services, and Deployments in the cluster.

let's create a simple Deployment and Pods for both Team-1 and Team-2 namespace. Team-1 needs an NGINX server of 1 instance and Team-2 needs 2 instances.

$kubectl create deployment nginx-team-1 --image nginx -n team-1 --replicas=1

deployment.apps/nginx-team-1 created
$kubectl create deployment nginx-team-2 --image nginx -n team-2 --replicas=2
deployment.apps/nginx-team-2 created

Let's verify the number of pods created for team-1 and team-2

kubectl get pods -n team-1

NAME                            READY   STATUS    RESTARTS   AGE
nginx-team-1-544dd7f5bd-qk5g6   1/1     Running   0          113s
kubectl get pods -n team-2

NAME                            READY   STATUS    RESTARTS   AGE
nginx-team-2-55f89d7667-2wd9n   1/1     Running   0          87s
nginx-team-2-55f89d7667-8xd95   1/1     Running   0          87s

Conclusion

In this blog post, we saw how easy it is to create a Kubernetes cluster in your local computer. Once installed, we can play with Kubernetes and it helps us learn about pods, deployments. We saw how to create a namespace so that we can use one cluster with multiple teams deploying applications on the same cluster.

GitHub Repository: https://github.com/rahulmlokurte/devops-stuff/tree/main/kubernetes/kubernetes-kind

This is just the starting point. Check out the below documents to get into the depth of Kubernetes.

  • https://kubernetes.io/
  • https://kind.sigs.k8s.io/docs/user/quick-start/
  • https://www.katacoda.com/courses/kubernetes/playground

More from this blog

R

Rahul Lokurte Blog

34 posts

I'm a Devops and Cloud Engineer with 10 years of experience designing and building applications using containers and serverless technologies. Love blogging about AWS