From 199c361959a7ee5124ee73ad4c0ff4a74c52c677 Mon Sep 17 00:00:00 2001 From: warren Date: Mon, 31 Aug 2026 03:49:28 +0800 Subject: [PATCH] fix: use interruptionQueue Helm value for Karpenter >= v0.33.0 The Karpenter chart renamed its interruption queue Helm value when it flattened `settings`. Charts before v0.33.0 read `settings.aws.interruptionQueueName`; the flattened layout reads `settings.interruptionQueue`. eksctl built a single `settings` map and re-nested it under `aws` for older charts, so both version branches shared the `interruptionQueueName` spelling. On charts >= v0.33.0 Helm silently ignores that unknown key, so `INTERRUPTION_QUEUE` is never set on the Karpenter pod and spot interruption handling is disabled with no error surfaced to the user. Instances are terminated without Karpenter draining them first. Select the queue key per version branch instead of sharing one map: the `< 0.33.0` path keeps `settings.aws.interruptionQueueName` unchanged, and the `>= 0.33.0` path now sends `settings.interruptionQueue`. No API, flag or documentation change; `withSpotInterruptionQueue` is untouched. The existing `>= 0.33.0` unit expectation encoded the wrong key, so it is corrected to the key the chart actually reads. The two `settings.aws.interruptionQueueName` specs are left as-is and act as the regression guard for the legacy contract. Signed-off-by: warren --- pkg/karpenter/karpenter.go | 39 +++++++++++++++++++++------------ pkg/karpenter/karpenter_test.go | 7 +++++- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/pkg/karpenter/karpenter.go b/pkg/karpenter/karpenter.go index fd8293664b..399862701e 100644 --- a/pkg/karpenter/karpenter.go +++ b/pkg/karpenter/karpenter.go @@ -30,6 +30,7 @@ const ( serviceAccountName = "name" settings = "settings" interruptionQueueName = "interruptionQueueName" + interruptionQueue = "interruptionQueue" ) // Options contains values which Karpenter uses to configure the installation. @@ -72,29 +73,39 @@ func (k *Installer) Install(ctx context.Context, serviceAccountRoleARN string, i serviceAccountName: DefaultServiceAccountName, } + settingsValues := map[string]interface{}{ + defaultInstanceProfile: instanceProfileName, + clusterName: k.ClusterConfig.Metadata.Name, + clusterEndpoint: k.ClusterConfig.Status.Endpoint, + } + + // The Karpenter chart renamed the interruption queue Helm value when it + // flattened `settings`: charts before v0.33.0 read + // `settings.aws.interruptionQueueName`, while the flattened layout reads + // `settings.interruptionQueue`. A flattened chart silently ignores the old + // spelling, which leaves INTERRUPTION_QUEUE unset on the Karpenter pod and + // disables spot interruption handling without reporting an error. + version := k.ClusterConfig.Karpenter.Version + compareVersions, err := utils.CompareVersions(version, "0.33.0") + if err == nil && compareVersions < 0 { + settingsValues[interruptionQueueName] = k.ClusterConfig.Metadata.Name + settingsValues = map[string]interface{}{ + aws: settingsValues, + } + } else { + settingsValues[interruptionQueue] = k.ClusterConfig.Metadata.Name + } + values := map[string]interface{}{ clusterName: k.ClusterConfig.Metadata.Name, clusterEndpoint: k.ClusterConfig.Status.Endpoint, aws: map[string]interface{}{ defaultInstanceProfile: instanceProfileName, }, - settings: map[string]interface{}{ - defaultInstanceProfile: instanceProfileName, - clusterName: k.ClusterConfig.Metadata.Name, - clusterEndpoint: k.ClusterConfig.Status.Endpoint, - interruptionQueueName: k.ClusterConfig.Metadata.Name, - }, + settings: settingsValues, serviceAccount: serviceAccountMap, } - version := k.ClusterConfig.Karpenter.Version - compareVersions, err := utils.CompareVersions(version, "0.33.0") - if err == nil && compareVersions < 0 { - values[settings] = map[string]interface{}{ - aws: values[settings], - } - } - registryClient, err := registry.NewClient( registry.ClientOptEnableCache(true), ) diff --git a/pkg/karpenter/karpenter_test.go b/pkg/karpenter/karpenter_test.go index 34fd944687..5d175936ff 100644 --- a/pkg/karpenter/karpenter_test.go +++ b/pkg/karpenter/karpenter_test.go @@ -90,7 +90,12 @@ var _ = Describe("Install", func() { defaultInstanceProfile: "dummy", clusterName: cfg.Metadata.Name, clusterEndpoint: cfg.Status.Endpoint, - interruptionQueueName: cfg.Metadata.Name, + // The flattened Karpenter chart names this value + // "interruptionQueue", not "interruptionQueueName" -- + // see charts/karpenter/values.yaml from v0.32.0 onwards. + // Asserted as a literal rather than via a constant so the + // test pins the key the chart actually reads. + "interruptionQueue": cfg.Metadata.Name, }, } Expect(opts.Values[settings]).To(Equal(values[settings]))