Kubernetes 105: Create Kubernetes Cluster
Let’s start again. Now we will do some practices.
In this part of the Kubernetes series, we will explore how to create a Kubernetes cluster in different environments. Whether you’re running Kubernetes locally or in the cloud, understanding how to set up a cluster is fundamental to deploying and managing containerized applications efficiently.
We will cover three different ways to create a Kubernetes cluster:
- Kind (Kubernetes in Docker) - A lightweight way to run Kubernetes clusters locally for testing and development.
- K3D (K3S in Docker) - A more lightweight Kubernetes distribution, optimized for local development and CI/CD workflows.
- EKS (Amazon Elastic Kubernetes Service) - A managed Kubernetes service provided by AWS for running Kubernetes workloads in the cloud.
Each approach has its own use cases, advantages, and trade-offs. Let’s dive into each one and see how to set up a cluster.
Setting Up a Kubernetes Cluster with Kind
Kind (Kubernetes in Docker) is one of the simplest ways to spin up a Kubernetes cluster for local development and testing. It runs Kubernetes clusters inside Docker containers and is widely used for CI/CD and development workflows.
Prerequisites
- Docker installed on your machine. (installation guide)
- KIND CLI installed. (installation guide)
- Kubectl CLI installed. (installation guide)
Create a Cluster with Kind
- Create a new Kind cluster:
$ kind create cluster --name kind-cluster
Creating cluster "kind-cluster" ... ✓ Ensuring node image (kindest/node:v1.31.0) 🖼 ✓ Preparing nodes 📦 ✓ Writing configuration 📜 ✓ Starting control-plane 🕹 ✓ Installing CNI 🔌 ✓ Installing StorageClass 💾Set kubectl context to "kind-kind-cluster"You can now use your cluster with:
kubectl cluster-info --context kind-kind-cluster
Thanks for using kind! 😊
- Check the cluster:
$ kubectl cluster-info --context kind-kind-cluster
Kubernetes control plane is running at https://127.0.0.1:43417CoreDNS is running at https://127.0.0.1:43417/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
- List available nodes:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSIONkind-cluster-control-plane Ready control-plane 75s v1.31.0
Create Simple Deployment
- Use the kubectl create deployment
command to define and start a deployment:
$ kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
- Check deployment status using kubectl get deployment
command:
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGEnginx 0/1 1 0 29s
- Expose the deployment:
$ kubectl expose deployment nginx --port=80 --type=LoadBalancer
service/nginx exposed
- Verify the Pod status and then try to access Nginx using your browser:
$ kubectl get pods
NAME READY STATUS RESTARTS AGEnginx-676b6c5bbc-wd87x 1/1 Running 0 12m
- Delete the cluster when no longer needed
$ kind delete cluster --name kind-cluster
Deleting cluster "kind-cluster" ...Deleted nodes: ["kind-cluster-control-plane"]
Setting Up a Kubernetes Cluster with K3D
K3D is a tool that allows you to run lightweight Kubernetes clusters using K3S inside Docker. It is a great choice for fast, local Kubernetes development.
Prerequisites
- Docker installed on your machine. (installation guide)
- K3D CLI installed. (installation guide)
- Kubectl CLI installed. (installation guide)
Create a Cluster with K3D
- Create a new K3D cluster:
$ k3d cluster create my-k3d-cluster
INFO[0000] Prep: NetworkINFO[0000] Created network 'k3d-my-k3d-cluster'INFO[0000] Created image volume k3d-my-k3d-cluster-imagesINFO[0000] Starting new tools node...INFO[0000] Starting node 'k3d-my-k3d-cluster-tools'INFO[0001] Creating node 'k3d-my-k3d-cluster-server-0'INFO[0001] Creating LoadBalancer 'k3d-my-k3d-cluster-serverlb'INFO[0001] Using the k3d-tools node to gather environment informationINFO[0001] HostIP: using network gateway 172.20.0.1 addressINFO[0001] Starting cluster 'my-k3d-cluster'INFO[0001] Starting servers...INFO[0001] Starting node 'k3d-my-k3d-cluster-server-0'INFO[0008] All agents already running.INFO[0008] Starting helpers...INFO[0008] Starting node 'k3d-my-k3d-cluster-serverlb'INFO[0016] Injecting records for hostAliases (incl. host.k3d.internal) and for 2 network members into CoreDNS configmap...INFO[0018] Cluster 'my-k3d-cluster' created successfully!INFO[0018] You can now use it like this:kubectl cluster-info
- Check the cluster status:
$ kubectl cluster-info
Kubernetes control plane is running at https://0.0.0.0:46503CoreDNS is running at https://0.0.0.0:46503/api/v1/namespaces/kube-system/services/kube-dns:dns/proxyMetrics-server is running at https://0.0.0.0:46503/api/v1/namespaces/kube-system/services/https:metrics-server:https/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
- List available nodes:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSIONk3d-my-k3d-cluster-server-0 Ready control-plane,master 2m33s v1.30.4+k3s1
Create Simple Deployment
- Use the kubectl create deployment
command to define and start a deployment:
$ kubectl create deployment httpd --image=httpd
- Check deployment status using kubectl get deployment
command:
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGEhttpd 0/1 1 0 45s
- Verify the Pod status:
$ kubectl get pods
NAME READY STATUS RESTARTS AGEhttpd-56f946b8c8-84ww8 1/1 Running 0 9m11s
- Expose the deployment:
$ kubectl expose deployment httpd --port=80 --type=LoadBalancer
- Try to access using browser:
- Delete the cluster when no longer needed:
$ k3d cluster delete my-k3d-cluster
INFO[0000] Deleting cluster 'my-k3d-cluster'INFO[0001] Deleting cluster network 'k3d-my-k3d-cluster'INFO[0001] Deleting 1 attached volumes...INFO[0001] Removing cluster details from default kubeconfig...INFO[0001] Removing standalone kubeconfig file (if there is one)...INFO[0001] Successfully deleted cluster my-k3d-cluster!
Setting Up a Kubernetes Cluster on AWS EKS
Amazon Elastic Kubernetes Service (EKS) is a fully managed Kubernetes service on AWS, designed for running production workloads.
Prerequisites
- AWS CLI installed and configured. (installation guide)
- EKSCTL CLI installed. (installation guide)
- Kubectl CLI installed. (installation guide)
Create a cluster on EKS
To create a Kubernetes cluster in AWS, you can use the AWS Console (dashboard) or the eksctl CLI. For this guide, we will use eksctl
.
We will provisions an EKS cluster with two t4g.small
nodes in the us-east-1
region, making it ready for running Kubernetes workloads.
$ eksctl create cluster \--name cluster-1 \--region us-east-1 \--node-type t4g.small \--nodes 2 \--nodegroup-name node-group-1
2025-02-01 19:52:35 [ℹ] eksctl version 0.202.02025-02-01 19:52:35 [ℹ] using region us-east-12025-02-01 19:52:37 [ℹ] setting availability zones to [us-east-1c us-east-1f]
...
2025-02-01 20:02:04 [ℹ] creating addon2025-02-01 20:02:04 [ℹ] successfully created addon2025-02-01 20:02:05 [ℹ] creating addon2025-02-01 20:02:06 [ℹ] successfully created addon2025-02-01 20:02:07 [ℹ] creating addon2025-02-01 20:02:07 [ℹ] successfully created addon"us-east-1" region is ready
- Access AWS console, navigate to the EKS service and you can see the cluster is successfully created.
- List available nodes:
kubectl get nodesNAME STATUS ROLES AGE VERSIONip-192-168-xx-yy.ec2.internal Ready <none> 17m v1.30.8-eks-aeac579ip-192-168-xx-yy.ec2.internal Ready <none> 17m v1.30.8-eks-aeac57
Create Simple Deployment
- Use the kubectl create deployment
command to define and start a deployment:
$ kubectl create deployment nginx --image=nginx
deployment.apps/nginx create
- Check deployment status using kubectl get deployment
command:
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGEnginx 1/1 1 1 23s
- Verify the Pod status:
$ kubectl get pods
NAME READY STATUS RESTARTS AGEnginx-bf5d5cf98-9dld5 1/1 Running 0 43s
- Expose the service:
$ kubectl expose deployment nginx --type=LoadBalancer --port=80 --name=nginx-service
- Try to access using the browser:
- Delete the cluster when no longer needed:
$ eksctl delete cluster --name cluster-1 --region us-east-1
2025-02-01 20:51:59 [ℹ] deleting EKS cluster "cluster-1"2025-02-01 20:52:02 [ℹ] will drain 0 unmanaged nodegroup(s) in cluster "cluster-1"2025-02-01 20:52:02 [ℹ] starting parallel draining, max in-flight of 12025-02-01 20:52:04 [ℹ] deleted 0 Fargate profile(s)2025-02-01 20:52:13 [✔] kubeconfig has been updated2025-02-01 20:52:13 [ℹ] cleaning up AWS load balancers created by Kubernetes objects of Kind Service or Ingress2025-02-01 20:52:56 [ℹ]...
2025-02-01 21:02:00 [ℹ] waiting for CloudFormation stack "eksctl-cluster-1-nodegroup-node-group-1"2025-02-01 21:02:01 [ℹ] will delete stack "eksctl-cluster-1-cluster"2025-02-01 21:02:04 [✔] all cluster resources were deleted
Conclusion
Setting up a Kubernetes cluster is the first step in running containerized applications at scale. In this guide, we’ve explored three different ways to create a Kubernetes cluster and do a simple deployment: using Kind and K3D for local development and using EKS for cloud-based deployments. Each method has its own advantages depending on your use case.
Thanks for reading this post. Stay tuned!
References:
- KUBERNETES UNTUK PEMULA. https://github.com/ngoprek-kubernetes/buku-kubernetes-pemula.
- How do I install AWS EKS CLI (eksctl)?. https://learn.arm.com/install-guides/eksctl