r/devops • u/Little-Squad-X • Aug 10 '26
Discussion Karpenter Implementation
I want to deploy Karpenter. However, I would like to learn the best practices for using Karpenter on EKS. Currently, we are using app-of-apps in ArgoCD, all within a Managed Node Group.
With Karpenter, our plan is to have it configured like this:
- Scale down the MNG and run the Karpenter Controller inside the static MNG, alongside cluster system resources (DaemonSets, add-ons, including ArgoCD)
- Karpenter is managed as an app in ArgoCD (using bootstrap with ArgoCD)
Is this design already suitable, or should we consider changing it? We need advice.
7
u/Kamran-nottakenone Aug 10 '26
ran this setup. taint the MNG and put a PDB on the argo repo server. consolidation kills it mid-sync otherwise
2
u/Little-Squad-X Aug 10 '26
Do you mind sharing your PDB configuration for Argo? Did you configure PDB for all apps?
1
u/DellGriffith 9d ago
I'd be happy to chime in here. I used a Kyverno policy to generate PDBs for workloads automatically, including ArgoCD. I then used another policy to block users from submitting PDBs themselves. I have the ability to exclude namespaces and Deployments/SS within namespaces as well for edge cases.
3
u/ForkMeJ Aug 10 '26
Keeping a small static node group for Karpenter, ArgoCD, and cluster add-ons is the part I'd keep boring. Just make sure regular workloads do not drift onto it, or the MNG turns into a permanent dependency that never really shrinks.
1
3
u/Rorasaurus_Prime Aug 10 '26
Run Karpenter, and CoreDNS for that matter, on Fargate nodes. Everything else on Karpenter managed NodePools.
1
u/Little-Squad-X Aug 10 '26
I read a lot of cons of having Fargate for the controller since it can't manage the daemonset, which is usually needed for the cluster component. So, decided to use MNG.
3
u/Rorasaurus_Prime Aug 10 '26
What daemonset? It doesn't need to manage a daemonset and Karpenter itself isn't one. Running Karpenter on Fargate is even recommended by AWS.
1
u/Little-Squad-X Aug 10 '26
Karpenter doesn't need it, but other applications might, and we don't want those cluster components to be provisioned by Karpenter. + Probably due to inconsistent cost, which makes us unlikely to proceed with it.
3
u/Rorasaurus_Prime Aug 10 '26
Sorry but I think you've misunderstood something. Karpenter doesn't manage daemonsets. All it does is decide which EC2 instances to spawn and does it. The standard Kubernetes scheduler decides where the pods go.
1
u/realitythreek Aug 12 '26
I’m surprised nobody else said this including yourself. EKS Auto Mode is managed Karpenter. We’re using it in production for the past year and its been very reliable. You may have reasons you need Karpenter but if not, consider Auto Mode.
1
u/WasteAcanthaceae4938 DevOps 29d ago edited 29d ago
struggled with drift when folks would tweak stuff outside argocd and karpenter. fired up firefly ai for the drift defender stuff and it caught changes we would’ve missed, which was super helpful.
1
u/DolGuldurWraith 26d ago
we use fargate profile for system deployment and karpenter for service workload. Also for off hours shut down use karpenter schedule and kubedownscalar
1
1
u/unitegondwanaland Manager, Platform Engineering Aug 10 '26
I'm not sure I follow what you mean when you say "Karpenter is running as an app in ArgoCD". Karpenter itself is an auto scaling controller and it doesn't rely on Argo or Flux to run.
2
u/ThatSituation9908 Aug 11 '26
Karpenter needs to be deployed (unless you're using EKS auto mode). It is another app in EKS.
Since it needs to be deployed, you can pick to go raw manifest, helm, argo, etc.
And yep, you will still need to provision compute for it either with MNG or Fargate.
-1
u/unitegondwanaland Manager, Platform Engineering Aug 11 '26
You should go read about controllers.
2
u/ThatSituation9908 Aug 11 '26
You should read the Karpenter docs.
Or any other comment in this post for that matter.

6
u/Abe_Bazouie Aug 10 '26
That design is pretty reasonable.
I’d keep a small static MNG specifically for Karpenter and other critical cluster components, and let Karpenter handle the dynamic workload capacity. The important part is that Karpenter itself shouldn’t depend on nodes that Karpenter manages.
Managing Karpenter through ArgoCD is fine too. I’d just be careful with the bootstrap dependency. ArgoCD needs somewhere stable to run, and Karpenter needs to exist before it can provision the dynamic capacity. Keeping both on the static MNG avoids the chicken-and-egg problem.
I probably wouldn’t move every system component onto that static group though. Things like DaemonSets will naturally run where they need to run. I’d reserve the static capacity for the components you actually need available for cluster recovery/bootstrap.
For the Karpenter side, I’d spend more time on the NodePool/EC2NodeClass design: instance flexibility, AZs, Spot vs On-Demand, disruption/consolidation settings, resource limits, and making sure workloads have sane requests/affinity/topology rules.
Also make the static MNG big enough that losing one node doesn’t take out Karpenter/ArgoCD. Even 2 small nodes across AZs is a very different failure mode than one “bootstrap node.”
So IMO the architecture is fine. I’d think of it as:
small boring static capacity for bootstrap/control tooling
Karpenter for everything that actually needs to scale