Creating an EKS cluster using eksctl
Tags: aws, kubernetes
Published: 2022-10-19 14:52:30

In this article, we are going to create an EKS cluster using eksctl.

From the official documentation, Amazon Elastic Kubernetes Service (EKS) is a managed Kubernetes service to run Kubernetes in the AWS cloud. In the cloud, Amazon EKS automatically manages the availability and scalability of the Kubernetes control plane nodes responsible for scheduling containers, managing application availability, storing cluster data, and other key tasks. With Amazon EKS, you can take advantage of all the performance, scale, reliability, and availability of AWS infrastructure, as well as integrations with AWS networking and security services.

Refer: https://aws.amazon.com/eks/

eksctl is the official CLI for Amazon EKS. It is a simple CLI tool for creating and managing clusters on EKS - Amazon's managed Kubernetes service for EC2. It is written in Go, uses CloudFormation, was created by Weaveworks.

Refer: https://eksctl.io/

Please note that the Linux distribution used here to setup the local environment is Ubuntu 20.04.

---

Install the prerequisite tools.

```
$ sudo apt update

$ sudo apt install curl unzip
```

Download and install AWS CLI.

```
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

$ unzip awscliv2.zip

$ ./aws/install -i /usr/local/aws-cli -b /usr/local/bin

$ aws --version
```

Download and install eksctl.

```
$ curl --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C $PWD

$ sudo install eksctl /usr/local/bin/eksctl

$ eksctl version
```

Download and install kubectl.

```
$ curl -LO https://dl.k8s.io/release/v1.23.7/bin/linux/amd64/kubectl

$ sudo install kubectl /usr/local/bin/kubectl

$ kubectl version --client
```

Configure AWS CLI with access key, secret key, region and output format.

```
$ aws configure
AWS Access Key ID [None]: xxxxxx
AWS Secret Access Key [None]: xxxxxx
Default region name [None]: us-east-1
Default output format [None]: yaml
```

Create the cluster using the below configuration file.
The cluster creation will take around 15 minutes to complete.

```
$ cat dev-eks.yml
```

```
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: dev-cluster
  region: us-east-1
  version: "1.23"

vpc:
  cidr: 10.0.0.0/16

managedNodeGroups:
- name: dev-node
  amiFamily: Ubuntu2004
  instanceType: t3.micro
  desiredCapacity: 2
```

```
$ eksctl create cluster -f dev-eks.yml
```

When you execute the above cluster creation command, it will uses CloudFormation in the backend to create the necessary resources. In the image below, you can see two CloudFormation Stacks are created for provisioning control plane and node group.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/scqg0tcm78q5tfqxi46u.png)

We can see our cluster status in EKS console, it is active and all the nodes are in the ready state.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9rreanow5aqtilc69vsd.png)

Connect to our cluster for deploying our workloads.

```
$ aws eks --region us-east-1 update-kubeconfig --name dev-cluster

$ kubectl get nodes
NAME                          STATUS   ROLES    AGE   VERSION
ip-10-0-26-165.ec2.internal   Ready    <none>   18m   v1.23.7
ip-10-0-34-91.ec2.internal    Ready    <none>   18m   v1.23.7
```

Create an Nginx pod and check it's status.

```
$ kubectl run nginx --image=nginx:1.23 --port 80
pod/nginx created

$ kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          64s
```

Expose the Nginx pod to a LoadBalancer service.

```
$ kubectl expose pod nginx --name=nginx-lb --port=80 --target-port=80 --type=LoadBalancer
service/nginx-lb exposed

$ kubectl get svc
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP                                                              PORT(S)        AGE
kubernetes   ClusterIP      172.20.0.1     <none>                                                                   443/TCP        35m
nginx-lb     LoadBalancer   172.20.61.15   a9afa907a47bb4ec3b77cb2d59663b49-598454773.us-east-1.elb.amazonaws.com   80:32165/TCP   41s
```

Copy the URL found in the EXTERNAL-IP section and verify it in a browser.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q4dst0ho63wapv17vldl.png)

We can also delete our cluster using eksctl command.

```
$ eksctl delete cluster -f dev-eks.yml --wait
```

That's all for now, thank you!