chore(deps): bump karpenter to 1.14.1 and fix templates - #26
Open
BetoFandino wants to merge 1 commit into
Open
Conversation
…lts generic and bump version
BetoFandino
force-pushed
the
JF/karpenter-bump
branch
from
September 10, 2026 13:57
c113cbd to
ce4d0fc
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
The chart's Karpenter templates render APIs that Karpenter removed in v1.0, so
karpenter.enabled: truecannot work onmain. This rewrites both templates onto thev1API,replaces the values contract with a pass-through one, and bumps the subchart
1.0.8→1.14.1.The bug
The pinned subchart (
1.0.8) ships CRDs that only servev1, but the templates still render thealpha APIs:
provisioner.yamlkarpenter.sh/v1alpha5·Provisionernode-template.yamlkarpenter.k8s.aws/v1alpha1·AWSNodeTemplateBoth fail with
no matches for kind. The subchart was moved to 1.x at some point without migratingthe templates.
The values have the same problem, more quietly.
values.yamlsetskarpenter.settings.aws.*, butKarpenter flattened those to
settings.clusterName/settings.interruptionQueuein v0.32 andremoved
defaultInstanceProfileoutright. The Karpenter chart ships novalues.schema.json, sonothing errors — the keys are silently ignored and the controller comes up with no cluster name and
no interruption queue.
What changed
templates/karpenter/provisioner.yaml→nodepool.yaml, renderingkarpenter.sh/v1NodePool.templates/karpenter/node-template.yaml→ec2nodeclass.yaml, renderingkarpenter.k8s.aws/v1EC2NodeClass.values.yaml: new contract, described below.Chart.yaml: karpenter1.0.8→1.14.1; chart version bumped.README.md: the Karpenter section documented keys that no longer exist and stated that multiplenode pools were unsupported. Both corrected, plus the scope note on node-based scaling, which the
chart now does support.
The values contract
Both resources are passed through verbatim.
specis rendered withtoYaml; the templates donot name a single field of the Karpenter API. Any field the API accepts — including ones added in
future releases — works without a chart change, and the upstream Karpenter docs apply directly with
no translation layer.
ec2NodeClassesandnodePoolsare maps keyed by resource name, so any number of each issupported and Helm's map merge lets an override carry only the keys that differ:
Beyond rendering, the chart does three things, each with an escape hatch:
discoverysubnetSelectorTerms/securityGroupSelectorTermswith thekarpenter.sh/discoverytag; defaultssettings.clusterNamezonestopology.kubernetes.io/zonerequirement to each NodePoolzonesdefaultEC2NodeClassnodeClassRefFour render-time
fails cover what the API requires and what the apiserver would otherwise reportbadly or late: a node class with neither
rolenorinstanceProfile, a node class withoutamiSelectorTerms, a pool with nonodeClassRefand nodefaultEC2NodeClass, and a poolreferencing a node class that was never declar
Both maps are empty by default. A capacity strategy depends on the workload and the account it
runs in, so the chart does not presume one;
values.yamlcarries a commented single-pool example.karpenter.enabled: truewith nothing declared renders the controller and no custom resources.🔴 Breaking changes
The old keys are silently ignored today, so an getting a controller with
no configuration. They now have to be migrated:
karpenter.settings.aws.clusterNamekarpenter.settings.clusterNamekarpenter.settings.aws.interruptionQueueNamekarpenter.settings.interruptionQueuekarpenter.settings.aws.defaultInstanceProfises.<name>.spec.roleor.instanceProfilekarpenter.nodeTemplate.*karpenter.ec2NodeClasses.<name>.spec.*karpenter.provisioner.*karpenter.nodePools.<name>.spec.*karpenter.provisioner.spec.requirementskarpenter.nodePools.<name>.spec.template.spec.requirementskarpenter.provisioner.spec.limits.resourceskarpenter.nodePools.<name>.spec.limitskarpenter.provisioner.spec.ttlSecondsUntilExpired…spec.template.spec.expireAfterkarpenter.provisioner.spec.ttlSecondsAfterEmpty…spec.disruption.consolidateAfterTwo things to be deliberate about when migrating:
roleorinstanceProfileis now required — the render fails without it instead ofprovisioning nothing.
ttlSecondsAfterEmptyonly reclaimed **emptdationPolicy: WhenEmpty. The commented example usesWhenEmptyOrUnderutilized`, the API default, which also consolidatesnodes that are running workloads. Copying the example changes that behaviour.
Testing
Rendered against the live Karpenter configuration of four production EKS clusters in different
accounts, regions, AMIs and disk sizes.
Also verified: all four
failguards fire with an actionable message;karpenter.enabled: falserenders nothing;
enabled: truewith no declasources; and the commentedexample renders when uncommented.
Notes for operators upgrading
crds/, which is install-only. Going from1.0.8to1.14.1adds two CRDs (nodeoverlays,capacitybuffers) and changes the existingthree. They have to be applied through the st, which this chart does
not include.
ec2:DescribeInstanceStatusis required since Karpenter 1.12. Without it the controller logs a403 every minute and carries on. With it, instances failing EC2 status checks get
ForcefulTermination, which bypasses PDB-respecting eviction and disruption budgets. Worthgranting deliberately, separately from this