AWS EKS Deployment
Deploy Laminar on Amazon EKS for production workloads.
Prerequisites
Quick Start
cd laminar-infra
# 1. Create AWS infrastructure
cd infrastructure/environments/dev
terragrunt run --all apply
# 2. Configure kubectl
aws eks update-kubeconfig --name laminar-dev-eks-cluster --region us-east-1
Architecture
Network Topology
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β VPC: 10.0.0.0/16 β
β Region: us-east-1 β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Internet Gateway β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β β
β βββββββββββββ΄ββββββββ βββββββββββ΄ββββββββββ ββββββββββ΄βββββββββββ β
β β Public Subnet β β Public Subnet β β Public Subnet β β
β β 10.0.192.0/20 β β 10.0.208.0/20 β β 10.0.224.0/20 β β
β β us-east-1a β β us-east-1b β β us-east-1c β β
β β β β β β β β
β β βββββββββββββββ β β β β β β
β β β NLB β β β β β β β
β β β (ingress) β β β β β β β
β β βββββββββββββββ β β β β β β
β β βββββββββββββββ β β β β β β
β β β NAT Gateway β β β β β β β
β β β (Elastic IP)β β β β β β β
β β βββββββββββββββ β β β β β β
β βββββββββββββββββββββ βββββββββββββββββββββ βββββββββββββββββββββ β
β β β β β
β ββββββββββββββββββββββΌβββββββββββββββββββββ β
β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Private Subnets (EKS Worker Nodes) β β
β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β tenant-{name} namespace β β β
β β β ββββββββββββ ββββββββββββββ ββββββββββββββ ββββββββββββββββ β β β
β β β β Console β β Controller β β Workers β β PostgreSQL β β β β
β β β β :3000 β β :8000 β β (dynamic) β β :5432 β β β β
β β β ββββββββββββ ββββββββββββββ ββββββββββββββ ββββββββββββββββ β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β laminar-monitoring namespace β β β
β β β ββββββββββββ ββββββββββββββ ββββββββββββββ β β β
β β β β Grafana β β GrepTimeDB β β Vector β β β β
β β β β :3001 β β :4000 β β β β β β
β β β ββββββββββββ ββββββββββββββ ββββββββββββββ β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β laminar-connectors namespace β β β
β β β ββββββββββββ ββββββββββββββ β β β
β β β β MinIO β β Redpanda β β β β
β β β β :9000 β β :9092 β β β β
β β β ββββββββββββ ββββββββββββββ β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Route Tables: β
β β’ Public: 0.0.0.0/0 β Internet Gateway β
β β’ Private: 0.0.0.0/0 β NAT Gateway β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Traffic Flow
Inbound (Internet β Application):
ββββββββββββ ββββββββββββ βββββββββββββββ βββββββββββββββ ββββββββββββ
β Internet βββββΆβ Route53 βββββΆβ NLB βββββΆβingress-nginxβββββΆβ Pod β
β β βlmnr.cloudβ β :80/:443 β β ClusterIP β β :3000 β
β β β β β Public SN β β Private SN β β Private β
ββββββββββββ ββββββββββββ βββββββββββββββ βββββββββββββββ ββββββββββββ
Outbound (Pod β Internet):
ββββββββββββ βββββββββββββββ βββββββββββββββ ββββββββββββ
β Pod βββββΆβ Private RT βββββΆβ NAT Gateway βββββΆβ Internet β
β Private β β 0.0.0.0/0 β β Elastic IP β β β
ββββββββββββ βββββββββββββββ βββββββββββββββ ββββββββββββ
VPC Configuration
Setting Value CIDR 10.0.0.0/16 (65,536 IPs) DNS Hostnames Enabled DNS Support Enabled Region us-east-1
Subnets
Type CIDR AZ IPs Purpose K8s Tag Public 10.0.192.0/20 us-east-1a 4,096 NLB, NAT kubernetes.io/role/elb=1Public 10.0.208.0/20 us-east-1b 4,096 NLB kubernetes.io/role/elb=1Public 10.0.224.0/20 us-east-1c 4,096 NLB kubernetes.io/role/elb=1Private 10.0.0.0/18 us-east-1a 16,384 EKS nodes kubernetes.io/role/internal-elb=1Private 10.0.64.0/18 us-east-1b 16,384 EKS nodes kubernetes.io/role/internal-elb=1Private 10.0.128.0/18 us-east-1c 16,384 EKS nodes kubernetes.io/role/internal-elb=1
EKS Cluster
Setting Value Name laminar-dev-eks-cluster Kubernetes Version 1.30 Endpoint Access Public + Private Addons EBS CSI Driver (IRSA) OIDC Provider Enabled (for IRSA)
Node Groups
Group Instance Type Count vCPU Memory AMI Disk large-nodes c8g.xlarge 3 4 8 GiB AL2023_ARM_64 30GB gp3 medium-nodes c8g.medium 5 1 2 GiB AL2023_ARM_64 30GB gp3
Total Capacity: 8 nodes, 17 vCPU, 34 GiB memory
Ingress (Network Load Balancer)
Setting Value Type Network Load Balancer (NLB) Scheme internet-facing Target Type IP (direct to pods) Cross-Zone LB Enabled Ports 80 (HTTP), 443 (HTTPS) Controller ingress-nginx
Storage
Class Provisioner Type IOPS Encrypted Binding gp3 (default) ebs.csi.aws.com gp3 3,000 Yes WaitForFirstConsumer
IRSA (IAM Roles for Service Accounts)
Role Service Account Namespace Permissions argo-workflows-ecr-push argo-workflow argo ECR push to laminar/* ebs-csi-controller ebs-csi-controller-sa kube-system EBS volume management
Security
Layer Configuration Node Placement Private subnets only Instance Metadata IMDSv2 enforced (token-based) EBS Volumes Encrypted by default IAM IRSA for fine-grained permissions Load Balancer NLB in public subnets API Server Public + Private access
DNS & TLS
Component Configuration DNS Provider Route53 Domain *.lmnr.cloud Certificate Manager cert-manager ACME Server Let's Encrypt (letsencrypt-prod) Validation HTTP-01 via ingress-nginx ClusterIssuers letsencrypt-staging, letsencrypt-prod
Infrastructure Components
Terragrunt creates:
Resource Description VPC 10.0.0.0/16 with public/private subnets EKS Kubernetes 1.30 cluster Node Group 3x c8g.xlarge + 5x c8g.medium (ARM64) NAT Gateway For private subnet internet access IRSA IAM roles for service accounts
Infrastructure Structure
infrastructure/
βββ root.hcl # Terragrunt root config
βββ modules/ # Reusable Terraform modules
β βββ aws/
β βββ vpc/
β βββ subnets/
β βββ eks/
β βββ ...
βββ environments/
βββ dev/
βββ env.hcl # Environment variables
βββ vpc/
βββ public_subnets/
βββ private_subnets/
βββ nat_gateway/
βββ eks/
βββ ...
Commands
Infrastructure:
cd infrastructure/environments/dev
terragrunt run --all plan # Preview changes
terragrunt run --all apply # Apply all
terragrunt run --all destroy # Destroy all
Configuration
Environment config - infrastructure/environments/dev/env.hcl:
locals {
environment = " dev "
vpc_cidr = " 10.0.0.0/16 "
aws_region = " us-east-1 "
kubernetes_cluster_name = " laminar-dev-eks-cluster "
}
Create new environment:
Copy environments/dev to environments/prod
Update env.hcl with new values
Run terragrunt run --all apply