Skip to content

Commit

Permalink
feat(eks): support for Kubernetes version 1.25 (#24484)
Browse files Browse the repository at this point in the history
Depends on cdklabs/awscdk-asset-kubectl#174
Closes #24282

https://aws.amazon.com/blogs/containers/amazon-eks-now-supports-kubernetes-version-1-25/

<img width="1299" alt="image" src="https://user-images.githubusercontent.com/31543/223216858-bad3062d-e839-4ebe-bb09-fc08c1c94358.png">
<img width="1561" alt="image" src="https://user-images.githubusercontent.com/31543/223236176-0ecf38ca-3a89-40bc-a97d-0a8f29b26329.png">


----

*By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
  • Loading branch information
robertd committed Mar 9, 2023
1 parent 1487d9e commit 70fd3e9
Show file tree
Hide file tree
Showing 19 changed files with 60 additions and 47 deletions.
10 changes: 5 additions & 5 deletions packages/@aws-cdk/aws-eks/README.md
Expand Up @@ -50,8 +50,8 @@ This example defines an Amazon EKS cluster with the following configuration:
```ts
// provisiong a cluster
const cluster = new eks.Cluster(this, 'hello-eks', {
version: eks.KubernetesVersion.V1_24,
kubectlLayer: new KubectlV24Layer(this, 'kubectl'),
version: eks.KubernetesVersion.V1_25,
kubectlLayer: new KubectlV25Layer(this, 'kubectl'),
});

// apply a kubernetes manifest to the cluster
Expand Down Expand Up @@ -684,11 +684,11 @@ Only version 1.20 of kubectl is available in `aws-cdk-lib`. If you need a differ
version, you will need to use one of the `@aws-cdk/lambda-layer-kubectl-vXY` packages.

```ts
import { KubectlV24Layer } from '@aws-cdk/lambda-layer-kubectl-v24';
import { KubectlV25Layer } from '@aws-cdk/lambda-layer-kubectl-v25';

const cluster = new eks.Cluster(this, 'hello-eks', {
version: eks.KubernetesVersion.V1_24,
kubectlLayer: new KubectlV24Layer(this, 'kubectl'),
version: eks.KubernetesVersion.V1_25,
kubectlLayer: new KubectlV25Layer(this, 'kubectl'),
});
```

Expand Down
10 changes: 10 additions & 0 deletions packages/@aws-cdk/aws-eks/lib/cluster.ts
Expand Up @@ -799,6 +799,7 @@ export interface ClusterProps extends ClusterOptions {

/**
* Kubernetes cluster version
* @see https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html#kubernetes-release-calendar
*/
export class KubernetesVersion {
/**
Expand Down Expand Up @@ -875,6 +876,15 @@ export class KubernetesVersion {
*/
public static readonly V1_24 = KubernetesVersion.of('1.24');

/**
* Kubernetes version 1.25
*
* When creating a `Cluster` with this version, you need to also specify the
* `kubectlLayer` property with a `KubectlV25Layer` from
* `@aws-cdk/lambda-layer-kubectl-v25`.
*/
public static readonly V1_25 = KubernetesVersion.of('1.25');

/**
* Custom cluster version
* @param version custom version number
Expand Down
14 changes: 7 additions & 7 deletions packages/@aws-cdk/aws-eks/test/cluster.test.ts
Expand Up @@ -18,7 +18,7 @@ import { BottleRocketImage } from '../lib/private/bottlerocket';

/* eslint-disable max-len */

const CLUSTER_VERSION = eks.KubernetesVersion.V1_21;
const CLUSTER_VERSION = eks.KubernetesVersion.V1_25;

describe('cluster', () => {
test('can configure and access ALB controller', () => {
Expand Down Expand Up @@ -656,7 +656,7 @@ describe('cluster', () => {
Template.fromStack(stack).hasResourceProperties('Custom::AWSCDK-EKS-Cluster', {
Config: {
roleArn: { 'Fn::GetAtt': ['ClusterRoleFA261979', 'Arn'] },
version: '1.21',
version: CLUSTER_VERSION.version,
resourcesVpcConfig: {
securityGroupIds: [{ 'Fn::GetAtt': ['ClusterControlPlaneSecurityGroupD274242C', 'GroupId'] }],
subnetIds: [
Expand Down Expand Up @@ -1589,7 +1589,7 @@ describe('cluster', () => {
const { app, stack } = testFixtureNoVpc();

// WHEN
new eks.EksOptimizedImage({ kubernetesVersion: '1.21' }).getImage(stack);
new eks.EksOptimizedImage({ kubernetesVersion: CLUSTER_VERSION.version }).getImage(stack);

// THEN
const assembly = app.synth();
Expand All @@ -1600,7 +1600,7 @@ describe('cluster', () => {
)).toEqual(true);
expect(Object.entries(parameters).some(
([k, v]) => k.startsWith('SsmParameterValueawsserviceeksoptimizedami') &&
(v as any).Default.includes('/1.21/'),
(v as any).Default.includes('/1.25/'),
)).toEqual(true);
});

Expand Down Expand Up @@ -1773,7 +1773,7 @@ describe('cluster', () => {
const { app, stack } = testFixtureNoVpc();

// WHEN
new BottleRocketImage({ kubernetesVersion: '1.21' }).getImage(stack);
new BottleRocketImage({ kubernetesVersion: CLUSTER_VERSION.version }).getImage(stack);

// THEN
const assembly = app.synth();
Expand All @@ -1784,7 +1784,7 @@ describe('cluster', () => {
)).toEqual(true);
expect(Object.entries(parameters).some(
([k, v]) => k.startsWith('SsmParameterValueawsservicebottlerocketaws') &&
(v as any).Default.includes('/aws-k8s-1.21/'),
(v as any).Default.includes('/aws-k8s-1.25/'),
)).toEqual(true);
});

Expand All @@ -1804,7 +1804,7 @@ describe('cluster', () => {
Config: {
name: 'my-cluster-name',
roleArn: { 'Fn::GetAtt': ['MyClusterRoleBA20FE72', 'Arn'] },
version: '1.21',
version: CLUSTER_VERSION.version,
resourcesVpcConfig: {
securityGroupIds: [
{ 'Fn::GetAtt': ['MyClusterControlPlaneSecurityGroup6B658F79', 'GroupId'] },
Expand Down
2 changes: 1 addition & 1 deletion packages/@aws-cdk/aws-eks/test/fargate.test.ts
Expand Up @@ -5,7 +5,7 @@ import * as kms from '@aws-cdk/aws-kms';
import { Stack, Tags } from '@aws-cdk/core';
import * as eks from '../lib';

const CLUSTER_VERSION = eks.KubernetesVersion.V1_21;
const CLUSTER_VERSION = eks.KubernetesVersion.V1_25;

describe('fargate', () => {
test('can be added to a cluster', () => {
Expand Down
Expand Up @@ -46,6 +46,7 @@ def helm_handler(event, context):
create_namespace = props.get('CreateNamespace', None)
repository = props.get('Repository', None)
values_text = props.get('Values', None)
skip_crds = props.get('SkipCrds', False)

# "log in" to the cluster
subprocess.check_call([ 'aws', 'eks', 'update-kubeconfig',
Expand Down Expand Up @@ -146,7 +147,7 @@ def get_chart_from_oci(tmpdir, repository = None, version = None):
raise Exception(f'Operation failed after {maxAttempts} attempts: {output}')


def helm(verb, release, chart = None, repo = None, file = None, namespace = None, version = None, wait = False, timeout = None, create_namespace = None):
def helm(verb, release, chart = None, repo = None, file = None, namespace = None, version = None, wait = False, timeout = None, create_namespace = None, skip_crds = False):
import subprocess

cmnd = ['helm', verb, release]
Expand All @@ -166,6 +167,8 @@ def helm(verb, release, chart = None, repo = None, file = None, namespace = None
cmnd.extend(['--namespace', namespace])
if wait:
cmnd.append('--wait')
if skip_crds:
cmnd.append('--skip-crds')
if not timeout is None:
cmnd.extend(['--timeout', timeout])
cmnd.extend(['--kubeconfig', kubeconfig])
Expand Down
Binary file not shown.
Binary file not shown.
Binary file not shown.
Expand Up @@ -57,15 +57,15 @@
}
}
},
"c17e6c5822dd39738b3ba669bef4bb7c8fceaea76b51477bf94d6745d0c201c8": {
"92ea03f8b2e779503519f7781d06c03f95b46863db85f5c50a4e7debfd04be02": {
"source": {
"path": "asset.c17e6c5822dd39738b3ba669bef4bb7c8fceaea76b51477bf94d6745d0c201c8",
"path": "asset.92ea03f8b2e779503519f7781d06c03f95b46863db85f5c50a4e7debfd04be02",
"packaging": "zip"
},
"destinations": {
"current_account-us-east-1": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1",
"objectKey": "c17e6c5822dd39738b3ba669bef4bb7c8fceaea76b51477bf94d6745d0c201c8.zip",
"objectKey": "92ea03f8b2e779503519f7781d06c03f95b46863db85f5c50a4e7debfd04be02.zip",
"region": "us-east-1",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-us-east-1"
}
Expand Down Expand Up @@ -141,29 +141,29 @@
}
}
},
"67a3aa529ec1ed1816a4cf80820b64e8664fc647e3c49f45996ed25b332e7d07": {
"82bc7202ab93521f556ffe91199b3e2d55a9b03ae8334a40d6a5dd07ed7cbaeb": {
"source": {
"path": "awscdkeksclustertestawscdkawseksKubectlProviderE05943BF.nested.template.json",
"packaging": "file"
},
"destinations": {
"current_account-us-east-1": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1",
"objectKey": "67a3aa529ec1ed1816a4cf80820b64e8664fc647e3c49f45996ed25b332e7d07.json",
"objectKey": "82bc7202ab93521f556ffe91199b3e2d55a9b03ae8334a40d6a5dd07ed7cbaeb.json",
"region": "us-east-1",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-us-east-1"
}
}
},
"6782a2a042fa36c961aad9bb00a06c22bfc03046118bf097208ad738af93cbe7": {
"fa91c42247dc7e7ad1ecea9e8017595a5e51a6892c8585202a74b115bd521a16": {
"source": {
"path": "aws-cdk-eks-cluster-test.template.json",
"packaging": "file"
},
"destinations": {
"current_account-us-east-1": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1",
"objectKey": "6782a2a042fa36c961aad9bb00a06c22bfc03046118bf097208ad738af93cbe7.json",
"objectKey": "fa91c42247dc7e7ad1ecea9e8017595a5e51a6892c8585202a74b115bd521a16.json",
"region": "us-east-1",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-us-east-1"
}
Expand Down
Expand Up @@ -3406,7 +3406,7 @@
{
"Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1"
},
"/67a3aa529ec1ed1816a4cf80820b64e8664fc647e3c49f45996ed25b332e7d07.json"
"/82bc7202ab93521f556ffe91199b3e2d55a9b03ae8334a40d6a5dd07ed7cbaeb.json"
]
]
},
Expand Down Expand Up @@ -3454,7 +3454,7 @@
"Properties": {
"LaunchTemplateData": {
"ImageId": {
"Ref": "SsmParameterValueawsserviceeksoptimizedami121amazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
"Ref": "SsmParameterValueawsserviceeksoptimizedami125amazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
},
"InstanceType": "t3.small",
"UserData": {
Expand Down Expand Up @@ -3715,9 +3715,9 @@
"Type": "AWS::SSM::Parameter::Value<String>",
"Default": "/aws/service/bottlerocket/aws-k8s-1.24/x86_64/latest/image_id"
},
"SsmParameterValueawsserviceeksoptimizedami121amazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter": {
"SsmParameterValueawsserviceeksoptimizedami125amazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter": {
"Type": "AWS::SSM::Parameter::Value<String>",
"Default": "/aws/service/eks/optimized-ami/1.21/amazon-linux-2/recommended/image_id"
"Default": "/aws/service/eks/optimized-ami/1.25/amazon-linux-2/recommended/image_id"
},
"BootstrapVersion": {
"Type": "AWS::SSM::Parameter::Value<String>",
Expand Down
Expand Up @@ -137,7 +137,7 @@
"S3Bucket": {
"Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1"
},
"S3Key": "c17e6c5822dd39738b3ba669bef4bb7c8fceaea76b51477bf94d6745d0c201c8.zip"
"S3Key": "92ea03f8b2e779503519f7781d06c03f95b46863db85f5c50a4e7debfd04be02.zip"
},
"Role": {
"Fn::GetAtt": [
Expand Down
Expand Up @@ -17,7 +17,7 @@
"validateOnSynth": false,
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-us-east-1",
"cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-us-east-1",
"stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1/6782a2a042fa36c961aad9bb00a06c22bfc03046118bf097208ad738af93cbe7.json",
"stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1/fa91c42247dc7e7ad1ecea9e8017595a5e51a6892c8585202a74b115bd521a16.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
Expand Down Expand Up @@ -945,10 +945,10 @@
"data": "SsmParameterValueawsservicebottlerocketawsk8s124x8664latestimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
}
],
"/aws-cdk-eks-cluster-test/SsmParameterValue:--aws--service--eks--optimized-ami--1.21--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter": [
"/aws-cdk-eks-cluster-test/SsmParameterValue:--aws--service--eks--optimized-ami--1.25--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter": [
{
"type": "aws:cdk:logicalId",
"data": "SsmParameterValueawsserviceeksoptimizedami121amazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
"data": "SsmParameterValueawsserviceeksoptimizedami125amazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
}
],
"/aws-cdk-eks-cluster-test/LaunchTemplate": [
Expand Down
Expand Up @@ -798,7 +798,7 @@
},
"constructInfo": {
"fqn": "@aws-cdk/lambda-layer-kubectl-v24.KubectlV24Layer",
"version": "2.0.108"
"version": "2.0.113"
}
},
"Cluster": {
Expand Down Expand Up @@ -1197,7 +1197,7 @@
},
"constructInfo": {
"fqn": "constructs.Construct",
"version": "10.1.259"
"version": "10.1.264"
}
},
"KubectlReadyBarrier": {
Expand Down Expand Up @@ -5557,7 +5557,7 @@
},
"constructInfo": {
"fqn": "constructs.Construct",
"version": "10.1.259"
"version": "10.1.264"
}
}
},
Expand Down Expand Up @@ -5632,7 +5632,7 @@
},
"constructInfo": {
"fqn": "constructs.Construct",
"version": "10.1.259"
"version": "10.1.264"
}
},
"@aws-cdk--aws-eks.KubectlProvider": {
Expand Down Expand Up @@ -5853,7 +5853,7 @@
"s3Bucket": {
"Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1"
},
"s3Key": "c17e6c5822dd39738b3ba669bef4bb7c8fceaea76b51477bf94d6745d0c201c8.zip"
"s3Key": "92ea03f8b2e779503519f7781d06c03f95b46863db85f5c50a4e7debfd04be02.zip"
},
"role": {
"Fn::GetAtt": [
Expand Down Expand Up @@ -6271,7 +6271,7 @@
{
"Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1"
},
"/67a3aa529ec1ed1816a4cf80820b64e8664fc647e3c49f45996ed25b332e7d07.json"
"/82bc7202ab93521f556ffe91199b3e2d55a9b03ae8334a40d6a5dd07ed7cbaeb.json"
]
]
},
Expand Down Expand Up @@ -6314,7 +6314,7 @@
},
"constructInfo": {
"fqn": "constructs.Construct",
"version": "10.1.259"
"version": "10.1.264"
}
},
"SsmParameterValue:--aws--service--eks--optimized-ami--1.24--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter": {
Expand Down Expand Up @@ -6365,17 +6365,17 @@
"version": "0.0.0"
}
},
"SsmParameterValue:--aws--service--eks--optimized-ami--1.21--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter": {
"id": "SsmParameterValue:--aws--service--eks--optimized-ami--1.21--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter",
"path": "aws-cdk-eks-cluster-test/SsmParameterValue:--aws--service--eks--optimized-ami--1.21--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter",
"SsmParameterValue:--aws--service--eks--optimized-ami--1.25--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter": {
"id": "SsmParameterValue:--aws--service--eks--optimized-ami--1.25--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter",
"path": "aws-cdk-eks-cluster-test/SsmParameterValue:--aws--service--eks--optimized-ami--1.25--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter",
"constructInfo": {
"fqn": "@aws-cdk/core.CfnParameter",
"version": "0.0.0"
}
},
"SsmParameterValue:--aws--service--eks--optimized-ami--1.21--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118": {
"id": "SsmParameterValue:--aws--service--eks--optimized-ami--1.21--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118",
"path": "aws-cdk-eks-cluster-test/SsmParameterValue:--aws--service--eks--optimized-ami--1.21--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118",
"SsmParameterValue:--aws--service--eks--optimized-ami--1.25--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118": {
"id": "SsmParameterValue:--aws--service--eks--optimized-ami--1.25--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118",
"path": "aws-cdk-eks-cluster-test/SsmParameterValue:--aws--service--eks--optimized-ami--1.25--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118",
"constructInfo": {
"fqn": "@aws-cdk/core.Resource",
"version": "0.0.0"
Expand All @@ -6389,7 +6389,7 @@
"aws:cdk:cloudformation:props": {
"launchTemplateData": {
"imageId": {
"Ref": "SsmParameterValueawsserviceeksoptimizedami121amazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
"Ref": "SsmParameterValueawsserviceeksoptimizedami125amazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
},
"instanceType": "t3.small",
"userData": {
Expand Down Expand Up @@ -6618,7 +6618,7 @@
"path": "aws-cdk-eks-cluster/DefaultTest/Default",
"constructInfo": {
"fqn": "constructs.Construct",
"version": "10.1.259"
"version": "10.1.264"
}
},
"DeployAssert": {
Expand Down Expand Up @@ -6664,7 +6664,7 @@
"path": "Tree",
"constructInfo": {
"fqn": "constructs.Construct",
"version": "10.1.259"
"version": "10.1.264"
}
}
},
Expand Down
2 changes: 1 addition & 1 deletion packages/@aws-cdk/aws-eks/test/integ.eks-cluster.ts
Expand Up @@ -228,7 +228,7 @@ class EksClusterStack extends Stack {
const lt = new ec2.CfnLaunchTemplate(this, 'LaunchTemplate', {
launchTemplateData: {
imageId: new eks.EksOptimizedImage({
kubernetesVersion: eks.KubernetesVersion.V1_21.version,
kubernetesVersion: eks.KubernetesVersion.V1_25.version,
}).getImage(this).imageId,
instanceType: new ec2.InstanceType('t3.small').toString(),
userData: Fn.base64(userData.render()),
Expand Down
2 changes: 1 addition & 1 deletion packages/@aws-cdk/aws-eks/test/util.ts
Expand Up @@ -2,7 +2,7 @@ import * as ec2 from '@aws-cdk/aws-ec2';
import { App, Stack } from '@aws-cdk/core';
import { Cluster, ClusterProps, KubernetesVersion } from '../lib';

const CLUSTER_VERSION = KubernetesVersion.V1_16;
const CLUSTER_VERSION = KubernetesVersion.V1_25;

export function testFixture() {
const { stack, app } = testFixtureNoVpc();
Expand Down

0 comments on commit 70fd3e9

Please sign in to comment.