Kokil Thapa - Professional Web Developer in Nepal
Freelancer Web Developer in Nepal with 15+ Years of Experience

Kokil Thapa is an experienced full-stack web developer focused on building fast, secure, and scalable web applications. He helps businesses and individuals create SEO-friendly, user-focused digital platforms designed for long-term growth.

Amazon EKS: A Practical Guide

By Kokil Thapa | Last reviewed: September 2026

Most teams reach for Kubernetes when one monolith no longer fits, but self-managing the control plane is a full-time job. Amazon EKS: A Practical Guide exists because managed Kubernetes on AWS trades that operational burden for a predictable monthly bill and AWS-native integrations. If you already run Laravel, APIs, or microservices on EC2 or Amazon ECS with Fargate, EKS is the path when you need portable workloads, Helm charts, and a standard kubectl workflow. This page walks through architecture, first-cluster setup, networking, IAM, and the production decisions that actually matter.

What is Amazon EKS and how does the architecture work?

Amazon Elastic Kubernetes Service (EKS) is AWS's managed Kubernetes offering. AWS hosts and patches the Kubernetes control plane across three Availability Zones. You own the data plane: EC2 node groups, self-managed nodes, or Fargate profiles that run your pods.

The split matters for day-two operations. AWS handles etcd backups, API server upgrades, and control-plane availability. You handle node AMI updates, pod scheduling, storage classes, ingress, and application deployments. That division is why EKS fits teams that want Kubernetes semantics without building a control plane.

Amazon EKS ArchitectureAWS Managed Control PlaneAPI Server · etcd · SchedulerMulti-AZ · AWS patches upgradesYour VPC Data PlaneNode groups · Fargate profilesPods · Services · IngressEKS Add-onsCoreDNSVPC CNI · EBS CSIIAM · IRSAPod-level AWS rolesNo long-lived keysLoad BalancersALB / NLB viaAWS LB Controller
Amazon EKS splits the managed control plane from your VPC-resident worker nodes, add-ons, and load balancers.

Each EKS cluster runs inside your VPC. Worker nodes need subnets in multiple AZs. The API server endpoint can be public, private, or both. Private-only endpoints are common in production because they reduce exposure while still allowing access through a VPN or bastion.

For background on the broader AWS Kubernetes path, see the companion post on running Kubernetes on AWS with Amazon EKS. If you are comparing cloud providers, the Google GKE practical guide covers the same decisions on GCP.

How do you create your first Amazon EKS cluster?

The fastest path for a learning cluster is eksctl. For anything that survives past a week, use Terraform or CloudFormation so the cluster is reproducible. A common mistake is clicking through the console once and never codifying the result.

Prerequisites

Install the AWS CLI, kubectl, and eksctl on your workstation. Configure an IAM principal with permissions to create EKS clusters, VPC resources, and IAM roles. Pick a supported Kubernetes version; check the AWS EKS Kubernetes versions documentation before you pin one.

Cluster creation with eksctl

Save this as cluster.yaml and adjust region, instance type, and node count for your budget.

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: prod-eks
  region: ap-south-1
  version: "1.32"

vpc:
  cidr: 10.20.0.0/16
  nat:
    gateway: HighlyAvailable

managedNodeGroups:
  - name: ng-general
    instanceType: t3.large
    desiredCapacity: 3
    minSize: 2
    maxSize: 6
    volumeSize: 80
    privateNetworking: true
    labels:
      role: general
    tags:
      Environment: production

addons:
  - name: vpc-cni
  - name: coredns
  - name: kube-proxy
  - name: aws-ebs-csi-driver

Apply it:

eksctl create cluster -f cluster.yaml
aws eks update-kubeconfig --name prod-eks --region ap-south-1
kubectl get nodes

When nodes show Ready, the data plane is live. Deploy a smoke-test app before you wire CI/CD.

  1. Create or select a VPC with subnets tagged for EKS (kubernetes.io/cluster/<name>).
  2. Define the cluster IAM role and node group role with the standard AWS-managed policies.
  3. Enable the OIDC provider — required for IRSA.
  4. Install core add-ons: VPC CNI, CoreDNS, kube-proxy, and the EBS CSI driver for persistent volumes.
  5. Configure kubectl access via aws eks update-kubeconfig or your CI runner role.
  6. Deploy a sample workload and confirm DNS, storage, and ingress end to end.
EKS Cluster Setup FlowIaC PlanTerraform / eksctlEKS ClusterControl plane liveNode GroupEC2 or FargateAdd-onsCNI · CSI · DNSDay-1 ChecklistEnable OIDC provider for IRSAInstall AWS Load Balancer ControllerConfigure Cluster Autoscaler or KarpenterWire CI/CD: build image → push ECR → kubectl applySet up logging and metrics stack
A typical Amazon EKS setup flow moves from infrastructure-as-code through add-ons to production-ready observability and CI/CD.

How does networking work on Amazon EKS?

EKS networking is where most first clusters stumble. The Amazon VPC CNI plugin assigns real VPC IP addresses to pods. Each ENI on a node has an IP limit. Large node types support more pods, but the ceiling is lower than you expect on smaller instances.

Plan subnet CIDR sizes before launch. A /24 per AZ fills quickly when each pod consumes a VPC IP. Many teams adopt custom networking, prefix delegation, or alternate CNIs when pod density outgrows the default setup.

Service types and ingress

Inside the cluster, Services expose pods with ClusterIP, NodePort, or LoadBalancer types. For HTTP traffic from the internet, install the AWS Load Balancer Controller. It watches Ingress or Gateway API resources and provisions Application Load Balancers automatically.

Pair ingress with Amazon API Gateway when you need edge auth, throttling, or WAF in front of internal services. For user authentication at the app layer, AWS Cognito integrates cleanly with JWT-aware services.

Private clusters and security groups

Production clusters often use private subnets for nodes and a private API endpoint. Security groups control traffic between the control plane and nodes. The cluster security group is created automatically; node security groups need explicit rules for kubelet, CoreDNS, and your app ports.

On teams where I handle Linux server work alongside application delivery, VPC design and security group hygiene are treated as part of the deploy pipeline, not a networking afterthought. That mindset transfers directly to EKS.

Which compute option should you choose: managed nodes, Karpenter, or Fargate?

EKS supports several compute models. Pick based on operational tolerance, cost, and how bursty your workload is.

OptionBest forTrade-offsApprox. control-plane cost
Managed node groupsSteady-state apps, predictable load, simplest opsYou patch AMIs; capacity is manual or autoscaled~USD 73/month per cluster (~Rs 9,800)
KarpenterSpiky workloads, mixed instance types, fast scale-outExtra controller to run; requires clear node policiesSame EKS fee plus EC2 spend
Fargate profilesSmall teams, no node patching, per-pod isolationHigher per-vCPU cost; not every pod fits Fargate constraintsEKS fee plus Fargate vCPU/memory pricing
Self-managed nodesCustom AMIs, GPU tuning, legacy compliance needsYou own patching, scaling, and failure recoveryEKS fee plus your EC2 ops time

If you only need AWS-native containers without Kubernetes APIs, ECS on Fargate is simpler and often cheaper at small scale. EKS earns its keep when you need Helm, operators, multi-cloud portability, or a large ecosystem of third-party tools.

For a multi-cloud lens on the same decision, read the guide on multi-cloud architecture and active-active vs active-passive patterns.

EKS Compute Decision TreeNeed Kubernetes?No → ECS FargateYes → EKSSteady loadManaged node groupsBursty loadKarpenter autoscalingNo node opsFargate profilesCommon gotcha: default VPC CNI IP limits on t3.mediumPlan larger subnets or enable prefix delegation early
Choose EKS compute based on load pattern and how much node operations your team wants to own.

How do you secure Amazon EKS for production workloads?

Security on EKS is IAM all the way down. Three layers matter most: cluster access, node permissions, and pod-level AWS access.

IRSA: IAM Roles for Service Accounts

Never mount long-lived AWS access keys inside pods. Enable the OIDC identity provider on your cluster, then annotate Kubernetes service accounts with an IAM role ARN. The AWS SDK inside your app picks up temporary credentials automatically.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: app-sa
  namespace: production
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/eks-app-s3-read

This pattern is how Laravel or Node services read from S3, publish to SQS, or call Secrets Manager without secrets in environment variables.

RBAC and audit logging

Map IAM users or SSO roles to Kubernetes RBAC groups through the aws-auth ConfigMap or EKS access entries (the newer API). Turn on control-plane logging to CloudWatch for api, audit, authenticator, controllerManager, and scheduler log types. Audit logs are essential when something changes in production and nobody admits to running kubectl apply.

Pod security and network policies

Enable a Pod Security Standard at the namespace level — restricted for app namespaces, baseline for system tools. Add NetworkPolicies once CNI supports them. Default-deny egress from app namespaces except to DNS and your database security group.

Admission controllers and webhooks extend this further. The article on mutating and validating webhooks explains how teams enforce labels, resource limits, and image registries at deploy time.

How do you deploy applications and operate an EKS cluster day to day?

A production EKS cluster is only as good as the pipeline that feeds it. The pattern I use on Git-based projects — build artefact, push to registry, deploy with zero downtime — maps cleanly to Kubernetes rolling updates.

Container registry and CI/CD

Push images to Amazon ECR. Tag with the Git SHA, not latest. Your pipeline builds the Docker image, scans it, pushes to ECR, then runs kubectl set image or applies a Kustomize/Helm manifest. For Jenkins-based setups, see the tutorial on building a CI/CD pipeline with Jenkins.

aws ecr get-login-password --region ap-south-1 | \
  docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-south-1.amazonaws.com

docker build -t myapp:${GIT_SHA} .
docker tag myapp:${GIT_SHA} 123456789012.dkr.ecr.ap-south-1.amazonaws.com/myapp:${GIT_SHA}
docker push 123456789012.dkr.ecr.ap-south-1.amazonaws.com/myapp:${GIT_SHA}

kubectl set image deployment/myapp myapp=123456789012.dkr.ecr.ap-south-1.amazonaws.com/myapp:${GIT_SHA} -n production
kubectl rollout status deployment/myapp -n production

Validate deployment manifests with the JSON formatter or regex tester when debugging templated YAML in CI logs.

Observability stack

Install metrics-server for basic CPU/memory metrics. For dashboards, Prometheus plus Grafana is the default open-source stack. The Grafana dashboards practical guide covers panel design once your metrics pipeline is live.

Ship container logs to CloudWatch Container Insights or a centralised stack. The post on log aggregation for small teams applies when you do not want a dedicated observability team.

Upgrades and rollbacks

EKS supports upgrading one minor Kubernetes version at a time. Upgrade the control plane first, then node groups. Drain nodes before AMI or kubelet upgrades. Keep previous Deployment revisions so kubectl rollout undo is one command away.

Managed add-ons should track the cluster version. After upgrades, run conformance checks and your smoke-test suite. Document the rollback path before you start.

EKS Production Operations LoopGit PushCI builds imageECR PushScan and tag SHADeployRolling updateMonitorAlerts fireFeedback LoopHPA scales pods on CPU or custom metricsCluster Autoscaler adds nodes when pending pods queueQuarterly: upgrade K8s version and refresh node AMIs
Production Amazon EKS operations cycle from Git push through deploy, monitoring, autoscaling, and scheduled upgrades.

What does Amazon EKS cost and how do you keep the bill predictable?

EKS pricing has two layers: the cluster management fee and the compute underneath. As of 2026, expect roughly USD 0.10 per hour per cluster (~Rs 16/hour, ~USD 73/month) for the control plane alone. That fee applies even if every node is stopped.

  • EC2 node groups: Instance hours, EBS volumes, and data transfer dominate. Use Savings Plans or Reserved Instances for baseline capacity.
  • Fargate: Per-vCPU and per-GB-hour. Convenient, but expensive at steady high utilisation.
  • Data transfer: Cross-AZ pod traffic and NAT gateway egress add up silently. Keep chatty services in the same AZ when possible.
  • Load balancers: Each Ingress can spawn an ALB. Consolidate hostnames or use NLB where appropriate.
  • Observability: CloudWatch log ingestion and long Prometheus retention are recurring costs. Set retention policies on day one.

For Redis-backed session or cache layers outside the cluster, compare against Amazon ElastiCache for Redis. Managed cache often beats running Redis inside the cluster for stateful data.

Nepal-based teams billing in NPR should model USD costs with current forex rates. The Nepal forex rates tool helps when you present infrastructure budgets to stakeholders.

Key Takeaways

  • Amazon EKS splits control-plane management (AWS) from data-plane operations (your nodes, add-ons, and apps).
  • Codify clusters with Terraform or eksctl YAML — console-only setups do not survive the first rebuild.
  • Plan VPC CNI IP capacity early; subnet size and instance type directly limit how many pods you can run.
  • Use IRSA for AWS API access from pods and RBAC plus access entries for human kubectl access.
  • Wire CI/CD to push SHA-tagged images to ECR and roll out with kubectl rollout status checks.
  • Budget for the flat ~USD 73/month control-plane fee plus EC2, NAT, and load-balancer costs before you commit.

People Also Ask

Is Amazon EKS worth it compared to ECS or self-managed Kubernetes?

EKS is worth it when you need standard Kubernetes APIs, Helm charts, operators, or multi-cloud portability. ECS on Fargate is simpler and often cheaper for small, AWS-only workloads. Self-managed Kubernetes saves the EKS fee but costs far more in engineer time. Most production teams pick EKS for the managed control plane.

How long does it take to create an EKS cluster?

A basic cluster with eksctl and one managed node group typically takes 15–20 minutes. Terraform runs take similar wall-clock time because EKS control-plane creation is the bottleneck. Add another hour for add-ons, ingress controller, and CI/CD wiring before you call it production-ready.

What Kubernetes version should I run on EKS in 2026?

Run a version within the standard support window listed in AWS documentation. Upgrade one minor version at a time. Avoid extended-support versions unless you have a compliance reason; they carry an additional per-cluster hourly fee.

Can I run Laravel or PHP apps on Amazon EKS?

Yes. Package Laravel as a container with PHP-FPM and Nginx or Apache, push to ECR, and deploy as a Deployment with a Service and Ingress. Use IRSA for S3 access, ElastiCache or a Redis sidecar for sessions, and external RDS or Aurora for MySQL. The app does not care that it runs on EKS as long as health checks and env config are correct.

Put Amazon EKS to work on your next platform decision

Amazon EKS: A Practical Guide is not a licence to Kubernetes everything. It is a structured path when your team outgrows single-server Laravel deploys and needs portable, autoscaled container orchestration on AWS. Start with one non-production cluster, codify it, harden IAM and networking, then promote the same pattern to production.

If you are planning a custom platform — booking systems, API backends, or multi-service eCommerce — and want help choosing between EKS, ECS, and traditional Linux hosting, reach out through contact us. For reference, see the Adventure Third Pole Trek booking platform and other enterprise application work in the portfolio, or explore custom software development and ongoing support and maintenance options.

Frequently Asked Questions

Amazon Elastic Kubernetes Service is AWS's managed Kubernetes offering. AWS hosts and patches the control plane across three Availability Zones; you run worker nodes, self-managed nodes, or Fargate profiles in your VPC.

EKS earns its keep when you need standard Kubernetes APIs, Helm charts, operators, or multi-cloud portability. ECS on Fargate is simpler and often cheaper for small, AWS-only workloads. Self-managed Kubernetes saves the EKS fee but costs far more in engineer time for control-plane operations. Most production teams pick EKS for the managed control plane and kubectl workflow without building etcd backups and API server upgrades themselves.

Install the AWS CLI, kubectl, and eksctl, then configure an IAM principal with EKS and VPC permissions. For learning, apply an eksctl ClusterConfig YAML defining region, Kubernetes version, VPC CIDR, managed node groups, and core add-ons like vpc-cni, CoreDNS, kube-proxy, and aws-ebs-csi-driver. Run eksctl create cluster -f cluster.yaml, then aws eks update-kubeconfig and kubectl get nodes. For anything beyond a week, codify the cluster with Terraform or CloudFormation instead of the console.

A basic cluster with eksctl and one managed node group typically takes 15–20 minutes. Budget another hour for add-ons, the AWS Load Balancer Controller, and CI/CD wiring before calling it production-ready.

The control plane costs roughly USD 0.10 per hour per cluster (~Rs 16/hour, ~USD 73/month), charged even when every node is stopped. EC2, Fargate, NAT gateway, and load-balancer costs sit on top.

The Amazon VPC CNI plugin assigns real VPC IP addresses to each pod, so subnet CIDR size and instance ENI limits directly cap pod density. Plan /16 or larger VPC ranges and avoid undersized /24 subnets per AZ. Inside the cluster, Services expose pods via ClusterIP, NodePort, or LoadBalancer. For HTTP from the internet, install the AWS Load Balancer Controller to provision Application Load Balancers from Ingress resources. Production clusters often use private subnets for nodes and a private API endpoint accessed through VPN or bastion.

Managed node groups suit steady-state apps with predictable load and the simplest day-two ops—you patch AMIs and scale capacity manually or with cluster autoscaler. Karpenter fits spiky workloads needing fast scale-out across mixed instance types but adds a controller to operate. Fargate profiles remove node patching for small teams but cost more per vCPU at steady utilisation and exclude some pod constraints. Self-managed nodes remain for custom AMIs, GPU tuning, or legacy compliance where you accept full node lifecycle ownership.

Enable the OIDC provider and use IRSA so pods assume IAM roles via service account annotations instead of long-lived access keys. Map human access through RBAC plus aws-auth ConfigMap or EKS access entries, and turn on control-plane logging to CloudWatch for api, audit, authenticator, controllerManager, and scheduler types. Apply Pod Security Standards at the namespace level—restricted for apps, baseline for system tools—and add NetworkPolicies with default-deny egress except to DNS and your database security group. Admission webhooks can enforce image registries and resource limits at deploy time.

IAM Roles for Service Accounts lets Kubernetes service accounts assume AWS IAM roles through the cluster OIDC provider. Annotate a ServiceAccount with eks.amazonaws.com/role-arn pointing to an IAM role, and the AWS SDK inside your pod receives temporary credentials automatically. This replaces mounting static access keys in environment variables. On real application stacks, IRSA is how services read S3, publish to SQS, or pull secrets from Secrets Manager without storing AWS keys in manifests or ConfigMaps.

Push Docker images to Amazon ECR tagged with the Git SHA, not latest. Your CI pipeline builds, scans, and pushes the image, then runs kubectl set image or applies a Kustomize or Helm manifest, followed by kubectl rollout status to confirm the rolling update. Install metrics-server for basic CPU and memory data, Prometheus plus Grafana for dashboards, and ship container logs to CloudWatch Container Insights or a centralised stack. Document rollback with kubectl rollout undo and keep previous Deployment revisions before any upgrade.

Yes. Package Laravel as a container with PHP-FPM and Nginx or Apache, push the image to ECR, and deploy it as a Kubernetes Deployment behind a Service and Ingress. Use IRSA for S3 access, Amazon ElastiCache or a Redis sidecar for sessions, and external RDS or Aurora for the database. The pattern maps cleanly from Git-based EC2 deployments: build artefact, push to registry, roll out with zero downtime—just swap systemd for kubectl rolling updates.

Pin a version within the standard support window listed in AWS EKS Kubernetes versions documentation before you create the cluster. Upgrade one minor version at a time—control plane first, then node groups—and drain nodes before AMI or kubelet upgrades. Avoid extended-support versions unless compliance requires them; they carry an additional per-cluster hourly fee. After upgrades, run conformance checks, update managed add-ons to match the cluster version, and re-run your smoke-test suite.

Install the AWS Load Balancer Controller and define Ingress or Gateway API resources pointing at your Services. The controller watches those resources and provisions Application Load Balancers automatically. Each Ingress can spawn its own ALB, so consolidate hostnames where possible or use Network Load Balancers where ALB features are unnecessary. Pair ingress with Amazon API Gateway when you need edge authentication, throttling, or WAF in front of internal services, and AWS Cognito for JWT-aware user authentication at the application layer.

Undersizing VPC subnets is the most frequent stumble—the VPC CNI consumes a real IP per pod, and a /24 per AZ fills quickly on busy clusters. Smaller instance types also hit ENI IP ceilings sooner than teams expect. Creating a cluster through the console once without Terraform or eksctl YAML is another recurring problem; it does not survive the first rebuild. Treat security group rules for kubelet, CoreDNS, and application ports as part of your deploy pipeline, not a networking afterthought added post-launch.

Model the flat ~USD 73/month control-plane fee before committing, then track EC2 instance hours, EBS volumes, Fargate vCPU and memory pricing, NAT gateway egress, cross-AZ pod traffic, and ALBs spawned by Ingress resources. Use Savings Plans or Reserved Instances for baseline node capacity. Consolidate Ingress hostnames to reduce load balancers. Set CloudWatch log retention on day one—long Prometheus retention and log ingestion add up silently. For Redis sessions or cache layers, compare running Redis inside the cluster against Amazon ElastiCache; managed cache often beats in-cluster stateful workloads. Nepal-based teams should convert USD estimates to NPR using current forex rates when presenting budgets.

Share this article

0 Comments

Leave a comment

Your email is not published. Comments appear once they have been read. Sign in to have your details filled in.

Quick Contact Options
Choose how you want to connect me: