Skip to content

Commit 204c66e

Browse files
ostermanclaudeCopilot
authored
Add blog post: Why We Recommend Managed Node Groups Over Fargate for EKS Add-Ons (#826)
Co-authored-by: Claude <[email protected]> Co-authored-by: Copilot <[email protected]>
1 parent dd0a742 commit 204c66e

File tree

1 file changed

+171
-0
lines changed

1 file changed

+171
-0
lines changed
Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
---
2+
title: "Why We Recommend Managed Node Groups Over Fargate for EKS Add-Ons"
3+
description: "For production EKS clusters, a small managed node group provides reliability, cost efficiency, and automation—without Fargate's hidden complexity and bootstrap deadlock."
4+
tags: [eks, kubernetes, karpenter, fargate, managed node groups, aws, best practices]
5+
date: 2025-10-15
6+
authors: [osterman]
7+
---
8+
import FeatureList from '@site/src/components/FeatureList';
9+
import Intro from '@site/src/components/Intro';
10+
11+
<Intro>
12+
When simplicity meets automation, sometimes it's the hidden complexity that bites back.
13+
</Intro>
14+
15+
For a while, running Karpenter on AWS Fargate sounded like a perfect solution. No nodes to manage, automatic scaling, and no EC2 lifecycle headaches. The [AWS EKS Best Practices Guide](https://aws.github.io/aws-eks-best-practices/karpenter/#run-the-karpenter-controller-on-eks-fargate-or-on-a-worker-node-that-belongs-to-a-node-group) and [Karpenter's official documentation](https://karpenter.sh/docs/getting-started/getting-started-with-karpenter/) both present Fargate as a viable option for running the Karpenter controller.
16+
17+
But in practice, that setup started to cause problems for certain EKS add-ons. Over time, those lessons led us — and our customers — to recommend using a small managed node group (MNG) instead of relying solely on Fargate.
18+
19+
**This recommendation diverges from some official AWS guidance**, and we acknowledge that. Here's why we made this decision.
20+
21+
## Why Fargate Was Attractive (and Still Is, Sometimes)
22+
23+
The appeal of Fargate for Karpenter is understandable:
24+
25+
<FeatureList>
26+
- No need to bootstrap a managed node group before deploying Karpenter
27+
- Simpler initial setup for teams not using Infrastructure-as-Code frameworks
28+
- Karpenter's early versions had limited integration with managed node pools
29+
- It showcased Karpenter's capabilities in the most dramatic way possible
30+
</FeatureList>
31+
32+
For teams deploying clusters manually or with basic tooling, Fargate eliminates several complex setup steps. But when you're using sophisticated Infrastructure-as-Code like [Cloud Posse's Terraform components](https://docs.cloudposse.com/components/), that initial complexity is already handled—and the operational benefits of a managed node group become far more valuable.
33+
34+
## The Problem with "No Nodes" (and the Terraform Catch-22)
35+
36+
EKS cluster creation with Terraform requires certain managed add-ons — like CoreDNS or the EBS CSI driver — to become active before Terraform considers the cluster complete.
37+
38+
But Fargate pods don't exist until there's a workload that needs them. That means when Terraform tries to deploy add-ons, there are no compute nodes for the add-ons to run on. Terraform waits… and waits… until the cluster creation fails.
39+
40+
Terraform enforces a strict dependency model: it won't complete a resource until it's ready. Without a static node group, Terraform can't successfully create the cluster (because the add-ons can't start). And without those add-ons running, Karpenter can't launch its first node (because Karpenter itself is waiting on the cluster to stabilize).
41+
42+
This circular dependency means your beautiful "fully automated" Fargate-only cluster gets stuck in the most ironic place: **bootstrap deadlock**.
43+
44+
You can manually retry or patch things later, but that defeats the purpose of automation. We build for repeatability — not babysitting.
45+
46+
## The Hidden Cost of "Serverless Nodes"
47+
48+
Even after getting past cluster creation, there are subtle but serious issues with high availability.
49+
50+
By AWS and Cloud Posse best practices, production-grade clusters should span three availability zones, with cluster-critical services distributed across them.
51+
52+
However, during initial scheduling with **managed node groups**, Karpenter might spin up just one node large enough to fit all your add-on pods — even if they request three replicas with anti-affinity rules. Kubernetes will happily co-locate them all on that single node.
53+
54+
Once they're running, those pods don't move automatically, even as the cluster grows. The result?
55+
56+
**A deceptively healthy cluster with all your CoreDNS replicas living on the same node in one AZ — a single point of failure disguised as a distributed system.**
57+
58+
While [topologySpreadConstraints](https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/) can help encourage multi-AZ distribution, they don't guarantee it during the critical cluster bootstrap phase when Karpenter is creating its first nodes.
59+
60+
## The Solution: A Minimal Managed Node Pool
61+
62+
Our solution is simple:
63+
64+
**Deploy a tiny managed node group — one node per availability zone — as part of your base cluster.**
65+
66+
<FeatureList>
67+
- This provides a home for cluster-critical add-ons during creation
68+
- It ensures that CoreDNS, EBS CSI, and other vital components are naturally distributed across AZs
69+
- It gives Karpenter a stable platform to run on
70+
- And it eliminates the bootstrap deadlock problem entirely
71+
</FeatureList>
72+
73+
You can even disable autoscaling for this node pool. One node per AZ is enough.
74+
75+
Think of it as your cluster's heartbeat — steady, predictable, and inexpensive.
76+
77+
## Additional Fargate Constraints
78+
79+
Beyond the HA challenges, [Fargate has architectural constraints](https://docs.aws.amazon.com/eks/latest/userguide/fargate-pod-configuration.html) that can affect cluster add-ons:
80+
81+
<FeatureList>
82+
- Each Fargate pod runs on its own isolated compute resource (one pod per node)
83+
- No support for EBS-backed dynamic PVCs; only EFS CSI volumes are supported
84+
- Fixed CPU and memory configurations with coarse granularity
85+
- 256 MB memory overhead for Kubernetes components
86+
</FeatureList>
87+
88+
While these constraints don't necessarily prevent Fargate from working, they add complexity when running cluster-critical infrastructure that needs precise resource allocation and high availability guarantees.
89+
90+
## Cost and Flexibility
91+
92+
Fargate offers convenience, but at a premium. A pod requesting 2 vCPUs and 4 GiB of memory costs about **$0.098/hour**, compared to **$0.076/hour** for an equivalent EC2 c6a.large instance.
93+
94+
And because [Fargate bills in coarse increments](https://docs.aws.amazon.com/eks/latest/userguide/fargate-pod-configuration.html), you often overpay for partial capacity.
95+
96+
By contrast, the hybrid approach unlocks significant advantages:
97+
98+
<FeatureList>
99+
- Static MNG with On-Demand instances provides a stable foundation for cluster add-ons
100+
- Use cost-effective Graviton instances (c7g.medium) to reduce baseline costs
101+
- Karpenter provisions Spot instances exclusively for application workloads (not add-ons)
102+
- Achieve cost savings on application pods while maintaining reliability for cluster infrastructure
103+
</FeatureList>
104+
105+
The result: **stable cluster services on On-Demand, cost-optimized applications on Spot**.
106+
107+
## The Evolution of Karpenter's Recommendations
108+
109+
Interestingly, the Karpenter team's own guidance has evolved over time. [Karpenter's current getting started guide](https://karpenter.sh/docs/getting-started/getting-started-with-karpenter/) now defaults to using **EKS Managed Node Groups** in its example configurations, with Fargate presented as an alternative that requires uncommenting configuration sections.
110+
111+
While we can't pinpoint exactly when this shift occurred, it suggests the Karpenter team recognized that managed node groups provide a more reliable foundation for most production use cases.
112+
113+
## Lessons Learned
114+
115+
At Cloud Posse, we love automation — but we love reliability through simplicity even more.
116+
117+
Running Karpenter on Fargate works for proof-of-concepts or ephemeral clusters.
118+
119+
But for production systems where uptime and high availability matter, a hybrid model is the clear winner:
120+
121+
<FeatureList>
122+
- Static MNG with On-Demand instances for cluster-critical add-ons (CoreDNS, Karpenter, etc.)
123+
- Karpenter provisioning Spot instances for dynamic application workloads
124+
- Fargate only when you truly need pod-level isolation
125+
</FeatureList>
126+
127+
It's not about Fargate being bad — it's about knowing where it fits in your architecture.
128+
129+
## When Fargate-Only Might Still Work
130+
131+
To be fair, there are scenarios where running Karpenter on Fargate might make sense:
132+
133+
<FeatureList>
134+
- Long-lived development environments where the $120/month MNG baseline cost matters more than availability
135+
- Clusters deployed manually (not via Terraform) where bootstrap automation isn't critical
136+
- Proof-of-concept deployments demonstrating Karpenter's capabilities
137+
- Organizations that have accepted the operational trade-offs and built workarounds
138+
</FeatureList>
139+
140+
**However**, be aware that development clusters that are frequently rebuilt will hit the Terraform bootstrap deadlock problem more often—making automation failures a regular occurrence rather than a one-time setup issue.
141+
142+
## Your Mileage May Vary
143+
144+
It's worth noting that [experienced practitioners in the SweetOps community](https://sweetops.slack.com/) have successfully run Karpenter on Fargate for years across multiple production clusters. Their setups work, and they've built processes around the constraints.
145+
146+
This proves our recommendation isn't absolute—some teams make Fargate work through careful configuration and accepted trade-offs. However, these same practitioners acknowledged they'd likely choose MNG if starting fresh today with modern tooling.
147+
148+
> "Karpenter doesn't use voting. Leader election uses Kubernetes leases. There's no strict technical requirement to have three pods — unless you actually care about staying up."
149+
>
150+
> — Ihor Urazov, SweetOps Slack
151+
152+
That's the key insight. The technical requirements are flexible—it's your operational requirements that determine the right choice.
153+
154+
If staying up matters, if automation matters, if avoiding manual intervention matters, then give your cluster something solid to stand on. A small, stable managed node pool does exactly that.
155+
156+
## What About EKS Auto Mode?
157+
158+
It's worth mentioning that AWS introduced [EKS Auto Mode](https://docs.aws.amazon.com/eks/latest/userguide/automode.html) in December 2024, which takes a fundamentally different approach to solving these problems.
159+
160+
EKS Auto Mode runs Karpenter and other critical cluster components (like the EBS CSI driver and Load Balancer Controller) **off-cluster** as AWS-managed services. This elegantly sidesteps the bootstrap deadlock problem entirely—there's no chicken-and-egg dependency because the control plane components don't need to run inside your cluster.
161+
162+
The cluster starts with zero nodes and automatically provisions compute capacity as workloads are scheduled. While this solves the technical bootstrap challenge we've discussed, it comes with trade-offs:
163+
164+
<FeatureList>
165+
- Additional 12-15% cost premium on top of EC2 instance costs
166+
- Lock-in to AWS VPC CNI (can't use alternatives like Cilium or Calico)
167+
- Less control over cluster infrastructure configuration
168+
- Available only for Kubernetes 1.29+ and not in all AWS regions
169+
</FeatureList>
170+
171+
For organizations willing to accept these constraints in exchange for fully managed operations, EKS Auto Mode may address many of the concerns raised in this post. However, for teams requiring fine-grained control, cost optimization, or running on older Kubernetes versions, the MNG + Karpenter approach remains highly relevant.

0 commit comments

Comments
 (0)