Tools
Tools: EKS-node-viewer: See Your EKS Costs in Real-Time (No Dashboard Needed)
2026-02-21
0 views
admin
π₯ Meet eks-node-viewer ## π― When I Use It ## π Let's Build a Demo ## Step 1: Create EKS Cluster ## Create Cluster Config ## Create the Cluster ## Step 2: Install eks-node-viewer ## Option 1: Using Go (Recommended) ## Option 2: Using Homebrew (Mac) ## Option 3: Download Binary ## Verify Installation ## Step 3: Connect to Cluster ## Step 4: Run eks-node-viewer (Baseline) ## Step 5: Deploy Nginx (Watch Costs Update) ## Step 6: Deploy CPU-Intensive App ## Step 7: Scale Up (Watch Node Get Packed) ## Step 8: Check Pod Distribution ## Step 9: Cleanup (Watch Resources Free Up) ## π― Real-World Use Cases ## Use Case 1: "Why is my bill so high?" ## Use Case 2: "Pods are pending" ## Use Case 3: "Is Karpenter working?" ## Use Case 4: "On-Demand vs Spot Cost Comparison" ## π§Ή Cleanup ## π― Key Takeaways ## What eks-node-viewer Shows You ## When to Use It ## Why It's Better Than Alternatives ## π Try It Yourself ## π Resources ## π¬ Final Thoughts ## AWS #EKS #Kubernetes #Karpenter #DevOps #CloudCost #CostOptimization #eks-node-viewer A tiny CLI tool from AWS Labs. Built originally for Karpenter demos. Now open source. And honestly, underrated. Real-time. In your terminal. No dashboard hopping. No Grafana. No console tab-switching. I use eks-node-viewer when: If you run multiple clusters (or even one busy prod cluster), this is a ridiculously fast way to understand what's happening. I'll show you exactly how to use eks-node-viewer with a real EKS cluster. First, we need an EKS cluster. I'm using eksctl because it's the fastest way. While it's creating, let's install eks-node-viewer. Once your cluster is ready, update your kubeconfig: Now for the magic. Run eks-node-viewer: Let's break this down: πΈ Screenshot this! This is your baseline. Keep eks-node-viewer running in Terminal 1. Open a NEW terminal (Terminal 2) and deploy nginx: Switch back to Terminal 1 (eks-node-viewer). You'll see it update in real-time: Let's stress the CPU and watch it happen live: In eks-node-viewer (Terminal 1): This is the key insight: You can see your node is now 80% utilized. If you add more workloads, you'll need another node (and another $30/month). Let's push it further: Real-world insight: If you were using Karpenter, it would see this 95% CPU usage and provision a new node. You'd see a second line appear in eks-node-viewer with another $30/month cost. In eks-node-viewer, you can see exactly how pods are distributed: This is useful for understanding if you're hitting pod limits (which can happen before CPU/memory limits). Let's clean up and watch the resources free up in real-time: Before eks-node-viewer: With eks-node-viewer: Instant insight: You're paying $303/month for 10 nodes that are only 10% utilized. You could consolidate to 2-3 nodes and save $200/month. Time saved: 15 minutes β 30 seconds Scenario: You deploy a new app and pods are stuck in Pending state. Check eks-node-viewer: Instant insight: Nodes are at 98% CPU and 113% memory (overcommitted). You need more nodes. Solution: Scale up or let Karpenter add nodes. Scenario: You installed Karpenter but you're not sure if it's actually consolidating nodes. Terminal 1: Run eks-node-viewer Terminal 2: Scale down workload Watch eks-node-viewer: If nodes DON'T disappear: Karpenter isn't working. Check your NodePool configuration. Filter by capacity type: Instant insight: Same workload, same utilization, but Spot is 70% cheaper ($151 vs $45). When you're done with the demo: β
Real-time cost - Per hour and per month
β
Instance types - t3.medium, c6a.2xlarge, etc.
β
Capacity type - On-Demand vs Spot
β
Resource usage - CPU, Memory, Pods
β
Utilization bars - Visual representation
β
Pod distribution - How many pods per node β
Cost visibility - Quick cost checks
β
Capacity planning - Before deploying new apps
β
Debugging - Why are pods pending?
β
Karpenter monitoring - Is consolidation working?
β
Optimization - Finding underutilized nodes β
No setup - Just install and run
β
No dashboard - Works in terminal
β
Real-time - Updates as things change
β
Cost-aware - Shows pricing automatically
β
Fast - Answer questions in seconds 5-minute quick start: That's it. You'll get it immediately. eks-node-viewer is one of those tools that seems simple but becomes indispensable once you start using it. Before: Checking costs meant opening 5 tabs, clicking through dashboards, and doing mental math. After: One command. Instant visibility. Make decisions in seconds. If you run EKS (especially with Karpenter), try this once. You'll understand why it's underrated. Have you used eks-node-viewer? What's your favorite use case? Let me know in the comments! π Happy Learning
Prithiviraj Rengarajan
DevOps Engineer Templates let you quickly answer FAQs or store snippets for re-use. Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment's permalink. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse CODE_BLOCK:
eks-node-viewer --resources cpu,memory Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
eks-node-viewer --resources cpu,memory CODE_BLOCK:
eks-node-viewer --resources cpu,memory COMMAND_BLOCK:
cat > eks-node-viewer-cluster.yaml << 'EOF'
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig metadata: name: eks-node-viewer-demo region: us-east-1 version: "1.31" managedNodeGroups: - name: demo-nodes instanceType: t3.medium minSize: 1 maxSize: 1 desiredCapacity: 1 volumeSize: 20 labels: role: demo tags: Environment: demo Tool: eks-node-viewer
EOF Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
cat > eks-node-viewer-cluster.yaml << 'EOF'
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig metadata: name: eks-node-viewer-demo region: us-east-1 version: "1.31" managedNodeGroups: - name: demo-nodes instanceType: t3.medium minSize: 1 maxSize: 1 desiredCapacity: 1 volumeSize: 20 labels: role: demo tags: Environment: demo Tool: eks-node-viewer
EOF COMMAND_BLOCK:
cat > eks-node-viewer-cluster.yaml << 'EOF'
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig metadata: name: eks-node-viewer-demo region: us-east-1 version: "1.31" managedNodeGroups: - name: demo-nodes instanceType: t3.medium minSize: 1 maxSize: 1 desiredCapacity: 1 volumeSize: 20 labels: role: demo tags: Environment: demo Tool: eks-node-viewer
EOF CODE_BLOCK:
eksctl create cluster -f eks-node-viewer-cluster.yaml Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
eksctl create cluster -f eks-node-viewer-cluster.yaml CODE_BLOCK:
eksctl create cluster -f eks-node-viewer-cluster.yaml CODE_BLOCK:
go install github.com/awslabs/eks-node-viewer/cmd/eks-node-viewer@latest Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
go install github.com/awslabs/eks-node-viewer/cmd/eks-node-viewer@latest CODE_BLOCK:
go install github.com/awslabs/eks-node-viewer/cmd/eks-node-viewer@latest CODE_BLOCK:
brew tap aws/tap
brew install eks-node-viewer Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
brew tap aws/tap
brew install eks-node-viewer CODE_BLOCK:
brew tap aws/tap
brew install eks-node-viewer COMMAND_BLOCK:
# Download latest release
curl -LO https://github.com/awslabs/eks-node-viewer/releases/latest/download/eks-node-viewer_$(uname -s)_$(uname -m).tar.gz # Extract
tar -xzf eks-node-viewer_*.tar.gz # Move to PATH
sudo mv eks-node-viewer /usr/local/bin/
sudo chmod +x /usr/local/bin/eks-node-viewer Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
# Download latest release
curl -LO https://github.com/awslabs/eks-node-viewer/releases/latest/download/eks-node-viewer_$(uname -s)_$(uname -m).tar.gz # Extract
tar -xzf eks-node-viewer_*.tar.gz # Move to PATH
sudo mv eks-node-viewer /usr/local/bin/
sudo chmod +x /usr/local/bin/eks-node-viewer COMMAND_BLOCK:
# Download latest release
curl -LO https://github.com/awslabs/eks-node-viewer/releases/latest/download/eks-node-viewer_$(uname -s)_$(uname -m).tar.gz # Extract
tar -xzf eks-node-viewer_*.tar.gz # Move to PATH
sudo mv eks-node-viewer /usr/local/bin/
sudo chmod +x /usr/local/bin/eks-node-viewer COMMAND_BLOCK:
eks-node-viewer --version
# Output: eks-node-viewer version v0.7.4 Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
eks-node-viewer --version
# Output: eks-node-viewer version v0.7.4 COMMAND_BLOCK:
eks-node-viewer --version
# Output: eks-node-viewer version v0.7.4 COMMAND_BLOCK:
# List clusters
aws eks list-clusters --region us-east-1 # Update kubeconfig
aws eks update-kubeconfig --name eks-node-viewer-demo --region us-east-1 # Verify connection
kubectl get nodes Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
# List clusters
aws eks list-clusters --region us-east-1 # Update kubeconfig
aws eks update-kubeconfig --name eks-node-viewer-demo --region us-east-1 # Verify connection
kubectl get nodes COMMAND_BLOCK:
# List clusters
aws eks list-clusters --region us-east-1 # Update kubeconfig
aws eks update-kubeconfig --name eks-node-viewer-demo --region us-east-1 # Verify connection
kubectl get nodes COMMAND_BLOCK:
NAME STATUS ROLES AGE VERSION
ip-192-168-13-156.ec2.internal Ready <none> 2m v1.31.14-eks-70ce843 Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
NAME STATUS ROLES AGE VERSION
ip-192-168-13-156.ec2.internal Ready <none> 2m v1.31.14-eks-70ce843 COMMAND_BLOCK:
NAME STATUS ROLES AGE VERSION
ip-192-168-13-156.ec2.internal Ready <none> 2m v1.31.14-eks-70ce843 COMMAND_BLOCK:
# Set AWS region (important!)
export AWS_REGION=us-east-1 # Run eks-node-viewer
eks-node-viewer --resources cpu,memory Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
# Set AWS region (important!)
export AWS_REGION=us-east-1 # Run eks-node-viewer
eks-node-viewer --resources cpu,memory COMMAND_BLOCK:
# Set AWS region (important!)
export AWS_REGION=us-east-1 # Run eks-node-viewer
eks-node-viewer --resources cpu,memory CODE_BLOCK:
1 nodes (550m/1930m) 28.5% cpu ββββββββββββββββββββββββββββββββββββββββ $0.042/hour | $30.368/month 540Mi/3376720Ki 16.4% memory βββββββββββββββββββββββββββββββββββββββ
6 pods (0 pending 6 running 6 bound) Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
1 nodes (550m/1930m) 28.5% cpu ββββββββββββββββββββββββββββββββββββββββ $0.042/hour | $30.368/month 540Mi/3376720Ki 16.4% memory βββββββββββββββββββββββββββββββββββββββ
6 pods (0 pending 6 running 6 bound) CODE_BLOCK:
1 nodes (550m/1930m) 28.5% cpu ββββββββββββββββββββββββββββββββββββββββ $0.042/hour | $30.368/month 540Mi/3376720Ki 16.4% memory βββββββββββββββββββββββββββββββββββββββ
6 pods (0 pending 6 running 6 bound) COMMAND_BLOCK:
# Set region
export AWS_REGION=us-east-1 # Deploy nginx with 5 replicas
kubectl create deployment nginx --image=nginx --replicas=5 # Check deployment
kubectl get deployments
kubectl get pods Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
# Set region
export AWS_REGION=us-east-1 # Deploy nginx with 5 replicas
kubectl create deployment nginx --image=nginx --replicas=5 # Check deployment
kubectl get deployments
kubectl get pods COMMAND_BLOCK:
# Set region
export AWS_REGION=us-east-1 # Deploy nginx with 5 replicas
kubectl create deployment nginx --image=nginx --replicas=5 # Check deployment
kubectl get deployments
kubectl get pods CODE_BLOCK:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 5/5 5 5 30s Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 5/5 5 5 30s CODE_BLOCK:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 5/5 5 5 30s CODE_BLOCK:
1 nodes (750m/1930m) 38.9% cpu ββββββββββββββββββββββββββββββββββββββββ $0.042/hour | $30.368/month 840Mi/3376720Ki 25.5% memory ββββββββββββββββββββββββββββββββββββββ
11 pods (0 pending 11 running 11 bound) Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
1 nodes (750m/1930m) 38.9% cpu ββββββββββββββββββββββββββββββββββββββββ $0.042/hour | $30.368/month 840Mi/3376720Ki 25.5% memory ββββββββββββββββββββββββββββββββββββββ
11 pods (0 pending 11 running 11 bound) CODE_BLOCK:
1 nodes (750m/1930m) 38.9% cpu ββββββββββββββββββββββββββββββββββββββββ $0.042/hour | $30.368/month 840Mi/3376720Ki 25.5% memory ββββββββββββββββββββββββββββββββββββββ
11 pods (0 pending 11 running 11 bound) COMMAND_BLOCK:
# Deploy stress test (Terminal 2)
kubectl create deployment stress --image=polinux/stress \ --replicas=3 -- stress --cpu 1 --timeout 3600s # Check pods
kubectl get pods | grep stress Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
# Deploy stress test (Terminal 2)
kubectl create deployment stress --image=polinux/stress \ --replicas=3 -- stress --cpu 1 --timeout 3600s # Check pods
kubectl get pods | grep stress COMMAND_BLOCK:
# Deploy stress test (Terminal 2)
kubectl create deployment stress --image=polinux/stress \ --replicas=3 -- stress --cpu 1 --timeout 3600s # Check pods
kubectl get pods | grep stress CODE_BLOCK:
1 nodes (1550m/1930m) 80.3% cpu ββββββββββββββββββββββββββββββββββββββββ $0.042/hour | $30.368/month 1140Mi/3376720Ki 34.6% memory ββββββββββββββββββββββββββββββββββββββ
14 pods (0 pending 14 running 14 bound) Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
1 nodes (1550m/1930m) 80.3% cpu ββββββββββββββββββββββββββββββββββββββββ $0.042/hour | $30.368/month 1140Mi/3376720Ki 34.6% memory ββββββββββββββββββββββββββββββββββββββ
14 pods (0 pending 14 running 14 bound) CODE_BLOCK:
1 nodes (1550m/1930m) 80.3% cpu ββββββββββββββββββββββββββββββββββββββββ $0.042/hour | $30.368/month 1140Mi/3376720Ki 34.6% memory ββββββββββββββββββββββββββββββββββββββ
14 pods (0 pending 14 running 14 bound) COMMAND_BLOCK:
# Scale nginx to 20 replicas (Terminal 2)
kubectl scale deployment nginx --replicas=20 # Watch pods
kubectl get pods | grep nginx | wc -l Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
# Scale nginx to 20 replicas (Terminal 2)
kubectl scale deployment nginx --replicas=20 # Watch pods
kubectl get pods | grep nginx | wc -l COMMAND_BLOCK:
# Scale nginx to 20 replicas (Terminal 2)
kubectl scale deployment nginx --replicas=20 # Watch pods
kubectl get pods | grep nginx | wc -l CODE_BLOCK:
1 nodes (1850m/1930m) 95.9% cpu ββββββββββββββββββββββββββββββββββββββββ $0.042/hour | $30.368/month 1640Mi/3376720Ki 49.8% memory ββββββββββββββββββββββββββββββββββββββ
29 pods (0 pending 29 running 29 bound) Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
1 nodes (1850m/1930m) 95.9% cpu ββββββββββββββββββββββββββββββββββββββββ $0.042/hour | $30.368/month 1640Mi/3376720Ki 49.8% memory ββββββββββββββββββββββββββββββββββββββ
29 pods (0 pending 29 running 29 bound) CODE_BLOCK:
1 nodes (1850m/1930m) 95.9% cpu ββββββββββββββββββββββββββββββββββββββββ $0.042/hour | $30.368/month 1640Mi/3376720Ki 49.8% memory ββββββββββββββββββββββββββββββββββββββ
29 pods (0 pending 29 running 29 bound) COMMAND_BLOCK:
# Run with pods resource
eks-node-viewer --resources cpu,memory,pods Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
# Run with pods resource
eks-node-viewer --resources cpu,memory,pods COMMAND_BLOCK:
# Run with pods resource
eks-node-viewer --resources cpu,memory,pods CODE_BLOCK:
1 nodes (1850m/1930m) 95.9% cpu ββββββββββββββββββββββββββββββββββββββββ $0.042/hour | $30.368/month 1640Mi/3376720Ki 49.8% memory ββββββββββββββββββββββββββββββββββββββ 29/110 pods 26.4% pods ββββββββββββββββββββββββββββββββββββββ
29 pods (0 pending 29 running 29 bound) Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
1 nodes (1850m/1930m) 95.9% cpu ββββββββββββββββββββββββββββββββββββββββ $0.042/hour | $30.368/month 1640Mi/3376720Ki 49.8% memory ββββββββββββββββββββββββββββββββββββββ 29/110 pods 26.4% pods ββββββββββββββββββββββββββββββββββββββ
29 pods (0 pending 29 running 29 bound) CODE_BLOCK:
1 nodes (1850m/1930m) 95.9% cpu ββββββββββββββββββββββββββββββββββββββββ $0.042/hour | $30.368/month 1640Mi/3376720Ki 49.8% memory ββββββββββββββββββββββββββββββββββββββ 29/110 pods 26.4% pods ββββββββββββββββββββββββββββββββββββββ
29 pods (0 pending 29 running 29 bound) COMMAND_BLOCK:
# Delete deployments (Terminal 2)
kubectl delete deployment nginx stress # Watch pods terminating
kubectl get pods Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
# Delete deployments (Terminal 2)
kubectl delete deployment nginx stress # Watch pods terminating
kubectl get pods COMMAND_BLOCK:
# Delete deployments (Terminal 2)
kubectl delete deployment nginx stress # Watch pods terminating
kubectl get pods CODE_BLOCK:
1 nodes (550m/1930m) 28.5% cpu βββββββββββββββββββββββββββββββββββββββ $0.042/hour | $30.368/month 540Mi/3376720Ki 16.4% memory ββββββββββββββββββββββββββββββββββββββ
6 pods (0 pending 6 running 6 bound) Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
1 nodes (550m/1930m) 28.5% cpu βββββββββββββββββββββββββββββββββββββββ $0.042/hour | $30.368/month 540Mi/3376720Ki 16.4% memory ββββββββββββββββββββββββββββββββββββββ
6 pods (0 pending 6 running 6 bound) CODE_BLOCK:
1 nodes (550m/1930m) 28.5% cpu βββββββββββββββββββββββββββββββββββββββ $0.042/hour | $30.368/month 540Mi/3376720Ki 16.4% memory ββββββββββββββββββββββββββββββββββββββ
6 pods (0 pending 6 running 6 bound) CODE_BLOCK:
eks-node-viewer --resources cpu,memory Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
eks-node-viewer --resources cpu,memory CODE_BLOCK:
eks-node-viewer --resources cpu,memory CODE_BLOCK:
10 nodes (2000m/19300m) 10.4% cpu βββββββββββββββββββββββββββββββββββββββ $0.416/hour | $303.68/month 5400Mi/33767200Ki 16.4% memory ββββββββββββββββββββββββββββββββββββββ
60 pods (0 pending 60 running 60 bound) Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
10 nodes (2000m/19300m) 10.4% cpu βββββββββββββββββββββββββββββββββββββββ $0.416/hour | $303.68/month 5400Mi/33767200Ki 16.4% memory ββββββββββββββββββββββββββββββββββββββ
60 pods (0 pending 60 running 60 bound) CODE_BLOCK:
10 nodes (2000m/19300m) 10.4% cpu βββββββββββββββββββββββββββββββββββββββ $0.416/hour | $303.68/month 5400Mi/33767200Ki 16.4% memory ββββββββββββββββββββββββββββββββββββββ
60 pods (0 pending 60 running 60 bound) COMMAND_BLOCK:
kubectl get pods
# NAME READY STATUS RESTARTS AGE
# my-app-7d8f9c5b-xk2lp 0/1 Pending 0 2m Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
kubectl get pods
# NAME READY STATUS RESTARTS AGE
# my-app-7d8f9c5b-xk2lp 0/1 Pending 0 2m COMMAND_BLOCK:
kubectl get pods
# NAME READY STATUS RESTARTS AGE
# my-app-7d8f9c5b-xk2lp 0/1 Pending 0 2m CODE_BLOCK:
3 nodes (5700m/5790m) 98.4% cpu ββββββββββββββββββββββββββββββββββββββββ $0.126/hour | $91.10/month 11200Mi/10130160Ki 113.2% memory ββββββββββββββββββββββββββββββββββββββββ
85 pods (5 pending 80 running 80 bound) Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
3 nodes (5700m/5790m) 98.4% cpu ββββββββββββββββββββββββββββββββββββββββ $0.126/hour | $91.10/month 11200Mi/10130160Ki 113.2% memory ββββββββββββββββββββββββββββββββββββββββ
85 pods (5 pending 80 running 80 bound) CODE_BLOCK:
3 nodes (5700m/5790m) 98.4% cpu ββββββββββββββββββββββββββββββββββββββββ $0.126/hour | $91.10/month 11200Mi/10130160Ki 113.2% memory ββββββββββββββββββββββββββββββββββββββββ
85 pods (5 pending 80 running 80 bound) CODE_BLOCK:
eks-node-viewer --resources cpu,memory Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
eks-node-viewer --resources cpu,memory CODE_BLOCK:
eks-node-viewer --resources cpu,memory COMMAND_BLOCK:
kubectl scale deployment my-app --replicas=2 Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
kubectl scale deployment my-app --replicas=2 COMMAND_BLOCK:
kubectl scale deployment my-app --replicas=2 COMMAND_BLOCK:
# Show only On-Demand nodes
eks-node-viewer --node-selector karpenter.sh/capacity-type=on-demand # Show only Spot nodes
eks-node-viewer --node-selector karpenter.sh/capacity-type=spot Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
# Show only On-Demand nodes
eks-node-viewer --node-selector karpenter.sh/capacity-type=on-demand # Show only Spot nodes
eks-node-viewer --node-selector karpenter.sh/capacity-type=spot COMMAND_BLOCK:
# Show only On-Demand nodes
eks-node-viewer --node-selector karpenter.sh/capacity-type=on-demand # Show only Spot nodes
eks-node-viewer --node-selector karpenter.sh/capacity-type=spot CODE_BLOCK:
5 nodes (5000m/9650m) 51.8% cpu βββββββββββββββββββββββββββββββββββββββ $0.208/hour | $151.84/month Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
5 nodes (5000m/9650m) 51.8% cpu βββββββββββββββββββββββββββββββββββββββ $0.208/hour | $151.84/month CODE_BLOCK:
5 nodes (5000m/9650m) 51.8% cpu βββββββββββββββββββββββββββββββββββββββ $0.208/hour | $151.84/month CODE_BLOCK:
5 nodes (5000m/9650m) 51.8% cpu ββββββββββββββββββββββββββββββββββββββ $0.062/hour | $45.26/month Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
5 nodes (5000m/9650m) 51.8% cpu ββββββββββββββββββββββββββββββββββββββ $0.062/hour | $45.26/month CODE_BLOCK:
5 nodes (5000m/9650m) 51.8% cpu ββββββββββββββββββββββββββββββββββββββ $0.062/hour | $45.26/month COMMAND_BLOCK:
# Delete deployments
kubectl delete deployment nginx stress # Delete cluster
eksctl delete cluster --name eks-node-viewer-demo --region us-east-1 # Verify deletion
aws eks list-clusters --region us-east-1 Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
# Delete deployments
kubectl delete deployment nginx stress # Delete cluster
eksctl delete cluster --name eks-node-viewer-demo --region us-east-1 # Verify deletion
aws eks list-clusters --region us-east-1 COMMAND_BLOCK:
# Delete deployments
kubectl delete deployment nginx stress # Delete cluster
eksctl delete cluster --name eks-node-viewer-demo --region us-east-1 # Verify deletion
aws eks list-clusters --region us-east-1 COMMAND_BLOCK:
# 1. Install
go install github.com/awslabs/eks-node-viewer/cmd/eks-node-viewer@latest # 2. Set region
export AWS_REGION=us-east-1 # 3. Run
eks-node-viewer --resources cpu,memory # 4. Deploy something
kubectl create deployment nginx --image=nginx --replicas=10 # 5. Watch it update! Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
# 1. Install
go install github.com/awslabs/eks-node-viewer/cmd/eks-node-viewer@latest # 2. Set region
export AWS_REGION=us-east-1 # 3. Run
eks-node-viewer --resources cpu,memory # 4. Deploy something
kubectl create deployment nginx --image=nginx --replicas=10 # 5. Watch it update! COMMAND_BLOCK:
# 1. Install
go install github.com/awslabs/eks-node-viewer/cmd/eks-node-viewer@latest # 2. Set region
export AWS_REGION=us-east-1 # 3. Run
eks-node-viewer --resources cpu,memory # 4. Deploy something
kubectl create deployment nginx --image=nginx --replicas=10 # 5. Watch it update! - Every node in your cluster
- CPU + Memory usage (based on pod requests)
- Instance type (t3.medium, c6a.2xlarge...)
- On-Demand vs Spot
- Cost per hour AND per month
- Pods per node - β
Debugging uneven pod scheduling across nodes
- β
Checking if Karpenter consolidation is actually working
- β
Quick cost sanity check before a prod deploy
- β
Spotting nodes that are packed too tight (or wasting capacity)
- β
Answering "why is my bill so high?" in 30 seconds - Create an EKS cluster (1 node)
- Install eks-node-viewer
- Deploy workloads
- Watch costs in real-time
- See Karpenter-style scaling (optional) - 1 nodes - You have 1 node (t3.medium)
- 550m/1930m - Using 550 millicores out of 1930m available (28.5%)
- 540Mi/3376720Ki - Using 540MB out of 3.3GB RAM (16.4%)
- $0.042/hour | $30.368/month - This is costing you $30/month
- 6 pods - System pods (coredns, kube-proxy, aws-node, metrics-server) - CPU usage: 28.5% β 38.9%
- Memory usage: 16.4% β 25.5%
- Pods: 6 β 11 (added 5 nginx pods)
- Cost: Still $30/month (same node) - CPU usage: 38.9% β 80.3% π₯
- Memory usage: 25.5% β 34.6%
- Pods: 11 β 14 (added 3 stress pods)
- Cost: Still $30/month (same node, but now heavily utilized) - CPU usage: 80.3% β 95.9% π¨
- Memory usage: 34.6% β 49.8%
- Pods: 14 β 29 (added 15 more nginx pods)
- Node is almost maxed out! - 29/110 pods - You have 29 pods running, max capacity is 110 pods per node
- 26.4% pods - You're using 26% of pod capacity - CPU: 95.9% β 28.5%
- Memory: 49.8% β 16.4%
- Pods: 29 β 6
- Cost: Still $30/month (node still exists) - Open AWS Console
- Go to EC2 β Instances
- Filter by cluster
- Manually check instance types
- Look up pricing
- Calculate total
- Check utilization in Grafana
- Realize you have 10 nodes at 20% utilization π± - After 30 seconds (Karpenter's default consolidation delay)
- You should see nodes disappear
- Cost should decrease - GitHub: https://github.com/awslabs/eks-node-viewer
- Karpenter Docs: https://karpenter.sh
- EKS Best Practices: https://aws.github.io/aws-eks-best-practices/
- AWS Pricing: https://aws.amazon.com/ec2/pricing/
how-totutorialguidedev.toaimllinuxserverdnsswitchnginxnodekubernetesgitgithub