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