diff --git a/pkg/actions/cluster/upgrade.go b/pkg/actions/cluster/upgrade.go index f2bf0e5ad3..20293fa384 100644 --- a/pkg/actions/cluster/upgrade.go +++ b/pkg/actions/cluster/upgrade.go @@ -130,6 +130,8 @@ func getNextVersion(currentVersion string) (string, error) { return api.Version1_29, nil case api.Version1_29: return api.Version1_30, nil + case api.Version1_30: + return api.Version1_31, nil default: // version of control plane is not known to us, maybe we are just too old... return "", fmt.Errorf("control plane version %q is not known to this version of eksctl, try to upgrade eksctl first", currentVersion) diff --git a/pkg/actions/cluster/upgrade_test.go b/pkg/actions/cluster/upgrade_test.go index cb89e1f975..cc998cc957 100644 --- a/pkg/actions/cluster/upgrade_test.go +++ b/pkg/actions/cluster/upgrade_test.go @@ -2,7 +2,6 @@ package cluster import ( . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" @@ -87,9 +86,9 @@ var _ = Describe("upgrade cluster", func() { }), Entry("fails when the version is still not supported", upgradeCase{ - givenVersion: "1.30", + givenVersion: "1.31", eksVersion: api.LatestVersion, - expectedErrorText: "control plane version \"1.30\" is not known to this version of eksctl", + expectedErrorText: "control plane version \"1.31\" is not known to this version of eksctl", }), ) }) diff --git a/pkg/actions/nodegroup/testdata/al2-updated-template.json b/pkg/actions/nodegroup/testdata/al2-updated-template.json index 19ebd16bd0..6d93868fe0 100644 --- a/pkg/actions/nodegroup/testdata/al2-updated-template.json +++ b/pkg/actions/nodegroup/testdata/al2-updated-template.json @@ -140,7 +140,7 @@ ] }, "NodegroupName": "amazonlinux2", - "ReleaseVersion": "1.29-20201212", + "ReleaseVersion": "1.30-20201212", "ScalingConfig": { "DesiredSize": 4, "MaxSize": 4, @@ -213,4 +213,4 @@ } } } -} \ No newline at end of file +} diff --git a/pkg/addons/default/assets/coredns-1.30.json b/pkg/addons/default/assets/coredns-1.30.json new file mode 100644 index 0000000000..5691c98f26 --- /dev/null +++ b/pkg/addons/default/assets/coredns-1.30.json @@ -0,0 +1,379 @@ +{ + "apiVersion": "v1", + "items": [ + { + "apiVersion": "v1", + "kind": "Service", + "metadata": { + "annotations": { + "prometheus.io/port": "9153", + "prometheus.io/scrape": "true" + }, + "labels": { + "eks.amazonaws.com/component": "kube-dns", + "k8s-app": "kube-dns", + "kubernetes.io/cluster-service": "true", + "kubernetes.io/name": "CoreDNS" + }, + "name": "kube-dns", + "namespace": "kube-system" + }, + "spec": { + "internalTrafficPolicy": "Cluster", + "ipFamilies": [ + "IPv4" + ], + "ipFamilyPolicy": "SingleStack", + "ports": [ + { + "name": "dns", + "port": 53, + "protocol": "UDP", + "targetPort": 53 + }, + { + "name": "dns-tcp", + "port": 53, + "protocol": "TCP", + "targetPort": 53 + }, + { + "name": "metrics", + "port": 9153, + "protocol": "TCP", + "targetPort": 9153 + } + ], + "selector": { + "k8s-app": "kube-dns" + }, + "sessionAffinity": "None", + "type": "ClusterIP" + } + }, + { + "apiVersion": "v1", + "kind": "ServiceAccount", + "metadata": { + "labels": { + "eks.amazonaws.com/component": "coredns", + "k8s-app": "kube-dns" + }, + "name": "coredns", + "namespace": "kube-system" + } + }, + { + "apiVersion": "v1", + "data": { + "Corefile": ".:53 {\n errors\n health {\n lameduck 5s\n }\n ready\n kubernetes cluster.local in-addr.arpa ip6.arpa {\n pods insecure\n fallthrough in-addr.arpa ip6.arpa\n }\n prometheus :9153\n forward . /etc/resolv.conf\n cache 30\n loop\n reload\n loadbalance\n}\n" + }, + "kind": "ConfigMap", + "metadata": { + "labels": { + "eks.amazonaws.com/component": "coredns", + "k8s-app": "kube-dns" + }, + "name": "coredns", + "namespace": "kube-system" + } + }, + { + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": { + "annotations": {}, + "labels": { + "eks.amazonaws.com/component": "coredns", + "k8s-app": "kube-dns", + "kubernetes.io/name": "CoreDNS" + }, + "name": "coredns", + "namespace": "kube-system" + }, + "spec": { + "progressDeadlineSeconds": 600, + "replicas": 2, + "revisionHistoryLimit": 10, + "selector": { + "matchLabels": { + "eks.amazonaws.com/component": "coredns", + "k8s-app": "kube-dns" + } + }, + "strategy": { + "rollingUpdate": { + "maxSurge": "25%", + "maxUnavailable": 1 + }, + "type": "RollingUpdate" + }, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "eks.amazonaws.com/component": "coredns", + "k8s-app": "kube-dns" + } + }, + "spec": { + "affinity": { + "nodeAffinity": { + "requiredDuringSchedulingIgnoredDuringExecution": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "kubernetes.io/os", + "operator": "In", + "values": [ + "linux" + ] + }, + { + "key": "kubernetes.io/arch", + "operator": "In", + "values": [ + "amd64", + "arm64" + ] + } + ] + } + ] + } + }, + "podAntiAffinity": { + "preferredDuringSchedulingIgnoredDuringExecution": [ + { + "podAffinityTerm": { + "labelSelector": { + "matchExpressions": [ + { + "key": "k8s-app", + "operator": "In", + "values": [ + "kube-dns" + ] + } + ] + }, + "topologyKey": "kubernetes.io/hostname" + }, + "weight": 100 + } + ] + } + }, + "containers": [ + { + "args": [ + "-conf", + "/etc/coredns/Corefile" + ], + "image": "%s.dkr.ecr.%s.%s/eks/coredns:v1.11.1-eksbuild.8", + "imagePullPolicy": "IfNotPresent", + "livenessProbe": { + "failureThreshold": 5, + "httpGet": { + "path": "/health", + "port": 8080, + "scheme": "HTTP" + }, + "initialDelaySeconds": 60, + "periodSeconds": 10, + "successThreshold": 1, + "timeoutSeconds": 5 + }, + "name": "coredns", + "ports": [ + { + "containerPort": 53, + "name": "dns", + "protocol": "UDP" + }, + { + "containerPort": 53, + "name": "dns-tcp", + "protocol": "TCP" + }, + { + "containerPort": 9153, + "name": "metrics", + "protocol": "TCP" + } + ], + "readinessProbe": { + "failureThreshold": 3, + "httpGet": { + "path": "/ready", + "port": 8181, + "scheme": "HTTP" + }, + "periodSeconds": 10, + "successThreshold": 1, + "timeoutSeconds": 1 + }, + "resources": { + "limits": { + "memory": "170Mi" + }, + "requests": { + "cpu": "100m", + "memory": "70Mi" + } + }, + "securityContext": { + "allowPrivilegeEscalation": false, + "capabilities": { + "add": [ + "NET_BIND_SERVICE" + ], + "drop": [ + "ALL" + ] + }, + "readOnlyRootFilesystem": true + }, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/etc/coredns", + "name": "config-volume", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "Default", + "priorityClassName": "system-cluster-critical", + "restartPolicy": "Always", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "coredns", + "serviceAccountName": "coredns", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoSchedule", + "key": "node-role.kubernetes.io/control-plane" + }, + { + "key": "CriticalAddonsOnly", + "operator": "Exists" + } + ], + "topologySpreadConstraints": [ + { + "labelSelector": { + "matchLabels": { + "k8s-app": "kube-dns" + } + }, + "maxSkew": 1, + "topologyKey": "topology.kubernetes.io/zone", + "whenUnsatisfiable": "ScheduleAnyway" + } + ], + "volumes": [ + { + "configMap": { + "defaultMode": 420, + "items": [ + { + "key": "Corefile", + "path": "Corefile" + } + ], + "name": "coredns" + }, + "name": "config-volume" + } + ] + } + } + } + }, + { + "apiVersion": "rbac.authorization.k8s.io/v1", + "kind": "ClusterRole", + "metadata": { + "labels": { + "eks.amazonaws.com/component": "coredns", + "k8s-app": "kube-dns", + "kubernetes.io/bootstrapping": "rbac-defaults" + }, + "name": "system:coredns" + }, + "rules": [ + { + "apiGroups": [ + "" + ], + "resources": [ + "endpoints", + "services", + "pods", + "namespaces" + ], + "verbs": [ + "list", + "watch" + ] + }, + { + "apiGroups": [ + "" + ], + "resources": [ + "nodes" + ], + "verbs": [ + "get" + ] + }, + { + "apiGroups": [ + "discovery.k8s.io" + ], + "resources": [ + "endpointslices" + ], + "verbs": [ + "list", + "watch" + ] + } + ] + }, + { + "apiVersion": "rbac.authorization.k8s.io/v1", + "kind": "ClusterRoleBinding", + "metadata": { + "annotations": { + "rbac.authorization.kubernetes.io/autoupdate": "true" + }, + "labels": { + "eks.amazonaws.com/component": "coredns", + "k8s-app": "kube-dns", + "kubernetes.io/bootstrapping": "rbac-defaults" + }, + "name": "system:coredns" + }, + "roleRef": { + "apiGroup": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "name": "system:coredns" + }, + "subjects": [ + { + "kind": "ServiceAccount", + "name": "coredns", + "namespace": "kube-system" + } + ] + } + ], + "kind": "List" +} diff --git a/pkg/apis/eksctl.io/v1alpha5/assets/schema.json b/pkg/apis/eksctl.io/v1alpha5/assets/schema.json index 32d5f053d2..10486218db 100755 --- a/pkg/apis/eksctl.io/v1alpha5/assets/schema.json +++ b/pkg/apis/eksctl.io/v1alpha5/assets/schema.json @@ -731,8 +731,8 @@ }, "version": { "type": "string", - "description": "Valid variants are: `\"1.23\"`, `\"1.24\"`, `\"1.25\"`, `\"1.26\"`, `\"1.27\"`, `\"1.28\"`, `\"1.29\"` (default).", - "x-intellij-html-description": "Valid variants are: "1.23", "1.24", "1.25", "1.26", "1.27", "1.28", "1.29" (default).", + "description": "Valid variants are: `\"1.23\"`, `\"1.24\"`, `\"1.25\"`, `\"1.26\"`, `\"1.27\"`, `\"1.28\"`, `\"1.29\"` (default), `\"1.30\"` represents Kubernetes version 1.30.x..", + "x-intellij-html-description": "Valid variants are: "1.23", "1.24", "1.25", "1.26", "1.27", "1.28", "1.29" (default), "1.30" represents Kubernetes version 1.30.x..", "default": "1.29", "enum": [ "1.23", @@ -741,7 +741,8 @@ "1.26", "1.27", "1.28", - "1.29" + "1.29", + "1.30" ] } }, @@ -1310,8 +1311,8 @@ }, "disablePodIMDS": { "type": "boolean", - "description": "blocks all IMDS requests from non host networking pods", - "x-intellij-html-description": "blocks all IMDS requests from non host networking pods", + "description": "blocks all IMDS requests from non-host networking pods", + "x-intellij-html-description": "blocks all IMDS requests from non-host networking pods", "default": false }, "ebsOptimized": { @@ -1674,8 +1675,8 @@ }, "disablePodIMDS": { "type": "boolean", - "description": "blocks all IMDS requests from non host networking pods", - "x-intellij-html-description": "blocks all IMDS requests from non host networking pods", + "description": "blocks all IMDS requests from non-host networking pods", + "x-intellij-html-description": "blocks all IMDS requests from non-host networking pods", "default": false }, "ebsOptimized": { diff --git a/pkg/apis/eksctl.io/v1alpha5/defaults.go b/pkg/apis/eksctl.io/v1alpha5/defaults.go index 6b4e93e2ba..199cab52b3 100644 --- a/pkg/apis/eksctl.io/v1alpha5/defaults.go +++ b/pkg/apis/eksctl.io/v1alpha5/defaults.go @@ -132,9 +132,13 @@ func SetManagedNodeGroupDefaults(ng *ManagedNodeGroup, meta *ClusterMeta, contro setNodeGroupBaseDefaults(ng.NodeGroupBase, meta) // When using custom AMIs, we want the user to explicitly specify AMI family. - // Thus, we only setup default AMI family when no custom AMI is being used. + // Thus, we only set up default AMI family when no custom AMI is being used. if ng.AMIFamily == "" && ng.AMI == "" { - ng.AMIFamily = NodeImageFamilyAmazonLinux2 + if isMinVer, _ := utils.IsMinVersion(Version1_30, meta.Version); isMinVer { + ng.AMIFamily = NodeImageFamilyAmazonLinux2023 + } else { + ng.AMIFamily = NodeImageFamilyAmazonLinux2 + } } if ng.Tags == nil { diff --git a/pkg/apis/eksctl.io/v1alpha5/defaults_test.go b/pkg/apis/eksctl.io/v1alpha5/defaults_test.go index ced2332e8b..a0d470275e 100644 --- a/pkg/apis/eksctl.io/v1alpha5/defaults_test.go +++ b/pkg/apis/eksctl.io/v1alpha5/defaults_test.go @@ -384,5 +384,17 @@ var _ = Describe("ClusterConfig validation", func() { Expect(profile.Selectors[1].Labels).To(HaveLen(0)) }) }) + + DescribeTable("default AMI family", func(kubernetesVersion, expectedAMIFamily string) { + mng := NewManagedNodeGroup() + SetManagedNodeGroupDefaults(mng, &ClusterMeta{ + Version: kubernetesVersion, + }, false) + Expect(mng.AMIFamily).To(Equal(expectedAMIFamily)) + }, + Entry("EKS 1.30 uses AL2023", "1.30", NodeImageFamilyAmazonLinux2023), + Entry("EKS 1.29 uses AL2", "1.29", NodeImageFamilyAmazonLinux2), + Entry("EKS 1.28 uses AL2", "1.28", NodeImageFamilyAmazonLinux2), + ) }) }) diff --git a/pkg/apis/eksctl.io/v1alpha5/types.go b/pkg/apis/eksctl.io/v1alpha5/types.go index 4a7ed65302..6e545fcc09 100644 --- a/pkg/apis/eksctl.io/v1alpha5/types.go +++ b/pkg/apis/eksctl.io/v1alpha5/types.go @@ -43,10 +43,13 @@ const ( Version1_29 = "1.29" + // Version1_30 represents Kubernetes version 1.30.x. + Version1_30 = "1.30" + // DefaultVersion (default) DefaultVersion = Version1_29 - LatestVersion = Version1_29 + LatestVersion = Version1_30 DockershimDeprecationVersion = Version1_24 ) @@ -95,8 +98,8 @@ const ( // Not yet supported versions const ( - // Version1_30 represents Kubernetes version 1.30.x - Version1_30 = "1.30" + // Version1_31 represents Kubernetes version 1.31.x + Version1_31 = "1.31" ) const ( @@ -581,6 +584,7 @@ func SupportedVersions() []string { Version1_27, Version1_28, Version1_29, + Version1_30, } } @@ -1649,7 +1653,7 @@ type NodeGroupBase struct { // +optional DisableIMDSv1 *bool `json:"disableIMDSv1,omitempty"` - // DisablePodIMDS blocks all IMDS requests from non host networking pods + // DisablePodIMDS blocks all IMDS requests from non-host networking pods // Defaults to `false` // +optional DisablePodIMDS *bool `json:"disablePodIMDS,omitempty"` diff --git a/userdocs/src/getting-started.md b/userdocs/src/getting-started.md index 4a11e2b5f7..c8bbce0af3 100644 --- a/userdocs/src/getting-started.md +++ b/userdocs/src/getting-started.md @@ -120,7 +120,7 @@ eksctl create cluster --name=cluster-1 --nodes=4 ### Supported versions -EKS supports versions `1.23` (extended), `1.24` (extended), `1.25`, `1.26`, `1.27`, `1.28` and **`1.29`** (default). +EKS supports versions `1.23` (extended), `1.24` (extended), `1.25`, `1.26`, `1.27`, `1.28`, **`1.29`** (default) and `1.30`. With `eksctl` you can deploy any of the supported versions by passing `--version`. ```sh