The easy button for learning, testing, and demoing Amazon EKS:
- Install complex applications and dependencies with a single command
- Extensive application catalog with over 70 options (includes CNCF, open source and related projects)
- Customize application installs easily with simple command line flags
- Query and search AWS resources with over 60 kubectl-like get commands
Note:
eksdemo
is in beta and is intended for demo and test environments only.
- Why
eksdemo
? - Install
eksdemo
- Application Catalog
- Kubectl-like get commands
- Tutorials
- Support & Feedback
- Security
- License
While creating an EKS cluster is fairly easy thanks to eksctl
, manually installing and configuring applications on EKS is complex, time consuming and error-prone. One of the most powerful feature of eksdemo
is its extensive application catalog. An application can be installed (including dependencies) with a single command.
For example, the command: eksdemo install karpenter -c <cluster-name>
will:
- Create the EC2 Spot Service Linked Role (if it doesn't already exist)
- Create the Karpenter Controller IAM Role (IRSA)
- Create the Karpenter Node IAM Role
- Create an SQS Queue and EventBridge rules for native Spot Termination Handling
- Add an entry to the
aws-auth
ConfigMap for the Karpenter Node IAM Role - Install the Karpenter Helm Chart
- Create default Karpenter
NodePool
andEC2NodeClass
Custom Resources
Application installs are:
- Transparent
- The
--dry-run
flag prints out all the stepseksdemo
will take to create dependencies and install the application
- The
- Customizable
- Each application has optional flags for common configuration options
- The
--set
flag is available to override any settings in a Helm chart's values file
- Managed by Helm
eksdemo
embeds Helm as a library and it's used to install all applications, even those that don't have a Helm chart
Both eksdemo
and EKS Blueprints automate the creation of EKS clusters and install commonly used applications. Why would you use eksdemo
for learning, testing, and demoing EKS?
eksdemo |
EKS Blueprints |
---|---|
Use cases: learning, testing, and demoing EKS | Use cases: customers deploying to prod and non-prod environments |
Kubectl-like CLI installs apps with single command | Infrastructure as Code (IaC) built on Terraform or CDK |
Imperative tooling is great for iterative testing | Declarative IaC tooling is not designed for iterative testing |
Used to get up and running quickly | Used to drive standards and communicate vetted architecture patterns for utilizing EKS within customer organizations |
eksdemo
is a Golang binary and releases include support for Mac, Linux and Windows running on x86 or arm64. There are a number of ways you can install:
- Install using Homebrew — Install locally for Mac and Linux users.
- Install on AWS CloudShell — Easiest way to use
eksdemo
. - Install on AWS Cloud9 — Install into your Cloud9 instance.
- Install Manually — This method is required for Windows users.
- AWS Account with Administrator access
- Route53 Public Hosted Zone (Optional but strongly recommended)
- You can update the domain registration of your existing domain (using any domain registrar) to change the name servers for the domain to use the four Route 53 name servers.
- You can still use
eksdemo
if you don’t have a Route53 Hosted Zone. Most applications that explose an Ingress resource default to deploying a Service of type LoadBalancer if you don't use the--ingress-host
flag and your connection to the application will be unencrypted.
Homebrew installation method is supported for Mac and Linux. Using the Terminal, enter the following commands:
brew tap aws/tap
brew install eksdemo
Note: Depending on how you originally installed eksctl
, you may receive the error: eksctl is already installed from homebrew/core!
This is because eksdemo
uses the official Weaveworks tap weaveworks/tap
as a dependency.
If you receive the error above, run the following commands:
brew uninstall eksctl
brew install eksdemo
AWS CloudShell environments are mostly ephemeral and software you install is lost the next time you reconnect. There is persistent storage available in the home directory that is retained for 120 days after the end of your last session. Use the following commands to install eksdemo
on AWS CloudShell:
curl -s -L "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_Linux_amd64.tar.gz" | tar xz -C /tmp
curl -s -L "https://github.com/awslabs/eksdemo/releases/latest/download/eksdemo_Linux_x86_64.tar.gz" | tar xz -C /tmp
mkdir -p ~/.local/bin && mv /tmp/eksctl ~/.local/bin && mv /tmp/eksdemo ~/.local/bin
To configure Bash completion, first install the bash-completion package:
sudo dnf install bash-completion -y
Once that completes, run the following commands that will configure bash completion to work across CloudShell sessions by installing everything needed in the home directory:
mkdir -p ~/.bashrc.d
cp /usr/share/bash-completion/bash_completion ~/.bashrc.d/
echo '. <(eksdemo completion bash)' >> ~/.bashrc
source ~/.bashrc
To install on Cloud9, you will need to install Homebrew first. In the Cloud9 terminal, run the following commands:
CI=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
(echo; echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"') >> ~/.bashrc
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
brew install aws/tap/eksdemo
To configure Bash completion, run the following commands and then start a new terminal:
cat >> ~/.bashrc << \EOF
if type brew &>/dev/null
then
for COMPLETION in "$(brew --prefix)/etc/bash_completion.d/"*
do
[[ -r "${COMPLETION}" ]] && source "${COMPLETION}"
done
fi
EOF
Navigate to Releases, look under Assets and locate the binary that matches your operation system and platform. Download the file, uncompress and copy to a location of your choice that is in your path. A common location on Mac and Linux is /usr/local/bin
. Note that eksctl
is required and must be installed as well.
Most eksdemo
commands require that you have configured a default AWS region or use the --region
flag. There are 2 ways to configure a default region, either:
- Set in the the AWS CLI Configuration file. On Linux and MacOS this file is located in ~/.aws/config. You can use the
aws configure
command to set the region. - Set the
AWS_REGION
environment variable to the desired default region. An example isexport AWS_REGION=us-west-2
. Unless you set the environment variable in your~/.bashrc
or~/.zshrc
, you will need to set this every time you open a new terminal.
To validate installation you can run the eksdemo version
command and confirm you are running the latest version. The output will be similar to below:
» eksdemo version
eksdemo: version.Info{Version:"0.17.0", Date:"2024-11-11T03:14:58Z", Commit:"13e0e01"}
To validate the AWS region is set, you can run eksdemo get cluster
which will list running EKS clusters in the default region. If you don’t have any EKS clusters in the region, you will get the response: No resources found.
» eksdemo get cluster
+------------+--------+---------+---------+----------+----------+
| Age | Status | Cluster | Version | Platform | Endpoint |
+------------+--------+---------+---------+----------+----------+
| 3 weeks | ACTIVE | green | 1.27 | eks.23 | Public |
| 20 minutes | ACTIVE | *blue | 1.31 | eks.2 | Public |
+------------+--------+---------+---------+----------+----------+
* Indicates current context in local kubeconfig
eksdemo
comes with an extensive application catalog. Each application can be installed with a single command:
eksdemo install <application> -c <cluster-name> [flags]
To install applications under a group, you can use either a space or a hyphen. For example, each of the following are valid:
eksdemo install ingress nginx
or eksdemo install ingress-nginx
The application catalog includes:
ack
— AWS Controllers for Kubernetes (ACK)apigatewayv2-controller
— ACK API Gateway v2 Controllerec2-controller
— ACK EC2 Controllerecr-controller
— ACK ECR Controllerefs-controller
— ACK EFS Controllereks-controller
— ACK EKS Controlleriam-controller
— ACK IAM Controllerprometheusservice-controller
— ACK Prometheus Service Controllerrds-controller
— ACK RDS Controllers3-controller
— ACK S3 Controller
adot-operator
— AWS Distro for OpenTelemetry (ADOT) Operatorargo
— Get stuff done with Kubernetes!cd
— Declarative continuous deployment for Kubernetesworkflows
— Workflow engine for Kubernetesworkflows-cognito
— Workflow engine for Kubernetes using Cognito for authentication
autoscaling
— Kubernetes Autoscaling Applicationscluster-autoscaler
— Kubernetes Cluster Autoscalerkeda
— Kubernetes-based Event Driven Autoscalingvpa
— Vertical Pod Autoscaler
aws-fluent-bit
— AWS Fluent Bitaws-lb-controller
— AWS Load Balancer Controllercert-manager
— Cloud Native Certificate Managementcilium
— eBPF-based Networking, Observability, Securityconsul
— HashiCorp Consul Service-Meshcontainer-insights
— CloudWatch Container Insightsadot-collector
— Container Insights ADOT Collector Metricscloudwatch-agent
— Container Insights CloudWatch Agent Metricsfluent-bit
— Container Insights Fluent Bit Logsprometheus
— CloudWatch Container Insights monitoring for Prometheus
core-dump-handler
- Automatically saves core dumps to S3crossplane
— The Cloud Native Control Planecore
— Crossplane Core Componentsec2-provider
— Crossplane EC2 Provideriam-provider
— Crossplane IAM Providers3-provider
— Crossplane S3 Provider
example
— Example Applicationsascp
— Example for AWS Secrets Manager and Config Provider for Secret Store CSI Drivereks-workshop
— EKS Workshop Example Microservicesgame-2048
— Example Game 2048ghost
— Turn your audience into a businessinflate
— Example App to Demonstrate Autoscalingkube-ops-view
— Kubernetes Operational Viewpodinfo
— Go app w/microservices best practicesspark-pi
— Apache Spark SparkPi Examplewordpress
— WordPress Blog
external-dns
— ExternalDNSfalco
— Cloud Native Runtime Securityflux
— GitOps family of projectscontrollers
— Flux Controllerssync
— Flux GitRepository to sync with
goldilocks
— Get your resource requests "Just Right"harbor
— Cloud Native Registryheadlamp
— An easy-to-use and extensible Kubernetes web UIingress
— Ingress Controllerscontour
— Ingress Controller using Envoy proxyemissary
— Open Source API Gateway from Ambassadornginx
— Ingress NGINX Controller
istio
— Istio Service Meshbase
— Istio Base (includes CRDs)istiod
— Istio Control Plane
k8sgpt-operator
— K8sGPT Operatorkarpenter
— Karpenter Node Autoscalingkeycloak-amg
— Keycloak SAML iDP for Amazon Managed Grafanakube-prometheus
— End-to-end Cluster Monitoring with Prometheuskarpenter-dashboards
— Karpenter Dashboards and ServiceMonitorstack
— Kube Prometheus Stackstack-amp
— Kube Prometheus Stack using Amazon Managed Prometheus
kube-state-metrics
— Kube State Metricskubecost
— Visibility Into Kubernetes Spendeks
— EKS optimized bundle of Kubecosteks-amp
— EKS optimized Kubecost using Amazon Managed Prometheusvendor
— Vendor distribution of Kubecost
metrics-server
— Kubernetes Metric Serverneuron
— AWS Neuron for Inferentia and Trainium Supportneuron-device-plugin
— Neuron SDK Device Plugin
policy
— Kubernetes Policy Controllerskyverno
— Kubernetes Native Policy Managementopa-gatekeeper
— Policy Controller for Kubernetes
prometheus-node-exporter
— Prometheus Node Exportersecrets
— Secrets Management Solutions for Kubernetesstore-csi-driver
— Integrates secrets stores with K8s via a CSI volumestore-csi-driver-provider-aws
— AWS Secrets Manager and Config Provider for Secret Store CSI Driver
spark-operator
— Kubeflow Spark Operatorstorage
— Kubernetes Storage Solutionsebs-csi
— Amazon EBS CSI driverefs-csi
— Amazon EFS CSI driverfsx-lustre-csi
— Amazon FSx for Lustre CSI Driveropenebs
— Kubernetes storage simplified
vault
— HashiCorp Vault Secrets and Encryption Management Systemvelero
— Backup and Migrate Kubernetes Applicationsvpc-lattice-controller
— Amazon VPC Lattice (Gateway API) Controller
eksdemo
makes it easy to view AWS resources from the command line with commands that are very similar to how kubectl get
works. Output defaults to a table, but raw AWS API output can be viewed with -o yaml
and -o json
flag options.
Almost all of the command have shorthand alaises to make it easier to type. For example, get ec2
is an alias for get ec2-instance
. You can find the aliases using the help command, eksdemo get ec2-instance -h
.
access-entry
— EKS Access Entryacm-certificate
— ACM Cerificateaddon
— EKS Managed Addonaddon-versions
— EKS Managed Addon Versionsalarm
— CloudWatch Alarmamg-workspace
— Amazon Managed Grafana Workspaceami
— Amazon Machine Image (AMI)amp-rule
— Amazon Managed Prometheus Rule Namespaceamp-workspace
— Amazon Managed Prometheus Workspaceapplication
— Installed Applicationsauto-scaling-group
— Auto Scaling Groupavailability-zone
— Availability Zonecloudformation-stack
— CloudFormation Stackcloudtrail-event
— CloudTrail Event Historycloudtrail-trail
— CloudTrail Trailcluster
— EKS Clustercognito
— Amazon Cognito Resourcesapp-client
— Cognito User Pool App Clientdomain
— Cognito User Pool Domainuser-pool
— Cognito User Pool
dns-record
— Route53 Resource Record Setec2-instance
— EC2 Instanceecr-repository
— ECR Repositoryefs-filesystem
— EFS File Systemselastic-ip
— Elastic IP Addressevent-rule
— EventBridge Rulefargate-profile
— EKS Fargate Profilehosted-zone
— Route53 Hosted Zoneiam-oidc
— IAM OIDC Identity Provideriam-policy
— IAM Policyiam-role
— IAM Roleinternet-gateway
— Internet Gatewaykms-key
— KMS Keylistener
— Load Balancer Listenerlistener-rule
— Load Balancer Listener Ruleload-balancer
— Elastic Load Balancerlog-event
— CloudWatch Log Eventslog-group
— CloudWatch Log Grouplog-stream
— CloudWatch Log Streamlogs-insights
— CloudWatch Logs Insightsquery
— Logs Insights Query Historyresults
— Logs Insights Query Resultsstats
— Logs Insights Query Statistics
metric
— CloudWatch Metricnat-gateway
— NAT Gatewaynetwork-acl
— Network ACLnetwork-acl-rule
— Network ACLnetwork-interface
— Elastic Network Interfacenode
— Kubernetes Nodenodegroup
— EKS Managed Nodegrouporganization
— AWS Organizationprefix-list
— Managed Prefix Listroute-table
— Route Tables3-bucket
— Amazon S3 Bucketsagemaker
— Amazon SageMaker Resourcesdomain
— SageMaker Domainuser-profile
— SageMaker User Profile
security-group
— Security Groupsecurity-group-rule
— Security Group Rulesqs-queue
— SQS Queuessm-node
— SSM Managed Nodessm-parameter
— SSM Parameterssm-session
— SSM Sessionsubnet
— VPC Subnettarget-group
— Target Grouptarget-health
— Target Healthvolume
— EBS Volumevpc
— Virtual Private Cloudvpc-endpoint
— VPC Endpointvpc-lattice
— VPC Lattice Resourcesservice
— VPC Lattice Serviceservice-network
— VPC Lattice Service Networktarget-group
— VPC Lattice Target Group
vpc-summary
— VPC Summary
The Basics tutorials provide detailed knowledge on how eksdemo
works. It's recommended you review the Basics tutorials before proceeding to Advanced tutorial as they assume this knowlege.
- Create an Amazon EKS Cluster with Bottlerocket Nodes
- Request and Validate a Public Certificate with AWS Certificate Manager (ACM)
- Install AWS Load Balancer Controller
- Install ExternalDNS
- Install Game 2048 Example Application with TLS using an ACM Certificate
- Install Ingress NGINX
- Install cert-manager
- Install EBS CSI Driver
- Install Karpenter autoscaler and test node provisioning and consolidation
- Install EKS optimized Kubecost using Amazon Managed Prometheus
- Install Kube Prometheus Stack using Amazon Managed Prometheus
- Install Amazon VPC Lattice (Gateway API) Controller
- Install HashiCorp Consul Application with Consul self-signed TLS
This project is maintained by AWS Solution Architects. It is not part of an AWS service and support is provided best-effort by the maintainers. To post feedback, submit feature ideas, or report bugs, please use the Issues section of this repo. If you are interested in contributing, please see the Contribution guide.
See CONTRIBUTING for more information.
This library is licensed under the MIT-0 License. See the LICENSE file.