Skip to content

Commit 3b974d3

Browse files
authored
feat: Add support for EKS Auto Mode and EKS Hybrid nodes (#3225)
* feat: Add support for EKS hybrid nodes * feat: Add support for EKS Auto Mode * chore: Update test directory names * chore: Clean up examples and tests * fix: Clean up and last minute changes for GA * chore: Formatting * chore: Bump min required version for new features * fix: Corrects from test/validation on existing clusters * feat: Add policy for custom tags on EKS Auto Mode, validate examples * chore: Expand on `CAM` acronym * chore: Update README to match examples
1 parent 6866b40 commit 3b974d3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+3896
-441
lines changed

README.md

Lines changed: 197 additions & 30 deletions
Large diffs are not rendered by default.

examples/eks-auto-mode/README.md

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
# EKS Auto Mode
2+
3+
## Usage
4+
5+
To provision the provided configurations you need to execute:
6+
7+
```bash
8+
terraform init
9+
terraform plan
10+
terraform apply --auto-approve
11+
```
12+
13+
Once the cluster has finished provisioning, you can use the `kubectl` command to interact with the cluster. For example, to deploy a sample deployment and see EKS Auto Mode in action, run:
14+
15+
```bash
16+
aws eks update-kubeconfig --name $(terraform output -raw cluster_name)
17+
kubectl apply -f deployment.yaml
18+
```
19+
20+
Note that this example may create resources which cost money. Run `terraform destroy` when you don't need these resources.
21+
22+
<!-- BEGIN_TF_DOCS -->
23+
## Requirements
24+
25+
| Name | Version |
26+
|------|---------|
27+
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.3.2 |
28+
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 5.79 |
29+
30+
## Providers
31+
32+
| Name | Version |
33+
|------|---------|
34+
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 5.79 |
35+
36+
## Modules
37+
38+
| Name | Source | Version |
39+
|------|--------|---------|
40+
| <a name="module_disabled_eks"></a> [disabled\_eks](#module\_disabled\_eks) | ../.. | n/a |
41+
| <a name="module_eks"></a> [eks](#module\_eks) | ../.. | n/a |
42+
| <a name="module_vpc"></a> [vpc](#module\_vpc) | terraform-aws-modules/vpc/aws | ~> 5.0 |
43+
44+
## Resources
45+
46+
| Name | Type |
47+
|------|------|
48+
| [aws_availability_zones.available](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/availability_zones) | data source |
49+
50+
## Inputs
51+
52+
No inputs.
53+
54+
## Outputs
55+
56+
| Name | Description |
57+
|------|-------------|
58+
| <a name="output_access_entries"></a> [access\_entries](#output\_access\_entries) | Map of access entries created and their attributes |
59+
| <a name="output_cloudwatch_log_group_arn"></a> [cloudwatch\_log\_group\_arn](#output\_cloudwatch\_log\_group\_arn) | Arn of cloudwatch log group created |
60+
| <a name="output_cloudwatch_log_group_name"></a> [cloudwatch\_log\_group\_name](#output\_cloudwatch\_log\_group\_name) | Name of cloudwatch log group created |
61+
| <a name="output_cluster_addons"></a> [cluster\_addons](#output\_cluster\_addons) | Map of attribute maps for all EKS cluster addons enabled |
62+
| <a name="output_cluster_arn"></a> [cluster\_arn](#output\_cluster\_arn) | The Amazon Resource Name (ARN) of the cluster |
63+
| <a name="output_cluster_certificate_authority_data"></a> [cluster\_certificate\_authority\_data](#output\_cluster\_certificate\_authority\_data) | Base64 encoded certificate data required to communicate with the cluster |
64+
| <a name="output_cluster_dualstack_oidc_issuer_url"></a> [cluster\_dualstack\_oidc\_issuer\_url](#output\_cluster\_dualstack\_oidc\_issuer\_url) | Dual-stack compatible URL on the EKS cluster for the OpenID Connect identity provider |
65+
| <a name="output_cluster_endpoint"></a> [cluster\_endpoint](#output\_cluster\_endpoint) | Endpoint for your Kubernetes API server |
66+
| <a name="output_cluster_iam_role_arn"></a> [cluster\_iam\_role\_arn](#output\_cluster\_iam\_role\_arn) | Cluster IAM role ARN |
67+
| <a name="output_cluster_iam_role_name"></a> [cluster\_iam\_role\_name](#output\_cluster\_iam\_role\_name) | Cluster IAM role name |
68+
| <a name="output_cluster_iam_role_unique_id"></a> [cluster\_iam\_role\_unique\_id](#output\_cluster\_iam\_role\_unique\_id) | Stable and unique string identifying the IAM role |
69+
| <a name="output_cluster_id"></a> [cluster\_id](#output\_cluster\_id) | The ID of the EKS cluster. Note: currently a value is returned only for local EKS clusters created on Outposts |
70+
| <a name="output_cluster_identity_providers"></a> [cluster\_identity\_providers](#output\_cluster\_identity\_providers) | Map of attribute maps for all EKS identity providers enabled |
71+
| <a name="output_cluster_ip_family"></a> [cluster\_ip\_family](#output\_cluster\_ip\_family) | The IP family used by the cluster (e.g. `ipv4` or `ipv6`) |
72+
| <a name="output_cluster_name"></a> [cluster\_name](#output\_cluster\_name) | The name of the EKS cluster |
73+
| <a name="output_cluster_oidc_issuer_url"></a> [cluster\_oidc\_issuer\_url](#output\_cluster\_oidc\_issuer\_url) | The URL on the EKS cluster for the OpenID Connect identity provider |
74+
| <a name="output_cluster_platform_version"></a> [cluster\_platform\_version](#output\_cluster\_platform\_version) | Platform version for the cluster |
75+
| <a name="output_cluster_primary_security_group_id"></a> [cluster\_primary\_security\_group\_id](#output\_cluster\_primary\_security\_group\_id) | Cluster security group that was created by Amazon EKS for the cluster. Managed node groups use this security group for control-plane-to-data-plane communication. Referred to as 'Cluster security group' in the EKS console |
76+
| <a name="output_cluster_security_group_arn"></a> [cluster\_security\_group\_arn](#output\_cluster\_security\_group\_arn) | Amazon Resource Name (ARN) of the cluster security group |
77+
| <a name="output_cluster_security_group_id"></a> [cluster\_security\_group\_id](#output\_cluster\_security\_group\_id) | ID of the cluster security group |
78+
| <a name="output_cluster_service_cidr"></a> [cluster\_service\_cidr](#output\_cluster\_service\_cidr) | The CIDR block where Kubernetes pod and service IP addresses are assigned from |
79+
| <a name="output_cluster_status"></a> [cluster\_status](#output\_cluster\_status) | Status of the EKS cluster. One of `CREATING`, `ACTIVE`, `DELETING`, `FAILED` |
80+
| <a name="output_cluster_tls_certificate_sha1_fingerprint"></a> [cluster\_tls\_certificate\_sha1\_fingerprint](#output\_cluster\_tls\_certificate\_sha1\_fingerprint) | The SHA1 fingerprint of the public key of the cluster's certificate |
81+
| <a name="output_eks_managed_node_groups"></a> [eks\_managed\_node\_groups](#output\_eks\_managed\_node\_groups) | Map of attribute maps for all EKS managed node groups created |
82+
| <a name="output_eks_managed_node_groups_autoscaling_group_names"></a> [eks\_managed\_node\_groups\_autoscaling\_group\_names](#output\_eks\_managed\_node\_groups\_autoscaling\_group\_names) | List of the autoscaling group names created by EKS managed node groups |
83+
| <a name="output_fargate_profiles"></a> [fargate\_profiles](#output\_fargate\_profiles) | Map of attribute maps for all EKS Fargate Profiles created |
84+
| <a name="output_kms_key_arn"></a> [kms\_key\_arn](#output\_kms\_key\_arn) | The Amazon Resource Name (ARN) of the key |
85+
| <a name="output_kms_key_id"></a> [kms\_key\_id](#output\_kms\_key\_id) | The globally unique identifier for the key |
86+
| <a name="output_kms_key_policy"></a> [kms\_key\_policy](#output\_kms\_key\_policy) | The IAM resource policy set on the key |
87+
| <a name="output_node_iam_role_arn"></a> [node\_iam\_role\_arn](#output\_node\_iam\_role\_arn) | EKS Auto node IAM role ARN |
88+
| <a name="output_node_iam_role_name"></a> [node\_iam\_role\_name](#output\_node\_iam\_role\_name) | EKS Auto node IAM role name |
89+
| <a name="output_node_iam_role_unique_id"></a> [node\_iam\_role\_unique\_id](#output\_node\_iam\_role\_unique\_id) | Stable and unique string identifying the IAM role |
90+
| <a name="output_node_security_group_arn"></a> [node\_security\_group\_arn](#output\_node\_security\_group\_arn) | Amazon Resource Name (ARN) of the node shared security group |
91+
| <a name="output_node_security_group_id"></a> [node\_security\_group\_id](#output\_node\_security\_group\_id) | ID of the node shared security group |
92+
| <a name="output_oidc_provider"></a> [oidc\_provider](#output\_oidc\_provider) | The OpenID Connect identity provider (issuer URL without leading `https://`) |
93+
| <a name="output_oidc_provider_arn"></a> [oidc\_provider\_arn](#output\_oidc\_provider\_arn) | The ARN of the OIDC Provider if `enable_irsa = true` |
94+
| <a name="output_self_managed_node_groups"></a> [self\_managed\_node\_groups](#output\_self\_managed\_node\_groups) | Map of attribute maps for all self managed node groups created |
95+
| <a name="output_self_managed_node_groups_autoscaling_group_names"></a> [self\_managed\_node\_groups\_autoscaling\_group\_names](#output\_self\_managed\_node\_groups\_autoscaling\_group\_names) | List of the autoscaling group names created by self-managed node groups |
96+
<!-- END_TF_DOCS -->
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
apiVersion: apps/v1
2+
kind: Deployment
3+
metadata:
4+
name: inflate
5+
spec:
6+
replicas: 3
7+
selector:
8+
matchLabels:
9+
app: inflate
10+
template:
11+
metadata:
12+
labels:
13+
app: inflate
14+
spec:
15+
terminationGracePeriodSeconds: 0
16+
containers:
17+
- name: inflate
18+
image: public.ecr.aws/eks-distro/kubernetes/pause:3.10
19+
resources:
20+
requests:
21+
cpu: 1

examples/eks-auto-mode/main.tf

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
provider "aws" {
2+
region = local.region
3+
}
4+
5+
data "aws_availability_zones" "available" {
6+
# Exclude local zones
7+
filter {
8+
name = "opt-in-status"
9+
values = ["opt-in-not-required"]
10+
}
11+
}
12+
13+
locals {
14+
name = "ex-${basename(path.cwd)}"
15+
cluster_version = "1.31"
16+
region = "us-west-2"
17+
18+
vpc_cidr = "10.0.0.0/16"
19+
azs = slice(data.aws_availability_zones.available.names, 0, 3)
20+
21+
tags = {
22+
Test = local.name
23+
GithubRepo = "terraform-aws-eks"
24+
GithubOrg = "terraform-aws-modules"
25+
}
26+
}
27+
28+
################################################################################
29+
# EKS Module
30+
################################################################################
31+
32+
module "eks" {
33+
source = "../.."
34+
35+
cluster_name = local.name
36+
cluster_version = local.cluster_version
37+
cluster_endpoint_public_access = true
38+
39+
enable_cluster_creator_admin_permissions = true
40+
41+
cluster_compute_config = {
42+
enabled = true
43+
node_pools = ["general-purpose"]
44+
}
45+
46+
vpc_id = module.vpc.vpc_id
47+
subnet_ids = module.vpc.private_subnets
48+
49+
tags = local.tags
50+
}
51+
52+
module "disabled_eks" {
53+
source = "../.."
54+
55+
create = false
56+
}
57+
58+
################################################################################
59+
# Supporting Resources
60+
################################################################################
61+
62+
module "vpc" {
63+
source = "terraform-aws-modules/vpc/aws"
64+
version = "~> 5.0"
65+
66+
name = local.name
67+
cidr = local.vpc_cidr
68+
69+
azs = local.azs
70+
private_subnets = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 4, k)]
71+
public_subnets = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k + 48)]
72+
intra_subnets = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k + 52)]
73+
74+
enable_nat_gateway = true
75+
single_nat_gateway = true
76+
77+
public_subnet_tags = {
78+
"kubernetes.io/role/elb" = 1
79+
}
80+
81+
private_subnet_tags = {
82+
"kubernetes.io/role/internal-elb" = 1
83+
}
84+
85+
tags = local.tags
86+
}

tests/fargate-profile/outputs.tf renamed to examples/eks-auto-mode/outputs.tf

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,12 +142,12 @@ output "cluster_tls_certificate_sha1_fingerprint" {
142142
################################################################################
143143

144144
output "cluster_iam_role_name" {
145-
description = "IAM role name of the EKS cluster"
145+
description = "Cluster IAM role name"
146146
value = module.eks.cluster_iam_role_name
147147
}
148148

149149
output "cluster_iam_role_arn" {
150-
description = "IAM role ARN of the EKS cluster"
150+
description = "Cluster IAM role ARN"
151151
value = module.eks.cluster_iam_role_arn
152152
}
153153

@@ -156,6 +156,25 @@ output "cluster_iam_role_unique_id" {
156156
value = module.eks.cluster_iam_role_unique_id
157157
}
158158

159+
################################################################################
160+
# EKS Auto Node IAM Role
161+
################################################################################
162+
163+
output "node_iam_role_name" {
164+
description = "EKS Auto node IAM role name"
165+
value = module.eks.node_iam_role_name
166+
}
167+
168+
output "node_iam_role_arn" {
169+
description = "EKS Auto node IAM role ARN"
170+
value = module.eks.node_iam_role_arn
171+
}
172+
173+
output "node_iam_role_unique_id" {
174+
description = "Stable and unique string identifying the IAM role"
175+
value = module.eks.node_iam_role_unique_id
176+
}
177+
159178
################################################################################
160179
# EKS Addons
161180
################################################################################

tests/fargate-profile/versions.tf renamed to examples/eks-auto-mode/versions.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ terraform {
44
required_providers {
55
aws = {
66
source = "hashicorp/aws"
7-
version = ">= 5.75"
7+
version = ">= 5.79"
88
}
99
}
1010
}

examples/eks-hybrid-nodes/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
*.pem
2+
*.sh

examples/eks-hybrid-nodes/README.md

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# EKS Hybrid Node IAM Role
2+
3+
## Usage
4+
5+
> [!NOTE]
6+
> The [Packer CLI](https://developer.hashicorp.com/packer/tutorials/docker-get-started/get-started-install-cli) is required to build a custom AMI for the Hybrid node used in the example.
7+
8+
To provision the provided configurations you need to execute:
9+
10+
```bash
11+
terraform init
12+
terraform apply -target=module.remote_node_vpc -target=local_file.key_pem --auto-approve
13+
cd ami && packer build -var 'ssh_keypair_name=hybrid-node' -var 'ssh_private_key_file=../key.pem' . && cd -
14+
terraform apply --auto-approve
15+
./join.sh
16+
```
17+
18+
Note that this example may create resources which cost money. Run `terraform destroy` when you don't need these resources.
19+
20+
<!-- BEGIN_TF_DOCS -->
21+
## Requirements
22+
23+
| Name | Version |
24+
|------|---------|
25+
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.3.2 |
26+
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 5.79 |
27+
| <a name="requirement_helm"></a> [helm](#requirement\_helm) | >= 2.16 |
28+
| <a name="requirement_http"></a> [http](#requirement\_http) | >= 3.4 |
29+
| <a name="requirement_local"></a> [local](#requirement\_local) | >= 2.5 |
30+
| <a name="requirement_tls"></a> [tls](#requirement\_tls) | >= 4.0 |
31+
32+
## Providers
33+
34+
| Name | Version |
35+
|------|---------|
36+
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 5.79 |
37+
| <a name="provider_aws.remote"></a> [aws.remote](#provider\_aws.remote) | >= 5.79 |
38+
| <a name="provider_helm"></a> [helm](#provider\_helm) | >= 2.16 |
39+
| <a name="provider_http"></a> [http](#provider\_http) | >= 3.4 |
40+
| <a name="provider_local"></a> [local](#provider\_local) | >= 2.5 |
41+
42+
## Modules
43+
44+
| Name | Source | Version |
45+
|------|--------|---------|
46+
| <a name="module_eks"></a> [eks](#module\_eks) | ../.. | n/a |
47+
| <a name="module_eks_hybrid_node_role"></a> [eks\_hybrid\_node\_role](#module\_eks\_hybrid\_node\_role) | ../../modules/hybrid-node-role | n/a |
48+
| <a name="module_key_pair"></a> [key\_pair](#module\_key\_pair) | terraform-aws-modules/key-pair/aws | ~> 2.0 |
49+
| <a name="module_remote_node_vpc"></a> [remote\_node\_vpc](#module\_remote\_node\_vpc) | terraform-aws-modules/vpc/aws | ~> 5.0 |
50+
| <a name="module_vpc"></a> [vpc](#module\_vpc) | terraform-aws-modules/vpc/aws | ~> 5.0 |
51+
52+
## Resources
53+
54+
| Name | Type |
55+
|------|------|
56+
| [aws_instance.hybrid_node](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance) | resource |
57+
| [aws_route.peer](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route) | resource |
58+
| [aws_route.remote_node_private](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route) | resource |
59+
| [aws_route.remote_node_public](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route) | resource |
60+
| [aws_security_group.remote_node](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group) | resource |
61+
| [aws_ssm_activation.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ssm_activation) | resource |
62+
| [aws_vpc_peering_connection.remote_node](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/vpc_peering_connection) | resource |
63+
| [aws_vpc_peering_connection_accepter.peer](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/vpc_peering_connection_accepter) | resource |
64+
| [aws_vpc_security_group_egress_rule.remote_node](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/vpc_security_group_egress_rule) | resource |
65+
| [aws_vpc_security_group_ingress_rule.remote_node](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/vpc_security_group_ingress_rule) | resource |
66+
| [helm_release.cilium](https://registry.terraform.io/providers/hashicorp/helm/latest/docs/resources/release) | resource |
67+
| [local_file.join](https://registry.terraform.io/providers/hashicorp/local/latest/docs/resources/file) | resource |
68+
| [local_file.key_pem](https://registry.terraform.io/providers/hashicorp/local/latest/docs/resources/file) | resource |
69+
| [local_file.key_pub_pem](https://registry.terraform.io/providers/hashicorp/local/latest/docs/resources/file) | resource |
70+
| [aws_ami.hybrid_node](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/ami) | data source |
71+
| [aws_availability_zones.available](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/availability_zones) | data source |
72+
| [aws_availability_zones.remote](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/availability_zones) | data source |
73+
| [http_http.icanhazip](https://registry.terraform.io/providers/hashicorp/http/latest/docs/data-sources/http) | data source |
74+
75+
## Inputs
76+
77+
No inputs.
78+
79+
## Outputs
80+
81+
No outputs.
82+
<!-- END_TF_DOCS -->

0 commit comments

Comments
 (0)