From 71fbe7c425ca428d735ae03b19eae181c5f10ed2 Mon Sep 17 00:00:00 2001 From: Thomas Bechtold Date: Tue, 12 Nov 2024 12:26:49 -0600 Subject: [PATCH] feat: Ubuntu 24.04 support This adds image lookup support for Ubuntu 24.04 (using image names and ssm param resolution). Co-authored-by: Robby Pocase --- .../tests/custom_ami/custom_ami_test.go | 31 +++++ .../custom_ami/testdata/ubuntu-pro-2404.yaml | 17 +++ pkg/ami/auto_resolver.go | 10 +- pkg/ami/auto_resolver_test.go | 10 ++ pkg/ami/ssm_resolver.go | 23 ++++ pkg/ami/ssm_resolver_test.go | 112 ++++++++++++++++++ .../v1alpha5/outposts_validation_test.go | 2 + pkg/apis/eksctl.io/v1alpha5/types.go | 4 + pkg/apis/eksctl.io/v1alpha5/validation.go | 4 +- .../eksctl.io/v1alpha5/validation_test.go | 8 ++ pkg/eks/api_test.go | 29 +++++ pkg/nodebootstrap/userdata.go | 4 +- userdocs/src/usage/custom-ami-support.md | 4 +- 13 files changed, 253 insertions(+), 5 deletions(-) create mode 100644 integration/tests/custom_ami/testdata/ubuntu-pro-2404.yaml diff --git a/integration/tests/custom_ami/custom_ami_test.go b/integration/tests/custom_ami/custom_ami_test.go index 79da935a39..458ff89f39 100644 --- a/integration/tests/custom_ami/custom_ami_test.go +++ b/integration/tests/custom_ami/custom_ami_test.go @@ -41,6 +41,7 @@ var ( customAMIAL2023 string customAMIBottlerocket string customAMIUbuntuPro2204 string + customAMIUbuntuPro2404 string ) var _ = BeforeSuite(func() { @@ -79,6 +80,14 @@ var _ = BeforeSuite(func() { Expect(err).NotTo(HaveOccurred()) customAMIUbuntuPro2204 = *output.Parameter.Value + // retrieve Ubuntu Pro 24.04 AMI + input = &awsssm.GetParameterInput{ + Name: aws.String(fmt.Sprintf("/aws/service/canonical/ubuntu/eks-pro/24.04/%s/stable/current/amd64/hvm/ebs-gp3/ami-id", params.Version)), + } + output, err = ssm.GetParameter(context.Background(), input) + Expect(err).NotTo(HaveOccurred()) + customAMIUbuntuPro2404 = *output.Parameter.Value + cmd := params.EksctlCreateCmd.WithArgs( "cluster", "--verbose", "4", @@ -178,6 +187,28 @@ var _ = Describe("(Integration) [Test Custom AMI]", func() { }) }) + + Context("ubuntu-pro-2404 un-managed nodegroups", func() { + + It("can create a working nodegroup which can join the cluster", func() { + By(fmt.Sprintf("using the following EKS optimised AMI: %s", customAMIUbuntuPro2404)) + content, err := os.ReadFile(filepath.Join("testdata/ubuntu-pro-2404.yaml")) + Expect(err).NotTo(HaveOccurred()) + content = bytes.ReplaceAll(content, []byte(""), []byte(params.ClusterName)) + content = bytes.ReplaceAll(content, []byte(""), []byte(params.Region)) + content = bytes.ReplaceAll(content, []byte(""), []byte(customAMIUbuntuPro2404)) + cmd := params.EksctlCreateCmd. + WithArgs( + "nodegroup", + "--config-file", "-", + "--verbose", "4", + ). + WithoutArg("--region", params.Region). + WithStdin(bytes.NewReader(content)) + Expect(cmd).To(RunSuccessfully()) + }) + + }) }) var _ = AfterSuite(func() { diff --git a/integration/tests/custom_ami/testdata/ubuntu-pro-2404.yaml b/integration/tests/custom_ami/testdata/ubuntu-pro-2404.yaml new file mode 100644 index 0000000000..c9e45164ad --- /dev/null +++ b/integration/tests/custom_ami/testdata/ubuntu-pro-2404.yaml @@ -0,0 +1,17 @@ +apiVersion: eksctl.io/v1alpha5 +kind: ClusterConfig + +# name is generated +metadata: + name: + region: + +nodeGroups: + - name: unm-ubuntu-pro-2404 + ami: + amiFamily: UbuntuPro2404 + desiredCapacity: 1 + overrideBootstrapCommand: | + #!/bin/bash + source /var/lib/cloud/scripts/eksctl/bootstrap.helper.sh + /etc/eks/bootstrap.sh --kubelet-extra-args "--node-labels=${NODE_LABELS}" diff --git a/pkg/ami/auto_resolver.go b/pkg/ami/auto_resolver.go index 883490723a..a05ca87d5b 100644 --- a/pkg/ami/auto_resolver.go +++ b/pkg/ami/auto_resolver.go @@ -35,10 +35,18 @@ func MakeImageSearchPatterns(version string) map[string]map[int]string { ImageClassNeuron: fmt.Sprintf("amazon-eks-gpu-node-%s-*", version), ImageClassARM: fmt.Sprintf("amazon-eks-arm64-node-%s-*", version), }, + api.NodeImageFamilyUbuntuPro2404: { + ImageClassGeneral: fmt.Sprintf("ubuntu-eks-pro/k8s_%s/images/*24.04-amd64*", version), + ImageClassARM: fmt.Sprintf("ubuntu-eks-pro/k8s_%s/images/*24.04-arm64*", version), + }, api.NodeImageFamilyUbuntuPro2204: { ImageClassGeneral: fmt.Sprintf("ubuntu-eks-pro/k8s_%s/images/*22.04-amd64*", version), ImageClassARM: fmt.Sprintf("ubuntu-eks-pro/k8s_%s/images/*22.04-arm64*", version), }, + api.NodeImageFamilyUbuntu2404: { + ImageClassGeneral: fmt.Sprintf("ubuntu-eks/k8s_%s/images/*24.04-amd64*", version), + ImageClassARM: fmt.Sprintf("ubuntu-eks/k8s_%s/images/*24.04-arm64*", version), + }, api.NodeImageFamilyUbuntu2204: { ImageClassGeneral: fmt.Sprintf("ubuntu-eks/k8s_%s/images/*22.04-amd64*", version), ImageClassARM: fmt.Sprintf("ubuntu-eks/k8s_%s/images/*22.04-arm64*", version), @@ -68,7 +76,7 @@ func MakeImageSearchPatterns(version string) map[string]map[int]string { // OwnerAccountID returns the AWS account ID that owns worker AMI. func OwnerAccountID(imageFamily, region string) (string, error) { switch imageFamily { - case api.NodeImageFamilyUbuntuPro2204, api.NodeImageFamilyUbuntu2204, api.NodeImageFamilyUbuntu2004, api.NodeImageFamilyUbuntu1804: + case api.NodeImageFamilyUbuntuPro2404, api.NodeImageFamilyUbuntu2404, api.NodeImageFamilyUbuntuPro2204, api.NodeImageFamilyUbuntu2204, api.NodeImageFamilyUbuntu2004, api.NodeImageFamilyUbuntu1804: return ownerIDUbuntuFamily, nil case api.NodeImageFamilyAmazonLinux2023, api.NodeImageFamilyAmazonLinux2: return api.EKSResourceAccountID(region), nil diff --git a/pkg/ami/auto_resolver_test.go b/pkg/ami/auto_resolver_test.go index 0483cc9eee..1ce8424a5f 100644 --- a/pkg/ami/auto_resolver_test.go +++ b/pkg/ami/auto_resolver_test.go @@ -72,6 +72,16 @@ var _ = Describe("AMI Auto Resolution", func() { Expect(ownerAccount).To(BeEquivalentTo("099720109477")) Expect(err).NotTo(HaveOccurred()) }) + It("should return the Ubuntu Account ID for Ubuntu images", func() { + ownerAccount, err := OwnerAccountID(api.NodeImageFamilyUbuntu2404, region) + Expect(ownerAccount).To(BeEquivalentTo("099720109477")) + Expect(err).NotTo(HaveOccurred()) + }) + It("should return the Ubuntu Account ID for Ubuntu images", func() { + ownerAccount, err := OwnerAccountID(api.NodeImageFamilyUbuntuPro2404, region) + Expect(ownerAccount).To(BeEquivalentTo("099720109477")) + Expect(err).NotTo(HaveOccurred()) + }) It("should return the Windows Account ID for Windows Server images", func() { ownerAccount, err := OwnerAccountID(api.NodeImageFamilyWindowsServer2022CoreContainer, region) diff --git a/pkg/ami/ssm_resolver.go b/pkg/ami/ssm_resolver.go index 34eec4c5fb..dd980066a0 100644 --- a/pkg/ami/ssm_resolver.go +++ b/pkg/ami/ssm_resolver.go @@ -88,6 +88,16 @@ func MakeSSMParameterName(version, instanceType, imageFamily string) (string, er return fmt.Sprint("/aws/service/canonical/ubuntu/", eksProduct, "/", ubuntuReleaseName(imageFamily), "/", version, "/stable/current/", ubuntuArchName(instanceType), "/hvm/ebs-gp2/ami-id"), nil default: return "", fmt.Errorf("unknown image family %s", imageFamily) + case api.NodeImageFamilyUbuntu2404, + api.NodeImageFamilyUbuntuPro2404: + if err := validateVersionForUbuntu(version, imageFamily); err != nil { + return "", err + } + eksProduct := "eks" + if imageFamily == api.NodeImageFamilyUbuntuPro2404 { + eksProduct = "eks-pro" + } + return fmt.Sprint("/aws/service/canonical/ubuntu/", eksProduct, "/", ubuntuReleaseName(imageFamily), "/", version, "/stable/current/", ubuntuArchName(instanceType), "/hvm/ebs-gp3/ami-id"), nil } } @@ -177,6 +187,8 @@ func ubuntuReleaseName(imageFamily string) string { return "20.04" case api.NodeImageFamilyUbuntu2204, api.NodeImageFamilyUbuntuPro2204: return "22.04" + case api.NodeImageFamilyUbuntu2404, api.NodeImageFamilyUbuntuPro2404: + return "24.04" default: return "18.04" } @@ -214,6 +226,17 @@ func validateVersionForUbuntu(version, imageFamily string) error { if !supportsUbuntu { return &UnsupportedQueryError{msg: fmt.Sprintf("%s requires EKS version greater or equal than %s", imageFamily, minVersion)} } + case api.NodeImageFamilyUbuntu2404, api.NodeImageFamilyUbuntuPro2404: + var err error + supportsUbuntu := false + const minVersion = api.Version1_31 + supportsUbuntu, err = utils.IsMinVersion(minVersion, version) + if err != nil { + return err + } + if !supportsUbuntu { + return &UnsupportedQueryError{msg: fmt.Sprintf("%s requires EKS version greater or equal than %s", imageFamily, minVersion)} + } default: return &UnsupportedQueryError{msg: fmt.Sprintf("SSM Parameter lookups for %s AMIs is not supported", imageFamily)} } diff --git a/pkg/ami/ssm_resolver_test.go b/pkg/ami/ssm_resolver_test.go index ffb23cdabf..156194deab 100644 --- a/pkg/ami/ssm_resolver_test.go +++ b/pkg/ami/ssm_resolver_test.go @@ -443,6 +443,118 @@ var _ = Describe("AMI Auto Resolution", func() { }) }) + Context("and Ubuntu2404 family", func() { + BeforeEach(func() { + p = mockprovider.NewMockProvider() + instanceType = "t2.medium" + imageFamily = "Ubuntu2404" + }) + + DescribeTable("should return an error", + func(version string) { + resolver := NewSSMResolver(p.MockSSM()) + resolvedAmi, err = resolver.Resolve(context.Background(), region, version, instanceType, imageFamily) + + Expect(err).To(HaveOccurred()) + Expect(err).To(MatchError("Ubuntu2404 requires EKS version greater or equal than 1.31")) + }, + EntryDescription("When EKS version is %s"), + Entry(nil, "1.21"), + Entry(nil, "1.30"), + ) + + DescribeTable("should return a valid AMI", + func(version string) { + addMockGetParameter(p, fmt.Sprintf("/aws/service/canonical/ubuntu/eks/24.04/%s/stable/current/amd64/hvm/ebs-gp3/ami-id", version), expectedAmi) + + resolver := NewSSMResolver(p.MockSSM()) + resolvedAmi, err = resolver.Resolve(context.Background(), region, version, instanceType, imageFamily) + + Expect(err).NotTo(HaveOccurred()) + Expect(p.MockSSM().AssertNumberOfCalls(GinkgoT(), "GetParameter", 1)).To(BeTrue()) + Expect(resolvedAmi).To(BeEquivalentTo(expectedAmi)) + }, + EntryDescription("When EKS version is %s"), + Entry(nil, "1.31"), + ) + + Context("for arm instance type", func() { + BeforeEach(func() { + instanceType = "a1.large" + }) + DescribeTable("should return a valid AMI for arm64", + func(version string) { + addMockGetParameter(p, fmt.Sprintf("/aws/service/canonical/ubuntu/eks/24.04/%s/stable/current/arm64/hvm/ebs-gp3/ami-id", version), expectedAmi) + + resolver := NewSSMResolver(p.MockSSM()) + resolvedAmi, err = resolver.Resolve(context.Background(), region, version, instanceType, imageFamily) + + Expect(err).NotTo(HaveOccurred()) + Expect(p.MockSSM().AssertNumberOfCalls(GinkgoT(), "GetParameter", 1)).To(BeTrue()) + Expect(resolvedAmi).To(BeEquivalentTo(expectedAmi)) + }, + EntryDescription("When EKS version is %s"), + Entry(nil, "1.31"), + ) + }) + }) + + Context("and UbuntuPro2404 family", func() { + BeforeEach(func() { + p = mockprovider.NewMockProvider() + instanceType = "t2.medium" + imageFamily = "UbuntuPro2404" + }) + + DescribeTable("should return an error", + func(version string) { + resolver := NewSSMResolver(p.MockSSM()) + resolvedAmi, err = resolver.Resolve(context.Background(), region, version, instanceType, imageFamily) + + Expect(err).To(HaveOccurred()) + Expect(err).To(MatchError("UbuntuPro2404 requires EKS version greater or equal than 1.31")) + }, + EntryDescription("When EKS version is %s"), + Entry(nil, "1.21"), + Entry(nil, "1.30"), + ) + + DescribeTable("should return a valid AMI", + func(version string) { + addMockGetParameter(p, fmt.Sprintf("/aws/service/canonical/ubuntu/eks-pro/24.04/%s/stable/current/amd64/hvm/ebs-gp3/ami-id", version), expectedAmi) + + resolver := NewSSMResolver(p.MockSSM()) + resolvedAmi, err = resolver.Resolve(context.Background(), region, version, instanceType, imageFamily) + + Expect(err).NotTo(HaveOccurred()) + Expect(p.MockSSM().AssertNumberOfCalls(GinkgoT(), "GetParameter", 1)).To(BeTrue()) + Expect(resolvedAmi).To(BeEquivalentTo(expectedAmi)) + }, + EntryDescription("When EKS version is %s"), + Entry(nil, "1.31"), + ) + + Context("for arm instance type", func() { + BeforeEach(func() { + instanceType = "a1.large" + }) + DescribeTable("should return a valid AMI for arm64", + func(version string) { + addMockGetParameter(p, fmt.Sprintf("/aws/service/canonical/ubuntu/eks-pro/24.04/%s/stable/current/arm64/hvm/ebs-gp3/ami-id", version), expectedAmi) + + resolver := NewSSMResolver(p.MockSSM()) + resolvedAmi, err = resolver.Resolve(context.Background(), region, version, instanceType, imageFamily) + + Expect(err).NotTo(HaveOccurred()) + Expect(p.MockSSM().AssertNumberOfCalls(GinkgoT(), "GetParameter", 1)).To(BeTrue()) + Expect(resolvedAmi).To(BeEquivalentTo(expectedAmi)) + }, + EntryDescription("When EKS version is %s"), + Entry(nil, "1.31"), + ) + }) + }) + Context("and Bottlerocket image family", func() { BeforeEach(func() { instanceType = "t2.medium" diff --git a/pkg/apis/eksctl.io/v1alpha5/outposts_validation_test.go b/pkg/apis/eksctl.io/v1alpha5/outposts_validation_test.go index 83a27d922c..eb8df07ab7 100644 --- a/pkg/apis/eksctl.io/v1alpha5/outposts_validation_test.go +++ b/pkg/apis/eksctl.io/v1alpha5/outposts_validation_test.go @@ -210,6 +210,8 @@ var _ = Describe("Outposts validation", func() { Entry("Ubuntu2004", api.NodeImageFamilyUbuntu2004, true), Entry("Ubuntu2204", api.NodeImageFamilyUbuntu2204, true), Entry("UbuntuPro2204", api.NodeImageFamilyUbuntuPro2204, true), + Entry("Ubuntu2404", api.NodeImageFamilyUbuntuPro2204, true), + Entry("UbuntuPro2404", api.NodeImageFamilyUbuntuPro2204, true), Entry("Windows2019Core", api.NodeImageFamilyWindowsServer2019CoreContainer, true), Entry("Windows2019Full", api.NodeImageFamilyWindowsServer2019FullContainer, true), Entry("Windows2022Core", api.NodeImageFamilyWindowsServer2022CoreContainer, true), diff --git a/pkg/apis/eksctl.io/v1alpha5/types.go b/pkg/apis/eksctl.io/v1alpha5/types.go index d88fd7f22d..d69fe1ee1a 100644 --- a/pkg/apis/eksctl.io/v1alpha5/types.go +++ b/pkg/apis/eksctl.io/v1alpha5/types.go @@ -231,6 +231,8 @@ const ( DefaultNodeImageFamily = NodeImageFamilyAmazonLinux2 NodeImageFamilyAmazonLinux2023 = "AmazonLinux2023" NodeImageFamilyAmazonLinux2 = "AmazonLinux2" + NodeImageFamilyUbuntuPro2404 = "UbuntuPro2404" + NodeImageFamilyUbuntu2404 = "Ubuntu2404" NodeImageFamilyUbuntuPro2204 = "UbuntuPro2204" NodeImageFamilyUbuntu2204 = "Ubuntu2204" NodeImageFamilyUbuntu2004 = "Ubuntu2004" @@ -615,6 +617,8 @@ func SupportedAMIFamilies() []string { return []string{ NodeImageFamilyAmazonLinux2023, NodeImageFamilyAmazonLinux2, + NodeImageFamilyUbuntuPro2404, + NodeImageFamilyUbuntu2404, NodeImageFamilyUbuntuPro2204, NodeImageFamilyUbuntu2204, NodeImageFamilyUbuntu2004, diff --git a/pkg/apis/eksctl.io/v1alpha5/validation.go b/pkg/apis/eksctl.io/v1alpha5/validation.go index 5c9683d94e..6bfaa9871e 100644 --- a/pkg/apis/eksctl.io/v1alpha5/validation.go +++ b/pkg/apis/eksctl.io/v1alpha5/validation.go @@ -1568,7 +1568,9 @@ func IsAmazonLinuxImage(imageFamily string) bool { func IsUbuntuImage(imageFamily string) bool { switch imageFamily { - case NodeImageFamilyUbuntuPro2204, + case NodeImageFamilyUbuntuPro2404, + NodeImageFamilyUbuntu2404, + NodeImageFamilyUbuntuPro2204, NodeImageFamilyUbuntu2204, NodeImageFamilyUbuntu2004, NodeImageFamilyUbuntu1804: diff --git a/pkg/apis/eksctl.io/v1alpha5/validation_test.go b/pkg/apis/eksctl.io/v1alpha5/validation_test.go index 0533cfd711..8b981c77d3 100644 --- a/pkg/apis/eksctl.io/v1alpha5/validation_test.go +++ b/pkg/apis/eksctl.io/v1alpha5/validation_test.go @@ -2183,6 +2183,14 @@ var _ = Describe("ClusterConfig validation", func() { err = api.ValidateManagedNodeGroup(0, mng) Expect(err).NotTo(HaveOccurred()) + mng.AMIFamily = api.NodeImageFamilyUbuntu2404 + err = api.ValidateManagedNodeGroup(0, mng) + Expect(err).NotTo(HaveOccurred()) + + mng.AMIFamily = api.NodeImageFamilyUbuntuPro2404 + err = api.ValidateManagedNodeGroup(0, mng) + Expect(err).NotTo(HaveOccurred()) + mng.AMIFamily = api.NodeImageFamilyBottlerocket mng.OverrideBootstrapCommand = nil err = api.ValidateManagedNodeGroup(0, mng) diff --git a/pkg/eks/api_test.go b/pkg/eks/api_test.go index 707f76ccf2..a8dc0c288d 100644 --- a/pkg/eks/api_test.go +++ b/pkg/eks/api_test.go @@ -324,6 +324,35 @@ var _ = Describe("eksctl API", func() { testEnsureAMI(Equal("ami-ubuntu"), "1.14") }) + It("should resolve AMI using SSM Parameter Store for Ubuntu2404 on 1.31", func() { + provider.MockSSM().On("GetParameter", mock.Anything, &ssm.GetParameterInput{ + Name: aws.String("/aws/service/canonical/ubuntu/eks/24.04/1.31/stable/current/amd64/hvm/ebs-gp3/ami-id"), + }).Return(&ssm.GetParameterOutput{ + Parameter: &ssmtypes.Parameter{ + Value: aws.String("ami-ubuntu"), + }, + }, nil) + ng.AMIFamily = api.NodeImageFamilyUbuntu2404 + + testEnsureAMI(Equal("ami-ubuntu"), "1.31") + }) + + It("should fall back to auto resolution for Ubuntu2404", func() { + ng.AMIFamily = api.NodeImageFamilyUbuntu2404 + mockDescribeImages(provider, "ami-ubuntu", func(input *ec2.DescribeImagesInput) bool { + return input.Owners[0] == "099720109477" + }) + testEnsureAMI(Equal("ami-ubuntu"), "1.14") + }) + + It("should fall back to auto resolution for UbuntuPro2404", func() { + ng.AMIFamily = api.NodeImageFamilyUbuntuPro2404 + mockDescribeImages(provider, "ami-ubuntu", func(input *ec2.DescribeImagesInput) bool { + return input.Owners[0] == "099720109477" + }) + testEnsureAMI(Equal("ami-ubuntu"), "1.14") + }) + It("should retrieve the AMI from EC2 when AMI is auto", func() { ng.AMI = "auto" ng.InstanceType = "p2.xlarge" diff --git a/pkg/nodebootstrap/userdata.go b/pkg/nodebootstrap/userdata.go index 41df3c49f7..9602d1995d 100644 --- a/pkg/nodebootstrap/userdata.go +++ b/pkg/nodebootstrap/userdata.go @@ -48,7 +48,7 @@ func NewBootstrapper(clusterConfig *api.ClusterConfig, ng *api.NodeGroup) (Boots return NewWindowsBootstrapper(clusterConfig, ng, clusterDNS), nil } switch ng.AMIFamily { - case api.NodeImageFamilyUbuntuPro2204, api.NodeImageFamilyUbuntu2204, api.NodeImageFamilyUbuntu2004, api.NodeImageFamilyUbuntu1804: + case api.NodeImageFamilyUbuntuPro2404, api.NodeImageFamilyUbuntu2404, api.NodeImageFamilyUbuntuPro2204, api.NodeImageFamilyUbuntu2204, api.NodeImageFamilyUbuntu2004, api.NodeImageFamilyUbuntu1804: return NewUbuntuBootstrapper(clusterConfig, ng, clusterDNS), nil case api.NodeImageFamilyBottlerocket: return NewBottlerocketBootstrapper(clusterConfig, ng), nil @@ -80,7 +80,7 @@ func NewManagedBootstrapper(clusterConfig *api.ClusterConfig, ng *api.ManagedNod return NewManagedAL2Bootstrapper(ng), nil case api.NodeImageFamilyBottlerocket: return NewManagedBottlerocketBootstrapper(clusterConfig, ng), nil - case api.NodeImageFamilyUbuntu1804, api.NodeImageFamilyUbuntu2004, api.NodeImageFamilyUbuntu2204, api.NodeImageFamilyUbuntuPro2204: + case api.NodeImageFamilyUbuntu1804, api.NodeImageFamilyUbuntu2004, api.NodeImageFamilyUbuntu2204, api.NodeImageFamilyUbuntuPro2204, api.NodeImageFamilyUbuntu2404, api.NodeImageFamilyUbuntuPro2404: return NewUbuntuBootstrapper(clusterConfig, ng, clusterDNS), nil } return nil, nil diff --git a/userdocs/src/usage/custom-ami-support.md b/userdocs/src/usage/custom-ami-support.md index 4612c0151e..25ee1302d8 100644 --- a/userdocs/src/usage/custom-ami-support.md +++ b/userdocs/src/usage/custom-ami-support.md @@ -61,6 +61,8 @@ The `--node-ami-family` can take following keywords: | Ubuntu2004 | Indicates that the EKS AMI image based on Ubuntu 20.04 LTS (Focal) should be used (supported for EKS <= 1.29). | | Ubuntu2204 | Indicates that the EKS AMI image based on Ubuntu 22.04 LTS (Jammy) should be used (available for EKS >= 1.29). | | UbuntuPro2204 | Indicates that the EKS AMI image based on Ubuntu Pro 22.04 LTS (Jammy) should be used (available for EKS >= 1.29). | +| Ubuntu2404 | Indicates that the EKS AMI image based on Ubuntu 24.04 LTS (Noble) should be used (available for EKS >= 1.31). | +| UbuntuPro2404 | Indicates that the EKS AMI image based on Ubuntu Pro 24.04 LTS (Noble) should be used (available for EKS >= 1.31). | | Bottlerocket | Indicates that the EKS AMI image based on Bottlerocket should be used. | | WindowsServer2019FullContainer | Indicates that the EKS AMI image based on Windows Server 2019 Full Container should be used. | | WindowsServer2019CoreContainer | Indicates that the EKS AMI image based on Windows Server 2019 Core Container should be used. | @@ -87,7 +89,7 @@ managedNodeGroups: The `--node-ami-family` flag can also be used with `eksctl create nodegroup`. `eksctl` requires AMI Family to be explicitly set via config file or via `--node-ami-family` CLI flag, whenever working with a custom AMI. ???+ note - At the moment, EKS managed nodegroups only support the following AMI Families when working with custom AMIs: `AmazonLinux2023`, `AmazonLinux2`, `Ubuntu1804`, `Ubuntu2004` and `Ubuntu2204` + At the moment, EKS managed nodegroups only support the following AMI Families when working with custom AMIs: `AmazonLinux2023`, `AmazonLinux2`, `Ubuntu1804`, `Ubuntu2004`, `Ubuntu2204` and `Ubuntu2404` ## Windows custom AMI support Only self-managed Windows nodegroups can specify a custom AMI. `amiFamily` should be set to a valid Windows AMI family.