diff --git a/pkg/ami/api.go b/pkg/ami/api.go
index e405fbe4e9..3a5341a450 100644
--- a/pkg/ami/api.go
+++ b/pkg/ami/api.go
@@ -53,7 +53,7 @@ func Use(ctx context.Context, ec2API awsapi.EC2, ng *api.NodeGroupBase) error {
return fmt.Errorf("%q is an instance-store AMI and EBS block device mappings are not supported for instance-store AMIs", ng.AMI)
case ec2types.DeviceTypeEbs:
- if ng.AMIFamily != api.NodeImageFamilyBottlerocket && !api.IsSetAndNonEmptyString(ng.VolumeName) {
+ if !api.IsBottlerocketImage(ng.AMIFamily) && !api.IsSetAndNonEmptyString(ng.VolumeName) {
// Volume name is preset for Bottlerocket.
ng.VolumeName = image.RootDeviceName
}
diff --git a/pkg/ami/ssm_resolver.go b/pkg/ami/ssm_resolver.go
index e37fd1d104..58d6ec25f9 100644
--- a/pkg/ami/ssm_resolver.go
+++ b/pkg/ami/ssm_resolver.go
@@ -84,6 +84,8 @@ func MakeSSMParameterName(version, instanceType, imageFamily string) (string, er
return fmt.Sprintf("/aws/service/ami-windows-latest/Windows_Server-2025-English-%s-EKS_Optimized-%s/%s", windowsAmiType(imageFamily), version, fieldName), nil
case api.NodeImageFamilyBottlerocket:
return fmt.Sprintf("/aws/service/bottlerocket/aws-k8s-%s/%s/latest/%s", imageType(imageFamily, instanceType, version), instanceEC2ArchName(instanceType), fieldName), nil
+ case api.NodeImageFamilyBottlerocketFips:
+ return fmt.Sprintf("/aws/service/bottlerocket/aws-k8s-%s-fips/%s/latest/%s", imageType(api.NodeImageFamilyBottlerocket, instanceType, version), instanceEC2ArchName(instanceType), fieldName), nil
case api.NodeImageFamilyUbuntu2004,
api.NodeImageFamilyUbuntuPro2004,
api.NodeImageFamilyUbuntu2204,
@@ -148,6 +150,10 @@ func MakeManagedSSMParameterName(version string, amiType ekstypes.AMITypes) stri
return fmt.Sprintf("/aws/service/bottlerocket/aws-k8s-%s/arm64/latest/image_version", version)
case ekstypes.AMITypesBottlerocketX8664, ekstypes.AMITypesBottlerocketX8664Nvidia:
return fmt.Sprintf("/aws/service/bottlerocket/aws-k8s-%s/x86_64/latest/image_version", version)
+ case ekstypes.AMITypesBottlerocketArm64Fips, ekstypes.AMITypesBottlerocketArm64NvidiaFips:
+ return fmt.Sprintf("/aws/service/bottlerocket/aws-k8s-%s-fips/arm64/latest/image_version", version)
+ case ekstypes.AMITypesBottlerocketX8664Fips, ekstypes.AMITypesBottlerocketX8664NvidiaFips:
+ return fmt.Sprintf("/aws/service/bottlerocket/aws-k8s-%s-fips/x86_64/latest/image_version", version)
default:
return ""
}
diff --git a/pkg/ami/ssm_resolver_test.go b/pkg/ami/ssm_resolver_test.go
index 69807ef90c..e085214952 100644
--- a/pkg/ami/ssm_resolver_test.go
+++ b/pkg/ami/ssm_resolver_test.go
@@ -814,11 +814,7 @@ var _ = Describe("AMI Auto Resolution", func() {
It("should support SSM parameter generation for all AMI types but Windows", func() {
var eksAMIType ekstypes.AMITypes
for _, amiType := range eksAMIType.Values() {
- if amiType == ekstypes.AMITypesCustom || strings.HasPrefix(string(amiType), "WINDOWS_") ||
- // TODO: remove this condition after support for Bottlerocket FIPS AMI types.
- amiType == ekstypes.AMITypesBottlerocketArm64Fips || amiType == ekstypes.AMITypesBottlerocketX8664Fips ||
- // TODO: remove this condition after support for Bottlerocket Nvidia FIPS AMI types.
- amiType == ekstypes.AMITypesBottlerocketArm64NvidiaFips || amiType == ekstypes.AMITypesBottlerocketX8664NvidiaFips {
+ if amiType == ekstypes.AMITypesCustom || strings.HasPrefix(string(amiType), "WINDOWS_") {
continue
}
ssmParameterName := MakeManagedSSMParameterName(api.Version1_31, amiType)
diff --git a/pkg/apis/eksctl.io/v1alpha5/amitype.go b/pkg/apis/eksctl.io/v1alpha5/amitype.go
index 1be6b45739..5d5992f9c1 100644
--- a/pkg/apis/eksctl.io/v1alpha5/amitype.go
+++ b/pkg/apis/eksctl.io/v1alpha5/amitype.go
@@ -40,6 +40,14 @@ func GetAMIType(amiFamily, instanceType string, strict bool) ekstypes.AMITypes {
ARM64Nvidia: ekstypes.AMITypesBottlerocketArm64Nvidia,
ARM64Neuron: ekstypes.AMITypesBottlerocketArm64,
},
+ NodeImageFamilyBottlerocketFips: {
+ X86x64: ekstypes.AMITypesBottlerocketX8664Fips,
+ X86Nvidia: ekstypes.AMITypesBottlerocketX8664NvidiaFips,
+ X86Neuron: ekstypes.AMITypesBottlerocketX8664Fips,
+ ARM: ekstypes.AMITypesBottlerocketArm64Fips,
+ ARM64Nvidia: ekstypes.AMITypesBottlerocketArm64NvidiaFips,
+ ARM64Neuron: ekstypes.AMITypesBottlerocketArm64Fips,
+ },
NodeImageFamilyWindowsServer2019FullContainer: {
X86x64: ekstypes.AMITypesWindowsFull2019X8664,
X86Nvidia: ekstypes.AMITypesWindowsFull2019X8664,
diff --git a/pkg/apis/eksctl.io/v1alpha5/assets/schema.json b/pkg/apis/eksctl.io/v1alpha5/assets/schema.json
index df1142e1fa..2d71f92923 100755
--- a/pkg/apis/eksctl.io/v1alpha5/assets/schema.json
+++ b/pkg/apis/eksctl.io/v1alpha5/assets/schema.json
@@ -1657,8 +1657,8 @@
},
"amiFamily": {
"type": "string",
- "description": "Valid variants are: `\"AmazonLinux2023\"` (default), `\"AmazonLinux2\"`, `\"UbuntuPro2604\"`, `\"Ubuntu2604\"`, `\"UbuntuPro2404\"`, `\"Ubuntu2404\"`, `\"UbuntuPro2204\"`, `\"Ubuntu2204\"`, `\"UbuntuPro2004\"`, `\"Ubuntu2004\"`, `\"Bottlerocket\"`, `\"WindowsServer2019CoreContainer\"`, `\"WindowsServer2019FullContainer\"`, `\"WindowsServer2022CoreContainer\"`, `\"WindowsServer2022FullContainer\"`, `\"WindowsServer2025CoreContainer\"`, `\"WindowsServer2025FullContainer\"`.",
- "x-intellij-html-description": "Valid variants are: "AmazonLinux2023" (default), "AmazonLinux2", "UbuntuPro2604", "Ubuntu2604", "UbuntuPro2404", "Ubuntu2404", "UbuntuPro2204", "Ubuntu2204", "UbuntuPro2004", "Ubuntu2004", "Bottlerocket", "WindowsServer2019CoreContainer", "WindowsServer2019FullContainer", "WindowsServer2022CoreContainer", "WindowsServer2022FullContainer", "WindowsServer2025CoreContainer", "WindowsServer2025FullContainer".",
+ "description": "Valid variants are: `\"AmazonLinux2023\"` (default), `\"AmazonLinux2\"`, `\"UbuntuPro2604\"`, `\"Ubuntu2604\"`, `\"UbuntuPro2404\"`, `\"Ubuntu2404\"`, `\"UbuntuPro2204\"`, `\"Ubuntu2204\"`, `\"UbuntuPro2004\"`, `\"Ubuntu2004\"`, `\"Bottlerocket\"`, `\"BottlerocketFips\"`, `\"WindowsServer2019CoreContainer\"`, `\"WindowsServer2019FullContainer\"`, `\"WindowsServer2022CoreContainer\"`, `\"WindowsServer2022FullContainer\"`, `\"WindowsServer2025CoreContainer\"`, `\"WindowsServer2025FullContainer\"`.",
+ "x-intellij-html-description": "Valid variants are: "AmazonLinux2023" (default), "AmazonLinux2", "UbuntuPro2604", "Ubuntu2604", "UbuntuPro2404", "Ubuntu2404", "UbuntuPro2204", "Ubuntu2204", "UbuntuPro2004", "Ubuntu2004", "Bottlerocket", "BottlerocketFips", "WindowsServer2019CoreContainer", "WindowsServer2019FullContainer", "WindowsServer2022CoreContainer", "WindowsServer2022FullContainer", "WindowsServer2025CoreContainer", "WindowsServer2025FullContainer".",
"default": "AmazonLinux2023",
"enum": [
"AmazonLinux2023",
@@ -1672,6 +1672,7 @@
"UbuntuPro2004",
"Ubuntu2004",
"Bottlerocket",
+ "BottlerocketFips",
"WindowsServer2019CoreContainer",
"WindowsServer2019FullContainer",
"WindowsServer2022CoreContainer",
@@ -2011,8 +2012,8 @@
},
"amiFamily": {
"type": "string",
- "description": "Valid variants are: `\"AmazonLinux2023\"` (default), `\"AmazonLinux2\"`, `\"UbuntuPro2604\"`, `\"Ubuntu2604\"`, `\"UbuntuPro2404\"`, `\"Ubuntu2404\"`, `\"UbuntuPro2204\"`, `\"Ubuntu2204\"`, `\"UbuntuPro2004\"`, `\"Ubuntu2004\"`, `\"Bottlerocket\"`, `\"WindowsServer2019CoreContainer\"`, `\"WindowsServer2019FullContainer\"`, `\"WindowsServer2022CoreContainer\"`, `\"WindowsServer2022FullContainer\"`, `\"WindowsServer2025CoreContainer\"`, `\"WindowsServer2025FullContainer\"`.",
- "x-intellij-html-description": "Valid variants are: "AmazonLinux2023" (default), "AmazonLinux2", "UbuntuPro2604", "Ubuntu2604", "UbuntuPro2404", "Ubuntu2404", "UbuntuPro2204", "Ubuntu2204", "UbuntuPro2004", "Ubuntu2004", "Bottlerocket", "WindowsServer2019CoreContainer", "WindowsServer2019FullContainer", "WindowsServer2022CoreContainer", "WindowsServer2022FullContainer", "WindowsServer2025CoreContainer", "WindowsServer2025FullContainer".",
+ "description": "Valid variants are: `\"AmazonLinux2023\"` (default), `\"AmazonLinux2\"`, `\"UbuntuPro2604\"`, `\"Ubuntu2604\"`, `\"UbuntuPro2404\"`, `\"Ubuntu2404\"`, `\"UbuntuPro2204\"`, `\"Ubuntu2204\"`, `\"UbuntuPro2004\"`, `\"Ubuntu2004\"`, `\"Bottlerocket\"`, `\"BottlerocketFips\"`, `\"WindowsServer2019CoreContainer\"`, `\"WindowsServer2019FullContainer\"`, `\"WindowsServer2022CoreContainer\"`, `\"WindowsServer2022FullContainer\"`, `\"WindowsServer2025CoreContainer\"`, `\"WindowsServer2025FullContainer\"`.",
+ "x-intellij-html-description": "Valid variants are: "AmazonLinux2023" (default), "AmazonLinux2", "UbuntuPro2604", "Ubuntu2604", "UbuntuPro2404", "Ubuntu2404", "UbuntuPro2204", "Ubuntu2204", "UbuntuPro2004", "Ubuntu2004", "Bottlerocket", "BottlerocketFips", "WindowsServer2019CoreContainer", "WindowsServer2019FullContainer", "WindowsServer2022CoreContainer", "WindowsServer2022FullContainer", "WindowsServer2025CoreContainer", "WindowsServer2025FullContainer".",
"default": "AmazonLinux2023",
"enum": [
"AmazonLinux2023",
@@ -2026,6 +2027,7 @@
"UbuntuPro2004",
"Ubuntu2004",
"Bottlerocket",
+ "BottlerocketFips",
"WindowsServer2019CoreContainer",
"WindowsServer2019FullContainer",
"WindowsServer2022CoreContainer",
diff --git a/pkg/apis/eksctl.io/v1alpha5/defaults.go b/pkg/apis/eksctl.io/v1alpha5/defaults.go
index 5afaa00fc4..f5e1c5eeba 100644
--- a/pkg/apis/eksctl.io/v1alpha5/defaults.go
+++ b/pkg/apis/eksctl.io/v1alpha5/defaults.go
@@ -220,7 +220,7 @@ func setNodeGroupBaseDefaults(ng *NodeGroupBase, meta *ClusterMeta) {
ng.InstanceSelector = &InstanceSelector{}
}
normalizeAMIFamily(ng)
- if ng.AMIFamily == NodeImageFamilyBottlerocket {
+ if IsBottlerocketImage(ng.AMIFamily) {
setBottlerocketNodeGroupDefaults(ng)
}
}
@@ -251,7 +251,7 @@ func setVolumeDefaults(ng *NodeGroupBase, controlPlaneOnOutposts bool, template
}
}
- if ng.AMIFamily == NodeImageFamilyBottlerocket && !IsSetAndNonEmptyString(ng.VolumeName) {
+ if IsBottlerocketImage(ng.AMIFamily) && !IsSetAndNonEmptyString(ng.VolumeName) {
ng.AdditionalEncryptedVolume = bottlerocketOSDisk
ng.VolumeName = aws.String(bottlerocketDataDisk)
}
diff --git a/pkg/apis/eksctl.io/v1alpha5/types.go b/pkg/apis/eksctl.io/v1alpha5/types.go
index 8cce87aa4e..35f46df751 100644
--- a/pkg/apis/eksctl.io/v1alpha5/types.go
+++ b/pkg/apis/eksctl.io/v1alpha5/types.go
@@ -209,18 +209,19 @@ const (
// All valid values of supported families should go in this block
const (
// DefaultNodeImageFamily (default)
- DefaultNodeImageFamily = NodeImageFamilyAmazonLinux2023
- NodeImageFamilyAmazonLinux2023 = "AmazonLinux2023"
- NodeImageFamilyAmazonLinux2 = "AmazonLinux2"
- NodeImageFamilyUbuntuPro2604 = "UbuntuPro2604"
- NodeImageFamilyUbuntu2604 = "Ubuntu2604"
- NodeImageFamilyUbuntuPro2404 = "UbuntuPro2404"
- NodeImageFamilyUbuntu2404 = "Ubuntu2404"
- NodeImageFamilyUbuntuPro2204 = "UbuntuPro2204"
- NodeImageFamilyUbuntu2204 = "Ubuntu2204"
- NodeImageFamilyUbuntuPro2004 = "UbuntuPro2004"
- NodeImageFamilyUbuntu2004 = "Ubuntu2004"
- NodeImageFamilyBottlerocket = "Bottlerocket"
+ DefaultNodeImageFamily = NodeImageFamilyAmazonLinux2023
+ NodeImageFamilyAmazonLinux2023 = "AmazonLinux2023"
+ NodeImageFamilyAmazonLinux2 = "AmazonLinux2"
+ NodeImageFamilyUbuntuPro2604 = "UbuntuPro2604"
+ NodeImageFamilyUbuntu2604 = "Ubuntu2604"
+ NodeImageFamilyUbuntuPro2404 = "UbuntuPro2404"
+ NodeImageFamilyUbuntu2404 = "Ubuntu2404"
+ NodeImageFamilyUbuntuPro2204 = "UbuntuPro2204"
+ NodeImageFamilyUbuntu2204 = "Ubuntu2204"
+ NodeImageFamilyUbuntuPro2004 = "UbuntuPro2004"
+ NodeImageFamilyUbuntu2004 = "Ubuntu2004"
+ NodeImageFamilyBottlerocket = "Bottlerocket"
+ NodeImageFamilyBottlerocketFips = "BottlerocketFips"
NodeImageFamilyWindowsServer2019CoreContainer = "WindowsServer2019CoreContainer"
NodeImageFamilyWindowsServer2019FullContainer = "WindowsServer2019FullContainer"
@@ -609,6 +610,7 @@ func SupportedAMIFamilies() []string {
NodeImageFamilyUbuntuPro2004,
NodeImageFamilyUbuntu2004,
NodeImageFamilyBottlerocket,
+ NodeImageFamilyBottlerocketFips,
NodeImageFamilyWindowsServer2019CoreContainer,
NodeImageFamilyWindowsServer2019FullContainer,
NodeImageFamilyWindowsServer2022CoreContainer,
diff --git a/pkg/apis/eksctl.io/v1alpha5/validation.go b/pkg/apis/eksctl.io/v1alpha5/validation.go
index f1e374f92e..c441b0a9e2 100644
--- a/pkg/apis/eksctl.io/v1alpha5/validation.go
+++ b/pkg/apis/eksctl.io/v1alpha5/validation.go
@@ -814,7 +814,7 @@ func validateNodeGroupBase(np NodePool, path string, controlPlaneOnOutposts bool
if ng.AMIFamily != NodeImageFamilyAmazonLinux2023 &&
ng.AMIFamily != NodeImageFamilyAmazonLinux2 &&
- ng.AMIFamily != NodeImageFamilyBottlerocket &&
+ !IsBottlerocketImage(ng.AMIFamily) &&
ng.AMIFamily != "" {
if instanceutils.IsNvidiaInstanceType(instanceType) {
logger.Warning(GPUDriversWarning(ng.AMIFamily))
@@ -831,7 +831,7 @@ func validateNodeGroupBase(np NodePool, path string, controlPlaneOnOutposts bool
if ng.AMIFamily != NodeImageFamilyAmazonLinux2 &&
ng.AMIFamily != NodeImageFamilyAmazonLinux2023 &&
- ng.AMIFamily != NodeImageFamilyBottlerocket &&
+ !IsBottlerocketImage(ng.AMIFamily) &&
ng.AMIFamily != "" {
// Only AL2, AL2023 and Bottlerocket support Inferentia hosts.
if instanceutils.IsInferentiaInstanceType(instanceType) {
@@ -1007,14 +1007,14 @@ func ValidateNodeGroup(i int, ng *NodeGroup, cfg *ClusterConfig) error {
return errors.New("when using a custom AMI, amiFamily needs to be explicitly set via config file or via --node-ami-family flag")
}
- if ng.Bottlerocket != nil && ng.AMIFamily != NodeImageFamilyBottlerocket {
- return fmt.Errorf(`bottlerocket config can only be used with amiFamily "Bottlerocket" but found "%s" (path=%s.bottlerocket)`,
+ if ng.Bottlerocket != nil && !IsBottlerocketImage(ng.AMIFamily) {
+ return fmt.Errorf(`bottlerocket config can only be used with amiFamily "Bottlerocket" or "BottlerocketFips" but found "%s" (path=%s.bottlerocket)`,
ng.AMIFamily, path)
}
if ng.AMI != "" && ng.OverrideBootstrapCommand == nil &&
ng.AMIFamily != NodeImageFamilyAmazonLinux2023 &&
- ng.AMIFamily != NodeImageFamilyBottlerocket &&
+ !IsBottlerocketImage(ng.AMIFamily) &&
!IsWindowsImage(ng.AMIFamily) {
return fmt.Errorf("%[1]s.overrideBootstrapCommand is required when using a custom AMI based on %s (%[1]s.ami)", path, ng.AMIFamily)
}
@@ -1045,7 +1045,7 @@ func ValidateNodeGroup(i int, ng *NodeGroup, cfg *ClusterConfig) error {
if ng.KubeletExtraConfig != nil {
return fieldNotSupported("kubeletExtraConfig")
}
- } else if ng.AMIFamily == NodeImageFamilyBottlerocket {
+ } else if IsBottlerocketImage(ng.AMIFamily) {
if ng.KubeletExtraConfig != nil {
return fieldNotSupported("kubeletExtraConfig")
}
@@ -1380,7 +1380,7 @@ func ValidateManagedNodeGroup(index int, ng *ManagedNodeGroup) error {
}
}
- if ng.AMIFamily == NodeImageFamilyBottlerocket {
+ if IsBottlerocketImage(ng.AMIFamily) {
fieldNotSupported := func(field string) error {
return &unsupportedFieldError{
ng: ng.NodeGroupBase,
@@ -1459,7 +1459,7 @@ func ValidateManagedNodeGroup(index int, ng *ManagedNodeGroup) error {
return fmt.Errorf("cannot set amiFamily to %s when using a custom AMI for managed nodes, only %s are supported", ng.AMIFamily,
strings.Join(slices.Concat(SupportedAmazonLinuxImages, SupportedBottlerocketImages, SupportedUbuntuImages), ", "))
}
- if ng.OverrideBootstrapCommand == nil && ng.AMIFamily != NodeImageFamilyAmazonLinux2023 && ng.AMIFamily != NodeImageFamilyBottlerocket {
+ if ng.OverrideBootstrapCommand == nil && ng.AMIFamily != NodeImageFamilyAmazonLinux2023 && !IsBottlerocketImage(ng.AMIFamily) {
return fmt.Errorf("%[1]s.overrideBootstrapCommand is required when using a custom AMI based on %s (%[1]s.ami)", path, ng.AMIFamily)
}
notSupportedWithCustomAMIErr := func(field string) error {
@@ -1684,7 +1684,7 @@ func IsAmazonLinuxImage(imageFamily string) bool {
func IsBottlerocketImage(imageFamily string) bool {
switch imageFamily {
- case NodeImageFamilyBottlerocket:
+ case NodeImageFamilyBottlerocket, NodeImageFamilyBottlerocketFips:
return true
default:
diff --git a/pkg/eks/nodegroup_service.go b/pkg/eks/nodegroup_service.go
index 6e76030fe5..3a8d5e8572 100644
--- a/pkg/eks/nodegroup_service.go
+++ b/pkg/eks/nodegroup_service.go
@@ -65,7 +65,7 @@ func (n *NodeGroupService) Normalize(ctx context.Context, nodePools []api.NodePo
hasNativeAMIFamilySupport :=
ng.AMIFamily == api.NodeImageFamilyAmazonLinux2023 ||
ng.AMIFamily == api.NodeImageFamilyAmazonLinux2 ||
- ng.AMIFamily == api.NodeImageFamilyBottlerocket ||
+ api.IsBottlerocketImage(ng.AMIFamily) ||
api.IsWindowsImage(ng.AMIFamily)
if !hasNativeAMIFamilySupport && !api.IsAMI(ng.AMI) {
diff --git a/pkg/nodebootstrap/userdata.go b/pkg/nodebootstrap/userdata.go
index 5814141918..ef24bf6943 100644
--- a/pkg/nodebootstrap/userdata.go
+++ b/pkg/nodebootstrap/userdata.go
@@ -48,7 +48,7 @@ func NewBootstrapper(clusterConfig *api.ClusterConfig, ng *api.NodeGroup) (Boots
switch ng.AMIFamily {
case api.NodeImageFamilyUbuntuPro2604, api.NodeImageFamilyUbuntu2604, api.NodeImageFamilyUbuntuPro2404, api.NodeImageFamilyUbuntu2404, api.NodeImageFamilyUbuntuPro2204, api.NodeImageFamilyUbuntu2204, api.NodeImageFamilyUbuntuPro2004, api.NodeImageFamilyUbuntu2004:
return NewUbuntuBootstrapper(clusterConfig, ng, clusterDNS), nil
- case api.NodeImageFamilyBottlerocket:
+ case api.NodeImageFamilyBottlerocket, api.NodeImageFamilyBottlerocketFips:
return NewBottlerocketBootstrapper(clusterConfig, ng), nil
case api.NodeImageFamilyAmazonLinux2023:
return NewAL2023Bootstrapper(clusterConfig, ng, clusterDNS), nil
@@ -76,7 +76,7 @@ func NewManagedBootstrapper(clusterConfig *api.ClusterConfig, ng *api.ManagedNod
return NewManagedAL2023Bootstrapper(clusterConfig, ng, clusterDNS), nil
case api.NodeImageFamilyAmazonLinux2:
return NewManagedAL2Bootstrapper(ng), nil
- case api.NodeImageFamilyBottlerocket:
+ case api.NodeImageFamilyBottlerocket, api.NodeImageFamilyBottlerocketFips:
return NewManagedBottlerocketBootstrapper(clusterConfig, ng), nil
case api.NodeImageFamilyUbuntu2004, api.NodeImageFamilyUbuntuPro2004, api.NodeImageFamilyUbuntu2204, api.NodeImageFamilyUbuntuPro2204, api.NodeImageFamilyUbuntu2404, api.NodeImageFamilyUbuntuPro2404, api.NodeImageFamilyUbuntu2604, api.NodeImageFamilyUbuntuPro2604:
return NewUbuntuBootstrapper(clusterConfig, ng, clusterDNS), nil