From 1310f0b360c7cbf63b2f9f4829d4b50bfb3e6b9e Mon Sep 17 00:00:00 2001 From: Bryant Biggs Date: Sat, 17 Oct 2026 11:35:15 -0500 Subject: [PATCH] feat: raise the minimum supported version to 1.32 --- eksup/src/playbook.rs | 17 +++++++ eksup/src/version.rs | 2 +- eksup/templates/data.yaml | 10 ---- eksup/tests/common/fixtures.rs | 2 +- eksup/tests/common/mock_aws.rs | 2 +- eksup/tests/e2e.rs | 39 ++++----------- eksup/tests/integration.rs | 50 +++++++++---------- .../snapshots/e2e__mixed_findings_json.snap | 7 +-- .../snapshots/e2e__mixed_findings_text.snap | 3 +- .../e2e__playbook_eks_managed_nodegroups.snap | 17 ++++--- .../e2e__playbook_fargate_profiles.snap | 15 +++--- .../snapshots/e2e__playbook_healthy.snap | 15 +++--- .../tests/snapshots/e2e__playbook_mixed.snap | 21 ++++---- .../snapshots/e2e__version_skew_text.snap | 5 +- 14 files changed, 101 insertions(+), 104 deletions(-) diff --git a/eksup/src/playbook.rs b/eksup/src/playbook.rs index b09164b..fa3a9a6 100644 --- a/eksup/src/playbook.rs +++ b/eksup/src/playbook.rs @@ -280,3 +280,20 @@ pub(crate) fn create( fs::write(filename, rendered)?; Ok(()) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn release_data_covers_every_supported_target() { + let data = get_release_data().unwrap(); + for minor in (version::MINIMUM + 1)..=version::LATEST { + let target = version::format_version(minor); + assert!( + data.contains_key(&target), + "data.yaml is missing release data for {target}" + ); + } + } +} diff --git a/eksup/src/version.rs b/eksup/src/version.rs index 5bb0eb4..8422d2b 100644 --- a/eksup/src/version.rs +++ b/eksup/src/version.rs @@ -1,7 +1,7 @@ use anyhow::{Context, Result, bail}; /// Minimum supported minor version — clusters below this cannot be analyzed -pub const MINIMUM: i32 = 30; +pub const MINIMUM: i32 = 32; /// Latest supported minor version pub const LATEST: i32 = 35; diff --git a/eksup/templates/data.yaml b/eksup/templates/data.yaml index ec26a56..956a63b 100644 --- a/eksup/templates/data.yaml +++ b/eksup/templates/data.yaml @@ -1,13 +1,3 @@ -'1.30': - release_url: https://kubernetes.io/blog/2024/04/17/kubernetes-v1-30-release/ - -'1.31': - release_url: https://kubernetes.io/blog/2024/08/13/kubernetes-v1-31-release/ - -'1.32': - release_url: https://kubernetes.io/blog/2024/12/11/kubernetes-v1-32-release/ - deprecation_url: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-32 - '1.33': release_url: https://kubernetes.io/blog/2025/04/23/kubernetes-v1-33-release/ diff --git a/eksup/tests/common/fixtures.rs b/eksup/tests/common/fixtures.rs index 327f888..40e2b0a 100644 --- a/eksup/tests/common/fixtures.rs +++ b/eksup/tests/common/fixtures.rs @@ -16,7 +16,7 @@ pub fn healthy_aws() -> MockAwsClients { MockAwsClients { cluster: Cluster::builder() .name("test-cluster") - .version("1.30") + .version("1.32") .health(ClusterHealth::builder().build()) .resources_vpc_config( VpcConfigResponse::builder() diff --git a/eksup/tests/common/mock_aws.rs b/eksup/tests/common/mock_aws.rs index bd790fc..81933a5 100644 --- a/eksup/tests/common/mock_aws.rs +++ b/eksup/tests/common/mock_aws.rs @@ -31,7 +31,7 @@ pub struct MockAwsClients { impl Default for MockAwsClients { fn default() -> Self { Self { - cluster: Cluster::builder().name("test-cluster").version("1.30").build(), + cluster: Cluster::builder().name("test-cluster").version("1.32").build(), subnet_ips: vec![], addons: vec![], addon_versions: HashMap::new(), diff --git a/eksup/tests/e2e.rs b/eksup/tests/e2e.rs index 90b792f..35b05be 100644 --- a/eksup/tests/e2e.rs +++ b/eksup/tests/e2e.rs @@ -112,7 +112,7 @@ async fn snapshot_workload_issues_json() { async fn snapshot_version_skew_text() { let aws = fixtures::healthy_aws(); let k8s = MockK8sClients { - nodes: vec![fixtures::make_node("node-1", 28), fixtures::make_node("node-2", 27)], + nodes: vec![fixtures::make_node("node-1", 30), fixtures::make_node("node-2", 29)], ..Default::default() }; let results = run_analysis(&aws, &k8s).await; @@ -140,7 +140,7 @@ async fn snapshot_mixed_findings_text() { }, ]; let k8s = MockK8sClients { - nodes: vec![fixtures::make_node("node-1", 28)], + nodes: vec![fixtures::make_node("node-1", 30)], resources: vec![fixtures::make_deployment("web", "default", 1)], ..Default::default() }; @@ -166,7 +166,7 @@ async fn snapshot_mixed_findings_json() { }, ]; let k8s = MockK8sClients { - nodes: vec![fixtures::make_node("node-1", 28)], + nodes: vec![fixtures::make_node("node-1", 30)], resources: vec![fixtures::make_deployment("web", "default", 1)], ..Default::default() }; @@ -184,7 +184,7 @@ async fn snapshot_mixed_findings_json() { async fn snapshot_filter_recommended_text() { let aws = fixtures::healthy_aws(); let k8s = MockK8sClients { - nodes: vec![fixtures::make_node("node-1", 29)], + nodes: vec![fixtures::make_node("node-1", 31)], resources: vec![fixtures::make_deployment("web", "default", 2)], ..Default::default() }; @@ -271,7 +271,7 @@ async fn snapshot_playbook_mixed() { aws.nodegroups = vec![Nodegroup::builder().nodegroup_name("mng-1").build()]; aws.fargate_profiles = vec![FargateProfile::builder().fargate_profile_name("fp-1").build()]; let k8s = MockK8sClients { - nodes: vec![fixtures::make_node("node-1", 28)], + nodes: vec![fixtures::make_node("node-1", 30)], resources: vec![fixtures::make_deployment("web", "default", 1)], ..Default::default() }; @@ -351,8 +351,8 @@ async fn playbook_template_variables_populated() { assert!(output.contains("test-cluster"), "cluster name should appear"); assert!(output.contains("us-east-1"), "region should appear"); - assert!(output.contains("v1.30"), "current version should appear"); - assert!(output.contains("v1.31"), "target version should appear"); + assert!(output.contains("v1.32"), "current version should appear"); + assert!(output.contains("v1.33"), "target version should appear"); assert!(output.contains("kubernetes.io/blog/"), "release URL should appear"); } @@ -374,31 +374,14 @@ async fn playbook_pod_ips_healthy_when_no_custom_networking() { } #[tokio::test] -async fn playbook_deprecation_url_absent_for_1_31_target() { - // Cluster at 1.30 -> target 1.31 (no deprecation_url in data.yaml) - let aws = aws_at_version("1.30"); +async fn playbook_deprecation_url_absent_for_1_33_target() { + // Cluster at 1.32 -> target 1.33 (no deprecation_url in data.yaml) + let aws = aws_at_version("1.32"); let k8s = fixtures::healthy_k8s(); let output = render_playbook(&aws, &k8s).await; assert!( !output.contains("API deprecations"), - "deprecation link should be absent for 1.31 target" - ); -} - -#[tokio::test] -async fn playbook_deprecation_url_present_for_1_32_target() { - // Cluster at 1.31 -> target 1.32 (has deprecation_url in data.yaml) - let aws = aws_at_version("1.31"); - let k8s = fixtures::healthy_k8s(); - let output = render_playbook(&aws, &k8s).await; - - assert!( - output.contains("API deprecations"), - "deprecation link should be present for 1.32 target" - ); - assert!( - output.contains("deprecation-guide/#v1-32"), - "deprecation URL should point to 1.32 guide" + "deprecation link should be absent for 1.33 target" ); } diff --git a/eksup/tests/integration.rs b/eksup/tests/integration.rs index c539b69..aaed389 100644 --- a/eksup/tests/integration.rs +++ b/eksup/tests/integration.rs @@ -82,7 +82,7 @@ async fn subnet_findings_insufficient_control_plane_ips() { #[tokio::test] async fn addon_findings_no_addons() { let aws = fixtures::healthy_aws(); - let result = eksup::eks::get_addon_findings(&aws, "test-cluster", "1.30", 31) + let result = eksup::eks::get_addon_findings(&aws, "test-cluster", "1.32", 33) .await .unwrap(); assert!(result.version_compatibility.is_empty()); @@ -99,16 +99,16 @@ async fn addon_findings_version_incompatible() { aws.addons = vec![Addon::builder().addon_name("vpc-cni").addon_version("v1.12.0").build()]; aws.addon_versions = HashMap::from([ ( - ("vpc-cni".into(), "1.30".into()), + ("vpc-cni".into(), "1.32".into()), fixtures::make_addon_version("v1.15.0", "v1.14.0", &["v1.15.0", "v1.14.0"]), ), ( - ("vpc-cni".into(), "1.31".into()), + ("vpc-cni".into(), "1.33".into()), fixtures::make_addon_version("v1.16.0", "v1.15.0", &["v1.16.0", "v1.15.0"]), ), ]); - let result = eksup::eks::get_addon_findings(&aws, "test-cluster", "1.30", 31) + let result = eksup::eks::get_addon_findings(&aws, "test-cluster", "1.32", 33) .await .unwrap(); assert_eq!(result.version_compatibility.len(), 1); @@ -121,7 +121,7 @@ async fn addon_findings_version_incompatible() { #[tokio::test] async fn data_plane_findings_empty() { let aws = fixtures::healthy_aws(); - let result = eksup::eks::get_data_plane_findings(&aws, &aws.cluster, 31) + let result = eksup::eks::get_data_plane_findings(&aws, &aws.cluster, 33) .await .unwrap(); assert!(result.eks_managed_nodegroup_health.is_empty()); @@ -154,7 +154,7 @@ async fn data_plane_findings_node_ips() { }, ]; - let result = eksup::eks::get_data_plane_findings(&aws, &aws.cluster, 31) + let result = eksup::eks::get_data_plane_findings(&aws, &aws.cluster, 33) .await .unwrap(); assert!(!result.node_ips.is_empty(), "low IP subnets should produce findings"); @@ -167,7 +167,7 @@ async fn data_plane_findings_node_ips() { #[tokio::test] async fn kubernetes_findings_empty() { let k8s = fixtures::healthy_k8s(); - let (result, _suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 30, 31, &ChecksConfig::default()) + let (result, _suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 32, 33, &ChecksConfig::default()) .await .unwrap(); assert!(result.version_skew.is_empty()); @@ -177,11 +177,11 @@ async fn kubernetes_findings_empty() { #[tokio::test] async fn kubernetes_findings_version_skew() { let k8s = MockK8sClients { - nodes: vec![fixtures::make_node("node-1", 28)], + nodes: vec![fixtures::make_node("node-1", 30)], ..Default::default() }; - let (result, _suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 30, 31, &ChecksConfig::default()) + let (result, _suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 32, 33, &ChecksConfig::default()) .await .unwrap(); assert_eq!(result.version_skew.len(), 1); @@ -194,7 +194,7 @@ async fn kubernetes_findings_workload_issues() { ..Default::default() }; - let (result, _suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 30, 31, &ChecksConfig::default()) + let (result, _suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 32, 33, &ChecksConfig::default()) .await .unwrap(); assert!(!result.min_replicas.is_empty(), "1 replica should trigger finding"); @@ -244,7 +244,7 @@ async fn kubernetes_findings_missing_pdb() { ..Default::default() }; - let (result, _suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 30, 31, &ChecksConfig::default()) + let (result, _suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 32, 33, &ChecksConfig::default()) .await .unwrap(); assert!( @@ -261,7 +261,7 @@ async fn kubernetes_findings_missing_pdb() { async fn analyze_healthy_cluster() { let aws = fixtures::healthy_aws(); let k8s = fixtures::healthy_k8s(); - let results = eksup::analysis::analyze(&aws, &k8s, &aws.cluster, 31, &Config::default()) + let results = eksup::analysis::analyze(&aws, &k8s, &aws.cluster, 33, &Config::default()) .await .unwrap(); @@ -275,12 +275,12 @@ async fn analyze_healthy_cluster() { async fn analyze_filter_recommended() { let k8s = MockK8sClients { resources: vec![fixtures::make_deployment("web", "default", 2)], - nodes: vec![fixtures::make_node("node-1", 29)], + nodes: vec![fixtures::make_node("node-1", 31)], ..Default::default() }; let aws = fixtures::healthy_aws(); - let mut results = eksup::analysis::analyze(&aws, &k8s, &aws.cluster, 31, &Config::default()) + let mut results = eksup::analysis::analyze(&aws, &k8s, &aws.cluster, 33, &Config::default()) .await .unwrap(); let before_skew = results.kubernetes.version_skew.len(); @@ -295,11 +295,11 @@ async fn analyze_filter_recommended() { #[tokio::test] async fn analyze_with_explicit_target() { - let aws = fixtures::healthy_aws(); // cluster version "1.30" + let aws = fixtures::healthy_aws(); // cluster version "1.32" let k8s = fixtures::healthy_k8s(); - // Jump from 1.30 → 1.33 - let results = eksup::analysis::analyze(&aws, &k8s, &aws.cluster, 33, &Config::default()) + // Jump from 1.32 → 1.35 + let results = eksup::analysis::analyze(&aws, &k8s, &aws.cluster, 35, &Config::default()) .await .unwrap(); @@ -479,14 +479,14 @@ async fn analyze_aws_error_propagates() { let cluster = aws_sdk_eks::types::Cluster::builder() .name("test") - .version("1.30") + .version("1.32") .build(); let result = eksup::analysis::analyze( &MockAwsClientsError, &MockK8sClientsError, &cluster, - 31, + 33, &Config::default(), ) .await; @@ -504,7 +504,7 @@ async fn kubernetes_findings_min_replicas_default_threshold() { resources: vec![fixtures::make_deployment("web", "default", 2)], ..Default::default() }; - let (result, _suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 30, 31, &ChecksConfig::default()) + let (result, _suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 32, 33, &ChecksConfig::default()) .await .unwrap(); assert!( @@ -525,7 +525,7 @@ async fn kubernetes_findings_min_replicas_strict_threshold() { min_replicas: 3, ..Default::default() }; - let (result, _suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 30, 31, &checks) + let (result, _suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 32, 33, &checks) .await .unwrap(); assert_eq!( @@ -549,7 +549,7 @@ async fn kubernetes_findings_min_replicas_ignored() { }], ..Default::default() }; - let (result, suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 30, 31, &checks) + let (result, suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 32, 33, &checks) .await .unwrap(); assert!( @@ -581,7 +581,7 @@ async fn kubernetes_findings_min_replicas_per_workload_override() { }], ..Default::default() }; - let (result, _suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 30, 31, &checks) + let (result, _suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 32, 33, &checks) .await .unwrap(); assert_eq!(result.min_replicas.len(), 1, "only etcd should fail (3 < 5)"); @@ -633,7 +633,7 @@ async fn kubernetes_findings_pdb_ignored() { }; // Without ignore: should trigger PDB finding - let (result, _suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 30, 31, &ChecksConfig::default()) + let (result, _suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 32, 33, &ChecksConfig::default()) .await .unwrap(); assert!( @@ -649,7 +649,7 @@ async fn kubernetes_findings_pdb_ignored() { namespace: "default".into(), }], }; - let (result, suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 30, 31, &checks) + let (result, suppressed) = eksup::k8s::get_kubernetes_findings(&k8s, 32, 33, &checks) .await .unwrap(); assert!( diff --git a/eksup/tests/snapshots/e2e__mixed_findings_json.snap b/eksup/tests/snapshots/e2e__mixed_findings_json.snap index 2d3fe8a..ef376c8 100644 --- a/eksup/tests/snapshots/e2e__mixed_findings_json.snap +++ b/eksup/tests/snapshots/e2e__mixed_findings_json.snap @@ -1,5 +1,6 @@ --- source: eksup/tests/e2e.rs +assertion_line: 176 expression: output --- { @@ -52,9 +53,9 @@ expression: output "remediation": "Recommended" }, "name": "node-1", - "kubelet_version": "v1.28.0", - "kubernetes_version": "v1.28", - "control_plane_version": "v1.30", + "kubelet_version": "v1.30.0", + "kubernetes_version": "v1.30", + "control_plane_version": "v1.32", "version_skew": "+2" } ], diff --git a/eksup/tests/snapshots/e2e__mixed_findings_text.snap b/eksup/tests/snapshots/e2e__mixed_findings_text.snap index e3ca29e..00a7fdb 100644 --- a/eksup/tests/snapshots/e2e__mixed_findings_text.snap +++ b/eksup/tests/snapshots/e2e__mixed_findings_text.snap @@ -1,5 +1,6 @@ --- source: eksup/tests/e2e.rs +assertion_line: 150 expression: output --- ┌────────┬────┬──────────┬──────────────┐ @@ -11,7 +12,7 @@ expression: output ┌────────┬────┬────────┬───────┬───────────────┬──────┐ │ CHECK │ │ NAME │ NODE │ CONTROL PLANE │ SKEW │ ├────────┼────┼────────┼───────┼───────────────┼──────┤ -│ K8S001 │ ⚠️ │ node-1 │ v1.28 │ v1.30 │ +2 │ +│ K8S001 │ ⚠️ │ node-1 │ v1.30 │ v1.32 │ +2 │ └────────┴────┴────────┴───────┴───────────────┴──────┘ ┌────────┬────┬──────┬───────────┬────────────┬──────────┐ │ CHECK │ │ NAME │ NAMESPACE │ KIND │ REPLICAS │ diff --git a/eksup/tests/snapshots/e2e__playbook_eks_managed_nodegroups.snap b/eksup/tests/snapshots/e2e__playbook_eks_managed_nodegroups.snap index 61c0ad3..7791ff1 100644 --- a/eksup/tests/snapshots/e2e__playbook_eks_managed_nodegroups.snap +++ b/eksup/tests/snapshots/e2e__playbook_eks_managed_nodegroups.snap @@ -1,5 +1,6 @@ --- source: eksup/tests/e2e.rs +assertion_line: 256 expression: output --- # EKS Cluster Upgrade @@ -7,8 +8,8 @@ expression: output | | Value | | :------------------------- | :-------------------------------------------------------: | | Amazon EKS cluster | `test-cluster` | -| Current version | `v1.30` | -| Target version | `v1.31` | +| Current version | `v1.32` | +| Target version | `v1.33` | | EKS Managed nodegroup(s) | ✅ | | Self-Managed nodegroup(s) | ➖ | | Fargate profile(s) | ➖ | @@ -34,8 +35,8 @@ expression: output 1. Review the following resources for affected changes in the next version of Kubernetes: - - ℹ️ [Kubernetes `1.31` release announcement](https://kubernetes.io/blog/2024/08/13/kubernetes-v1-31-release/) - - ℹ️ [EKS `1.31` release notes](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html#kubernetes-1.31) + - ℹ️ [Kubernetes `1.33` release announcement](https://kubernetes.io/blog/2025/04/23/kubernetes-v1-33-release/) + - ℹ️ [EKS `1.33` release notes](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html#kubernetes-1.33) 2. Per the [Kubernetes version skew policy](https://kubernetes.io/releases/version-skew-policy/#supported-version-skew), the `kubelet` version must not be newer than `kube-apiserver`, and may be up to two minor versions older. It is recommended that the nodes in the data plane are aligned with the same minor version as the control plane before upgrading. @@ -118,9 +119,9 @@ expression: output CURRENT=$(aws eks describe-addon --cluster-name test-cluster --region us-east-1 \ --addon-name ${ADDON} --query 'addon.addonVersion' --output text) LATEST=$(aws eks describe-addon-versions --region us-east-1 --addon-name ${ADDON} \ - --kubernetes-version 1.31 --query 'addons[0].addonVersions[0].addonVersion' --output text) + --kubernetes-version 1.33 --query 'addons[0].addonVersions[0].addonVersion' --output text) LIST=$(aws eks describe-addon-versions --region us-east-1 --addon-name ${ADDON} \ - --kubernetes-version 1.31 --query 'addons[0].addonVersions[*].addonVersion') + --kubernetes-version 1.33 --query 'addons[0].addonVersions[*].addonVersion') echo "${ADDON} current version: ${CURRENT}" echo "${ADDON} next latest version: ${LATEST}" @@ -165,7 +166,7 @@ When upgrading the control plane, Amazon EKS performs standard infrastructure an ```sh aws eks update-cluster-version --region us-east-1 --name test-cluster \ - --kubernetes-version 1.31 + --kubernetes-version 1.33 ``` 2. Wait for the control plane to finish upgrading before proceeding with any further modifications. The cluster status will change to `ACTIVE` once the upgrade is complete. @@ -324,7 +325,7 @@ EKS optimized AMI provided by Amazon EKS: ```sh aws eks update-nodegroup-version --region us-east-1 --cluster-name test-cluster \ - --nodegroup-name --kubernetes-version 1.31 + --nodegroup-name --kubernetes-version 1.33 ``` ##### Process diff --git a/eksup/tests/snapshots/e2e__playbook_fargate_profiles.snap b/eksup/tests/snapshots/e2e__playbook_fargate_profiles.snap index 13748c4..d58181e 100644 --- a/eksup/tests/snapshots/e2e__playbook_fargate_profiles.snap +++ b/eksup/tests/snapshots/e2e__playbook_fargate_profiles.snap @@ -1,5 +1,6 @@ --- source: eksup/tests/e2e.rs +assertion_line: 265 expression: output --- # EKS Cluster Upgrade @@ -7,8 +8,8 @@ expression: output | | Value | | :------------------------- | :-------------------------------------------------------: | | Amazon EKS cluster | `test-cluster` | -| Current version | `v1.30` | -| Target version | `v1.31` | +| Current version | `v1.32` | +| Target version | `v1.33` | | EKS Managed nodegroup(s) | ➖ | | Self-Managed nodegroup(s) | ➖ | | Fargate profile(s) | ✅ | @@ -33,8 +34,8 @@ expression: output 1. Review the following resources for affected changes in the next version of Kubernetes: - - ℹ️ [Kubernetes `1.31` release announcement](https://kubernetes.io/blog/2024/08/13/kubernetes-v1-31-release/) - - ℹ️ [EKS `1.31` release notes](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html#kubernetes-1.31) + - ℹ️ [Kubernetes `1.33` release announcement](https://kubernetes.io/blog/2025/04/23/kubernetes-v1-33-release/) + - ℹ️ [EKS `1.33` release notes](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html#kubernetes-1.33) 2. Per the [Kubernetes version skew policy](https://kubernetes.io/releases/version-skew-policy/#supported-version-skew), the `kubelet` version must not be newer than `kube-apiserver`, and may be up to two minor versions older. It is recommended that the nodes in the data plane are aligned with the same minor version as the control plane before upgrading. @@ -117,9 +118,9 @@ expression: output CURRENT=$(aws eks describe-addon --cluster-name test-cluster --region us-east-1 \ --addon-name ${ADDON} --query 'addon.addonVersion' --output text) LATEST=$(aws eks describe-addon-versions --region us-east-1 --addon-name ${ADDON} \ - --kubernetes-version 1.31 --query 'addons[0].addonVersions[0].addonVersion' --output text) + --kubernetes-version 1.33 --query 'addons[0].addonVersions[0].addonVersion' --output text) LIST=$(aws eks describe-addon-versions --region us-east-1 --addon-name ${ADDON} \ - --kubernetes-version 1.31 --query 'addons[0].addonVersions[*].addonVersion') + --kubernetes-version 1.33 --query 'addons[0].addonVersions[*].addonVersion') echo "${ADDON} current version: ${CURRENT}" echo "${ADDON} next latest version: ${LATEST}" @@ -164,7 +165,7 @@ When upgrading the control plane, Amazon EKS performs standard infrastructure an ```sh aws eks update-cluster-version --region us-east-1 --name test-cluster \ - --kubernetes-version 1.31 + --kubernetes-version 1.33 ``` 2. Wait for the control plane to finish upgrading before proceeding with any further modifications. The cluster status will change to `ACTIVE` once the upgrade is complete. diff --git a/eksup/tests/snapshots/e2e__playbook_healthy.snap b/eksup/tests/snapshots/e2e__playbook_healthy.snap index 0416398..ed04437 100644 --- a/eksup/tests/snapshots/e2e__playbook_healthy.snap +++ b/eksup/tests/snapshots/e2e__playbook_healthy.snap @@ -1,5 +1,6 @@ --- source: eksup/tests/e2e.rs +assertion_line: 247 expression: output --- # EKS Cluster Upgrade @@ -7,8 +8,8 @@ expression: output | | Value | | :------------------------- | :-------------------------------------------------------: | | Amazon EKS cluster | `test-cluster` | -| Current version | `v1.30` | -| Target version | `v1.31` | +| Current version | `v1.32` | +| Target version | `v1.33` | | EKS Managed nodegroup(s) | ➖ | | Self-Managed nodegroup(s) | ➖ | | Fargate profile(s) | ➖ | @@ -32,8 +33,8 @@ expression: output 1. Review the following resources for affected changes in the next version of Kubernetes: - - ℹ️ [Kubernetes `1.31` release announcement](https://kubernetes.io/blog/2024/08/13/kubernetes-v1-31-release/) - - ℹ️ [EKS `1.31` release notes](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html#kubernetes-1.31) + - ℹ️ [Kubernetes `1.33` release announcement](https://kubernetes.io/blog/2025/04/23/kubernetes-v1-33-release/) + - ℹ️ [EKS `1.33` release notes](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html#kubernetes-1.33) 2. Per the [Kubernetes version skew policy](https://kubernetes.io/releases/version-skew-policy/#supported-version-skew), the `kubelet` version must not be newer than `kube-apiserver`, and may be up to two minor versions older. It is recommended that the nodes in the data plane are aligned with the same minor version as the control plane before upgrading. @@ -116,9 +117,9 @@ expression: output CURRENT=$(aws eks describe-addon --cluster-name test-cluster --region us-east-1 \ --addon-name ${ADDON} --query 'addon.addonVersion' --output text) LATEST=$(aws eks describe-addon-versions --region us-east-1 --addon-name ${ADDON} \ - --kubernetes-version 1.31 --query 'addons[0].addonVersions[0].addonVersion' --output text) + --kubernetes-version 1.33 --query 'addons[0].addonVersions[0].addonVersion' --output text) LIST=$(aws eks describe-addon-versions --region us-east-1 --addon-name ${ADDON} \ - --kubernetes-version 1.31 --query 'addons[0].addonVersions[*].addonVersion') + --kubernetes-version 1.33 --query 'addons[0].addonVersions[*].addonVersion') echo "${ADDON} current version: ${CURRENT}" echo "${ADDON} next latest version: ${LATEST}" @@ -163,7 +164,7 @@ When upgrading the control plane, Amazon EKS performs standard infrastructure an ```sh aws eks update-cluster-version --region us-east-1 --name test-cluster \ - --kubernetes-version 1.31 + --kubernetes-version 1.33 ``` 2. Wait for the control plane to finish upgrading before proceeding with any further modifications. The cluster status will change to `ACTIVE` once the upgrade is complete. diff --git a/eksup/tests/snapshots/e2e__playbook_mixed.snap b/eksup/tests/snapshots/e2e__playbook_mixed.snap index 3fb53f8..d1fdf93 100644 --- a/eksup/tests/snapshots/e2e__playbook_mixed.snap +++ b/eksup/tests/snapshots/e2e__playbook_mixed.snap @@ -1,5 +1,6 @@ --- source: eksup/tests/e2e.rs +assertion_line: 279 expression: output --- # EKS Cluster Upgrade @@ -7,8 +8,8 @@ expression: output | | Value | | :------------------------- | :-------------------------------------------------------: | | Amazon EKS cluster | `test-cluster` | -| Current version | `v1.30` | -| Target version | `v1.31` | +| Current version | `v1.32` | +| Target version | `v1.33` | | EKS Managed nodegroup(s) | ✅ | | Self-Managed nodegroup(s) | ➖ | | Fargate profile(s) | ✅ | @@ -35,8 +36,8 @@ expression: output 1. Review the following resources for affected changes in the next version of Kubernetes: - - ℹ️ [Kubernetes `1.31` release announcement](https://kubernetes.io/blog/2024/08/13/kubernetes-v1-31-release/) - - ℹ️ [EKS `1.31` release notes](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html#kubernetes-1.31) + - ℹ️ [Kubernetes `1.33` release announcement](https://kubernetes.io/blog/2025/04/23/kubernetes-v1-33-release/) + - ℹ️ [EKS `1.33` release notes](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html#kubernetes-1.33) 2. Per the [Kubernetes version skew policy](https://kubernetes.io/releases/version-skew-policy/#supported-version-skew), the `kubelet` version must not be newer than `kube-apiserver`, and may be up to two minor versions older. It is recommended that the nodes in the data plane are aligned with the same minor version as the control plane before upgrading. @@ -76,11 +77,11 @@ expression: output #### Check [[K8S001]](https://clowdhaus.github.io/eksup/info/checks/#k8s001) | CHECK | | NODE | CONTROL PLANE | SKEW | QUANTITY | |--------|----|-------|---------------|------|----------| - | K8S001 | ⚠️ | v1.28 | v1.30 | +2 | 1 | + | K8S001 | ⚠️ | v1.30 | v1.32 | +2 | 1 | | | NAME | NODE | CONTROL PLANE | SKEW | |----|--------|-------|---------------|------| - | ⚠️ | node-1 | v1.28 | v1.30 | +2 | + | ⚠️ | node-1 | v1.30 | v1.32 | +2 | 3. Verify that there are at least 5 free IPs in the VPC subnets used by the control plane. Amazon EKS creates new elastic network interfaces (ENIs) in any of the subnets specified for the control plane. If there are not enough available IPs, then the upgrade will fail (your control plane will stay on the prior version). @@ -126,9 +127,9 @@ expression: output CURRENT=$(aws eks describe-addon --cluster-name test-cluster --region us-east-1 \ --addon-name ${ADDON} --query 'addon.addonVersion' --output text) LATEST=$(aws eks describe-addon-versions --region us-east-1 --addon-name ${ADDON} \ - --kubernetes-version 1.31 --query 'addons[0].addonVersions[0].addonVersion' --output text) + --kubernetes-version 1.33 --query 'addons[0].addonVersions[0].addonVersion' --output text) LIST=$(aws eks describe-addon-versions --region us-east-1 --addon-name ${ADDON} \ - --kubernetes-version 1.31 --query 'addons[0].addonVersions[*].addonVersion') + --kubernetes-version 1.33 --query 'addons[0].addonVersions[*].addonVersion') echo "${ADDON} current version: ${CURRENT}" echo "${ADDON} next latest version: ${LATEST}" @@ -173,7 +174,7 @@ When upgrading the control plane, Amazon EKS performs standard infrastructure an ```sh aws eks update-cluster-version --region us-east-1 --name test-cluster \ - --kubernetes-version 1.31 + --kubernetes-version 1.33 ``` 2. Wait for the control plane to finish upgrading before proceeding with any further modifications. The cluster status will change to `ACTIVE` once the upgrade is complete. @@ -344,7 +345,7 @@ EKS optimized AMI provided by Amazon EKS: ```sh aws eks update-nodegroup-version --region us-east-1 --cluster-name test-cluster \ - --nodegroup-name --kubernetes-version 1.31 + --nodegroup-name --kubernetes-version 1.33 ``` ##### Process diff --git a/eksup/tests/snapshots/e2e__version_skew_text.snap b/eksup/tests/snapshots/e2e__version_skew_text.snap index 1d96b0b..e0f262a 100644 --- a/eksup/tests/snapshots/e2e__version_skew_text.snap +++ b/eksup/tests/snapshots/e2e__version_skew_text.snap @@ -1,10 +1,11 @@ --- source: eksup/tests/e2e.rs +assertion_line: 120 expression: output --- ┌────────┬────┬────────┬───────┬───────────────┬──────┐ │ CHECK │ │ NAME │ NODE │ CONTROL PLANE │ SKEW │ ├────────┼────┼────────┼───────┼───────────────┼──────┤ -│ K8S001 │ ⚠️ │ node-1 │ v1.28 │ v1.30 │ +2 │ -│ K8S001 │ ❌ │ node-2 │ v1.27 │ v1.30 │ +3 │ +│ K8S001 │ ⚠️ │ node-1 │ v1.30 │ v1.32 │ +2 │ +│ K8S001 │ ❌ │ node-2 │ v1.29 │ v1.32 │ +3 │ └────────┴────┴────────┴───────┴───────────────┴──────┘