👋 Hey there! I’m Sarvar, a Cloud Architect passionate about cutting-edge technologies. With years of experience in Cloud Operations (Azure and AWS), Data Operations, Data Analytics, and DevOps, I've had the privilege of working with clients around the globe, delivering top-notch results. I’m always exploring the latest tech trends and love sharing what I learn along the way. Let’s dive into the world of cloud and tech together! 🚀
Important Note: This tutorial is not intended for production-grade deployment. Instead, it’s designed for beginners who want to start their EKS journey and become familiar with the basics of EKS and eksctl.
In this article, we're going to spin up an Amazon EKS cluster in minutes using simple commands from the command line. We’ll start by configuring our AWS credentials for secure access. To do this, we’ll create a new IAM user with sufficient permissions to manage EKS and EC2 resources and use that user's credentials to configure the AWS CLI. With the setup ready, we'll use VS Code and Git Bash (or any Linux CLI) to deploy our EKS cluster in two ways:
- Imperative Approach: Running eksctl commands directly in the CLI to configure and launch the cluster step-by-step, ideal for quick experimentation.
- Declarative Approach: Using a YAML configuration file to specify all the cluster details, making it easy to manage, replicate, and modify settings.
If you need to install eksctl
, awscli
, and kubectl
, please refer to this guide. The guide provides quick and easy steps to install the necessary CLI tools for this tutorial, taking only a few minutes to complete.
All the code and commands for this tutorial are available in my GitHub repository. Feel free to fork or download the code from this repo to get started!
Imperative Approach:
Using eksctl commands directly in the command line (e.g., eksctl create cluster --name my-cluster) represents an imperative approach to EKS deployment. In this style, you issue specific commands to make changes immediately, step by step. This method is ideal for quick, one-time actions or immediate adjustments to your EKS environment but may lack the consistency and version control offered by declarative methods.
Here's the same configuration translated into a series of eksctl
command-line commands. While using the command line, certain features may require additional configuration files (like JSON for IAM roles or Fargate profiles), but you can still achieve much of the setup directly.
Step-by-Step Command-Line Setup
1. Create the Cluster:
Using following command we will creating the EKS cluster control plane.
eksctl create cluster \
--name=dev-eks-cluster \
--region=us-east-1 \
--zones=us-east-1a,us-east-1b \
--without-nodegroup
2. List available EKS Cluster:
To List out existing cluster use following command.
eksctl get cluster
3. Enable IAM OIDC Provider for EKS Clusters:
Why It Required? IAM OIDC provider for EKS clusters allows Kubernetes pods to assume IAM roles via OIDC authentication, enabling secure access to AWS services without static credentials.
eksctl utils associate-iam-oidc-provider \
--region region-code \
--cluster <cluter-name> \
--approve
#Updated
eksctl utils associate-iam-oidc-provider \
--region us-east-1 \
--cluster dev-eks-cluster \
--approve
4. Create On-Demand Instance Node Group:
Not Recommended Create & Associate On-Demand Managed Nodes for the EKS Cluster
eksctl create nodegroup \
--cluster dev-eks-cluster \
--name on-demand-ng \
--instance-types t2.micro,t2.small \
--nodes 2 \
--nodes-min 1 \
--nodes-max 5 \
--node-volume-size 20 \
--node-volume-type gp3 \
--ssh-access \
--ssh-public-key test \
--managed \
--alb-ingress-access \
--asg-access \
--full-ecr-access
OR
4. Create On-Demand Instance Node Group:
*Highly Recommended * Cost saving option it will provision Spot instances for Managed Node group.
eksctl create nodegroup \
--cluster dev-eks-cluster \
--name spot-ng \
--instance-types t2.micro,t2.small \
--nodes 2 \
--nodes-min 1 \
--nodes-max 5 \
--node-volume-size 20 \
--node-volume-type gp3 \
--ssh-access \
--ssh-public-key test \
--managed \
--spot \
--alb-ingress-access \
--asg-access \
--full-ecr-access
5. List Associated Nodegroups with EKS Cluster:
eksctl get nodegroup --cluster=<clusterName>
#Updated
eksctl get nodegroup --cluster=dev-eks-cluster
6. Delete EKS Cluster:
eksctl delete cluster <clusterName>
#Updated
eksctl delete cluster dev-eks-cluster
Declarative Approach:
By defining EKS configurations in a YAML file (e.g., eksctl create cluster -f eks-cluster-config.yaml), you adopt a declarative approach. Here, you specify the desired end state of your cluster, detailing resources like node groups and networking. eksctl then ensures your cluster matches this configuration, making it easy to manage, version, and reproduce environments, especially for complex or production deployments. You can further customize this YAML configuration to add more features and tailor it to your specific needs. Here are some additional options you might consider:
Let's break down the configuration into sections for easier understanding, and then I’ll provide the full YAML file at the end.
1. Cluster Metadata
This section defines the basic settings for the EKS cluster itself, including the name, region, and Kubernetes version.
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: dev-eks-cluster
region: us-east-1
version: "1.24" # Change it if needed
2. VPC Configuration
Here we configure the subnets in which the cluster will operate. In this example, we’re defining public subnets in two availability zones.
vpc:
id: "vpc-xxxxxxx" # Put Your VPC Details
subnets:
public:
us-east-1a:
id: "subnet-xxxxxxx"
us-east-1b:
id: "subnet-xxxxxxx"
us-east-1c:
id: "subnet-xxxxxxx"
3. On-Demand Node Group
This node group uses on-demand instances, which provide consistent, always-available compute resources. It includes common settings for desired capacity, volume size, SSH access, and IAM permissions.
managedNodeGroups:
- name: on-demand-ng
instanceType: t3.medium # Change it as needed
desiredCapacity: 2
minSize: 1
maxSize: 5
volumeSize: 20
volumeType: gp3
ssh:
allow: true
publicKeyName: your-keypair # Put your Key pair name
labels:
lifecycle: on-demand
workload: general
tags:
Name: "on-demand-ng"
iam:
withAddonPolicies:
albIngress: true
autoScaler: true
imageBuilder: true
4. Spot Instance Node Group
This node group uses Spot instances, which are typically more cost-effective. Spot instances are suitable for fault-tolerant and stateless applications due to potential interruptions.
- name: spot-ng
instanceTypes: ["t3.small", "t3.micro"] # Change it as needed
desiredCapacity: 2
minSize: 1
maxSize: 5
volumeSize: 20
volumeType: gp3
ssh:
allow: true
publicKeyName: your-keypair # Your key pair name
labels:
lifecycle: spot
workload: batch
tags:
Name: "spot-ng"
iam:
withAddonPolicies:
albIngress: true
autoScaler: true
imageBuilder: true
spot: true # Spot instances
Full YAML Configuration
Here’s the complete configuration, combining all sections:
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: dev-eks-cluster
region: us-east-1
version: "1.24"
vpc:
id: "vpc-xxxxxxx"
subnets:
public:
us-east-1a:
id: "subnet-xxxxxxx"
us-east-1b:
id: "subnet-xxxxxxx"
us-east-1c:
id: "subnet-xxxxxxx"
managedNodeGroups:
- name: on-demand-ng
instanceType: t3.medium
desiredCapacity: 2
minSize: 1
maxSize: 5
volumeSize: 20
volumeType: gp3
ssh:
allow: true
publicKeyName: your-keypair
labels:
lifecycle: on-demand
workload: general
tags:
Name: "on-demand-ng"
iam:
withAddonPolicies:
albIngress: true
autoScaler: true
imageBuilder: true
- name: spot-ng
instanceTypes: ["t3.small", "t3.micro"]
desiredCapacity: 2
minSize: 1
maxSize: 5
volumeSize: 20
volumeType: gp3
ssh:
allow: true
publicKeyName: your-keypair
labels:
lifecycle: spot
workload: batch
tags:
Name: "spot-ng"
iam:
withAddonPolicies:
albIngress: true
autoScaler: true
imageBuilder: true
spot: true
Using the YAML Configuration
To create the cluster with both on-demand and Spot instance node groups, save this configuration as cluster-config.yaml
and run:
eksctl create cluster -f eks-cluster-config.yaml
eksctl get cluster
List Associated Nodegroups with EKS Cluster:
eksctl get nodegroup --cluster=<clusterName>
#Updated
eksctl get nodegroup --cluster=dev-eks-cluster
This configuration will set up an EKS cluster in us-east-1
with an on-demand node group (on-demand-ng
) and a Spot instance node group (spot-ng
). Adjust instance types, labels, and other properties as needed to suit your environment.
To delete an Amazon EKS cluster created with eksctl
, you can use the following command:
eksctl delete cluster --name dev-eks-cluster --region us-east-1
Additional Notes
- This command will delete the EKS cluster, associated node groups, and the underlying infrastructure (such as VPC and subnets) if they were created by
eksctl
during cluster creation. - If the cluster was set up with an existing VPC and subnets,
eksctl
will only delete the cluster resources created byeksctl
and will leave the existing VPC and subnets intact. - At this time, there is no direct way to include the IAM OIDC provider setting within the eksctl YAML configuration file itself. The recommended approach is to run it as a separate command after your cluster is created.
Conclusion: Using tools like
eksctl
speeds up the process, and Amazon EKS makes it easy to deploy and manage Kubernetes clusters on AWS. With just a few commands, we were able to create a functional EKS cluster both declaratively and imperatively, each with its own advantages. For people who are new to EKS, this easy setup offers a fantastic place to start. But keep in mind that this guide is intended mainly for learning purposes, even though it covers the fundamentals of building an EKS cluster. Additional security settings, configurations, and administration procedures would be required for a dependable and secure cluster in production. Armed with these abilities, you may now begin investigating Kubernetes on AWS for testing, development, or just to learn more about cloud-based container orchestration!
— — — — — — — —
Here is the End!
✨ Thank you for reading! ✨ I hope this article helped simplify the process and gave you valuable insights. As I continue to explore the ever-evolving world of technology, I’m excited to share more guides, tips, and updates with you. 🚀 Stay tuned for more content that breaks down complex concepts and makes them easier to grasp. Let’s keep learning and growing together! 💡