Graviton Workloads on EKS Auto Mode
Table of Contents
Prerequisites
Cluster deployed and kubectl configured per Quick Start.
Overview
AWS Graviton processors deliver the best price performance for your cloud workloads running on Amazon EC2. Key benefits include:
💰 Cost Optimization
- Up to 40% better price performance over comparable x86-based instances
- Pay only for the compute resources you use
⚡ Performance
- Custom-built ARM-based processors by AWS
- Optimized for cloud-native applications
🔒 Requirements
- Applications must be ARM64 compatible
- Proper configuration of node taints and tolerations
Architecture
This example demonstrates how to run Graviton workloads on EKS Auto Mode by configuring Karpenter to provision ARM64-compatible nodes.
Key Components: 📄 NodePool Template
- Defines Graviton instance requirements
- Available here
🔄 Load Balancer
- Application Load Balancer (ALB)
- Exposes the application to external traffic
🎮 Sample Application
- 2048 game (sliding tile puzzle)
- ARM64-compatible container image
Implementation Steps
1. Deploy Graviton NodePool
Deploy the NodePool that will manage our Graviton instances:
kubectl apply -f ../../nodepools/graviton-nodepool.yaml
⚠️ The Graviton NodePool applies the following taint to ensure only ARM64-compatible workloads are scheduled on these nodes:
taints:- key: "arm64"value: "true"effect: "NoSchedule" # Prevents non-ARM64 pods from schedulingAny pods that need to run on Graviton nodes must include matching tolerations in their specifications. This ensures workload compatibility with the ARM64 architecture.
2. Deploy the 2048 Game
Deploy our ARM64-compatible 2048 game application:
kubectl apply -f game-2048.yaml
✅ The 2048 game deployment includes the required toleration to run on Graviton nodes:
tolerations:- key: "arm64" # Matches the Graviton node taintvalue: "true"effect: "NoSchedule" # Allows scheduling on tainted nodesThis toleration enables the pods to be scheduled on our ARM64 Graviton instances.
3. Configure Load Balancer
Set up the Application Load Balancer using Ingress:
kubectl apply -f 2048-ingress.yaml
4. Access the Application
By default, this example exposes its UI via an internal ALB — reachable from inside the VPC only. To access it from your laptop, use kubectl port-forward:
kubectl port-forward -n game-2048 svc/service-2048 8080:80
# then open http://localhost:8080
If you want to inspect the ALB DNS name directly (e.g. from a bastion or VPN):
kubectl get ingress ingress-2048 \
-o jsonpath='{.status.loadBalancer.ingress[0].hostname}' \
-n game-2048
To expose the UI publicly over HTTPS, deploy the Terraform stack with var.base_domain set to a public Route53 zone you own (see top-level README). The example will be reachable at https://2048-graviton.<full_domain> once external-dns publishes the record. 🎮
Cleanup
🧹 Follow these steps to clean up all resources:
Remove the application and node pool:
kubectl delete -f 2048-ingress.yaml
kubectl delete -f game-2048.yaml
kubectl delete -f ../../nodepools/graviton-nodepool.yaml
Troubleshooting
🔧 Common issues and their solutions:
Ingress Issues
If your ALB ingress isn't working properly:
- Stuck Ingress Deletion
# Remove finalizers if ingress is stuck
kubectl -n game-2048 patch ingress ingress-2048 \
-p '{"metadata":{"finalizers":null}}' \
--type=merge
- ALB Controller Issues
# Check ALB controller logs for errors
kubectl logs -n kube-system \
deployment/aws-load-balancer-controller
💡 Tip: Always verify the ALB security group configuration if you're having connectivity issues.