Skip to content

Commit 9f7d622

Browse files
authored
Added Bottlerocket AMI support and bug fixes (#55)
New releases and fixes:- - Added bottlerocket AMI support for both arm and amd based architectures. - Added an option to pass launch template name while creating custom managed AWS node group. - Added tags on AWS resources to track cost.
1 parent ceb3295 commit 9f7d622

File tree

8 files changed

+140
-36
lines changed

8 files changed

+140
-36
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,12 @@ module "managed_node_group_addons" {
7878
managed_ng_pod_capacity = 90
7979
managed_ng_monitoring_enabled = true
8080
eks_nodes_keypair_name = "key-pair-name"
81+
launch_template_name = local.launch_template_name
82+
enable_bottlerocket_ami = local.enable_bottlerocket_ami
83+
bottlerocket_node_config = {
84+
bottlerocket_eks_node_admin_container_enabled = false
85+
bottlerocket_eks_enable_control_container = true
86+
}
8187
k8s_labels = {
8288
"Addons-Services" = "true"
8389
}

examples/complete-ipv6/main.tf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ locals {
66
Owner = "Organization_name"
77
Expires = "Never"
88
Department = "Engineering"
9+
Product = ""
10+
Environment = local.environment
911
}
1012
kms_user = null
1113
vpc_cidr = "10.10.0.0/16"

examples/complete/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ This directory contains a complete example that demonstrates the usage of the Te
2525
| <a name="module_kms"></a> [kms](#module\_kms) | terraform-aws-modules/kms/aws | 3.1.0 |
2626
| <a name="module_key_pair_vpn"></a> [key\_pair\_vpn](#module\_key\_pair\_vpn) | squareops/keypair/aws | 1.0.2 |
2727
| <a name="module_key_pair_eks"></a> [key\_pair\_eks](#module\_key\_pair\_eks) | squareops/keypair/aws | 1.0.2 |
28-
| <a name="module_vpc"></a> [vpc](#module\_vpc) | squareops/vpc/aws | 3.3.5 |
29-
| <a name="module_eks"></a> [eks](#module\_eks) | squareops/eks/aws | 4.0.9 |
30-
| <a name="module_managed_node_group_addons"></a> [managed\_node\_group\_addons](#module\_managed\_node\_group\_addons) | squareops/eks/aws//modules/managed-nodegroup | 4.0.9 |
28+
| <a name="module_vpc"></a> [vpc](#module\_vpc) | squareops/vpc/aws | 3.4.1 |
29+
| <a name="module_eks"></a> [eks](#module\_eks) | squareops/eks/aws | 5.1.1 |
30+
| <a name="module_managed_node_group_addons"></a> [managed\_node\_group\_addons](#module\_managed\_node\_group\_addons) | squareops/eks/aws//modules/managed-nodegroup | 5.1.1 |
3131
| <a name="module_fargate_profle"></a> [fargate\_profle](#module\_fargate\_profle) | squareops/eks/aws//modules/fargate-profile | n/a |
3232

3333
## Resources

examples/complete/main.tf

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ locals {
2121
cluster_version = "1.30"
2222
cluster_log_types = ["api", "audit", "authenticator", "controllerManager", "scheduler"]
2323
cluster_log_retention_in_days = 30
24-
managed_ng_capacity_type = "SPOT" # Can use "On_DEMAND" also
24+
managed_ng_capacity_type = "SPOT" # Choose the capacity type ("SPOT" or "ON_DEMAND")
2525
cluster_endpoint_private_access = false
2626
cluster_endpoint_public_access = true
2727
cluster_endpoint_public_access_cidrs = ["0.0.0.0/0"]
@@ -33,13 +33,17 @@ locals {
3333
vpc_private_subnets_counts = 2
3434
vpc_database_subnets_counts = 2
3535
vpc_intra_subnets_counts = 2
36+
launch_template_name = "launch-template-name"
3637
additional_aws_tags = {
37-
Owner = "Organization_name"
38-
Expires = "Never"
39-
Department = "Engineering"
38+
Owner = "Organization_name"
39+
Expires = "Never"
40+
Department = "Engineering"
41+
Product = ""
42+
Environment = local.environment
4043
}
41-
aws_managed_node_group_arch = "" #Enter your linux arch (Example:- arm64 or amd64)
44+
aws_managed_node_group_arch = "amd64" #Enter your linux arch (Example:- arm64 or amd64)
4245
current_identity = data.aws_caller_identity.current.arn
46+
enable_bottlerocket_ami = false
4347
}
4448

4549
data "aws_caller_identity" "current" {}
@@ -109,7 +113,7 @@ module "key_pair_eks" {
109113

110114
module "vpc" {
111115
source = "squareops/vpc/aws"
112-
version = "3.3.5"
116+
version = "3.4.1"
113117
name = local.name
114118
region = local.region
115119
vpc_cidr = local.vpc_cidr
@@ -135,7 +139,7 @@ module "vpc" {
135139

136140
module "eks" {
137141
source = "squareops/eks/aws"
138-
version = "4.0.9"
142+
version = "5.1.1"
139143
access_entry_enabled = true
140144
access_entries = {
141145
"example" = {
@@ -177,11 +181,12 @@ module "eks" {
177181
cidr_blocks = ["10.10.0.0/16"]
178182
}
179183
}
184+
tags = local.additional_aws_tags
180185
}
181186

182187
module "managed_node_group_addons" {
183188
source = "squareops/eks/aws//modules/managed-nodegroup"
184-
version = "4.0.9"
189+
version = "5.1.1"
185190
depends_on = [module.vpc, module.eks]
186191
managed_ng_name = "Infra"
187192
managed_ng_min_size = 2
@@ -203,6 +208,12 @@ module "managed_node_group_addons" {
203208
eks_nodes_keypair_name = module.key_pair_eks.key_pair_name
204209
managed_ng_pod_capacity = 90
205210
managed_ng_monitoring_enabled = true
211+
launch_template_name = local.launch_template_name
212+
enable_bottlerocket_ami = local.enable_bottlerocket_ami
213+
bottlerocket_node_config = {
214+
bottlerocket_eks_node_admin_container_enabled = false
215+
bottlerocket_eks_enable_control_container = true
216+
}
206217
k8s_labels = {
207218
"Addons-Services" = "true"
208219
}

modules/managed-nodegroup/README.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ No modules.
3333
|------|------|
3434
| [aws_eks_node_group.managed_ng](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/eks_node_group) | resource |
3535
| [aws_launch_template.eks_template](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/launch_template) | resource |
36-
| [aws_ami.launch_template_ami_amd64](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/ami) | data source |
37-
| [aws_ami.launch_template_ami_arm64](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/ami) | data source |
36+
| [aws_ami.launch_template_ami](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/ami) | data source |
3837
| [aws_eks_cluster.eks](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/eks_cluster) | data source |
3938
| [template_file.launch_template_userdata](https://registry.terraform.io/providers/hashicorp/template/latest/docs/data-sources/file) | data source |
39+
| [template_file.launch_template_userdata_bottlerocket](https://registry.terraform.io/providers/hashicorp/template/latest/docs/data-sources/file) | data source |
4040

4141
## Inputs
4242

@@ -71,6 +71,9 @@ No modules.
7171
| <a name="input_managed_ng_volume_delete_on_termination"></a> [managed\_ng\_volume\_delete\_on\_termination](#input\_managed\_ng\_volume\_delete\_on\_termination) | Set to true if delete the volumes when eks cluster is terminated. | `bool` | `true` | no |
7272
| <a name="input_managed_ng_pod_capacity"></a> [managed\_ng\_pod\_capacity](#input\_managed\_ng\_pod\_capacity) | Maximum number of pods you want to schedule on one node. This value should not exceed 110. | `number` | `70` | no |
7373
| <a name="input_aws_managed_node_group_arch"></a> [aws\_managed\_node\_group\_arch](#input\_aws\_managed\_node\_group\_arch) | Enter your linux architecture. | `string` | `"amd64"` | no |
74+
| <a name="input_launch_template_name"></a> [launch\_template\_name](#input\_launch\_template\_name) | The name of the launch template. | `string` | `""` | no |
75+
| <a name="input_enable_bottlerocket_ami"></a> [enable\_bottlerocket\_ami](#input\_enable\_bottlerocket\_ami) | Set to true to enable the use of Bottlerocket AMIs for instances. | `bool` | `false` | no |
76+
| <a name="input_bottlerocket_node_config"></a> [bottlerocket\_node\_config](#input\_bottlerocket\_node\_config) | Bottlerocket Node configurations for EKS. | `map(any)` | <pre>{<br> "bottlerocket_eks_enable_control_container": true,<br> "bottlerocket_eks_node_admin_container_enabled": false<br>}</pre> | no |
7477

7578
## Outputs
7679

modules/managed-nodegroup/main.tf

Lines changed: 53 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,25 @@
1-
data "aws_eks_cluster" "eks" {
2-
name = var.eks_cluster_name
1+
locals {
2+
launch_template_name = format("%s-%s-%s", var.eks_cluster_name, var.managed_ng_name, "lt")
3+
ami_owner = var.enable_bottlerocket_ami ? "amazon" : "602401143452"
4+
ami_base_name = var.enable_bottlerocket_ami ? "bottlerocket-aws-k8s" : (var.aws_managed_node_group_arch == "arm64" ? "amazon-eks-arm64-node" : "amazon-eks-node")
5+
ami_arch = var.enable_bottlerocket_ami ? (var.aws_managed_node_group_arch == "arm64" ? "aarch64*" : "x86_64*") : "v*"
36
}
47

5-
data "aws_ami" "launch_template_ami_amd64" {
6-
owners = ["602401143452"]
7-
most_recent = true
8-
filter {
9-
name = "name"
10-
values = [format("%s-%s-%s", "amazon-eks-node", data.aws_eks_cluster.eks.version, "v*")]
11-
}
8+
data "aws_eks_cluster" "eks" {
9+
name = var.eks_cluster_name
1210
}
1311

14-
data "aws_ami" "launch_template_ami_arm64" {
15-
owners = ["602401143452"]
12+
data "aws_ami" "launch_template_ami" {
13+
owners = [local.ami_owner]
1614
most_recent = true
1715
filter {
1816
name = "name"
19-
values = [format("%s-%s-%s", "amazon-eks-arm64-node", data.aws_eks_cluster.eks.version, "v*")]
17+
values = [format("%s-%s-%s", local.ami_base_name, data.aws_eks_cluster.eks.version, local.ami_arch)]
2018
}
2119
}
2220

2321
data "template_file" "launch_template_userdata" {
22+
count = var.enable_bottlerocket_ami ? 0 : 1
2423
template = file("${path.module}/templates/${data.aws_eks_cluster.eks.kubernetes_network_config[0].ip_family == "ipv4" ? "custom-bootstrap-script.sh.tpl" : "custom-bootstrap-scriptipv6.sh.tpl"}")
2524

2625
vars = {
@@ -34,11 +33,29 @@ data "template_file" "launch_template_userdata" {
3433
}
3534
}
3635

36+
data "template_file" "launch_template_userdata_bottlerocket" {
37+
count = var.enable_bottlerocket_ami ? 1 : 0
38+
39+
template = file("${path.module}/templates/bootstrap-bottlerocket.toml.tpl")
40+
41+
vars = {
42+
cluster_name = var.eks_cluster_name
43+
cluster_endpoint = data.aws_eks_cluster.eks.endpoint
44+
cluster_ca_data = data.aws_eks_cluster.eks.certificate_authority[0].data
45+
eventRecordQPS = var.eventRecordQPS
46+
image_low_threshold_percent = var.image_low_threshold_percent
47+
image_high_threshold_percent = var.image_high_threshold_percent
48+
managed_ng_pod_capacity = var.managed_ng_pod_capacity
49+
admin_container_enabled = var.bottlerocket_node_config.bottlerocket_eks_node_admin_container_enabled
50+
enable_control_container = var.bottlerocket_node_config.bottlerocket_eks_enable_control_container
51+
}
52+
}
53+
3754
resource "aws_launch_template" "eks_template" {
38-
name = format("%s-%s-%s", var.environment, var.managed_ng_name, "launch-template")
55+
name = length(var.launch_template_name) > 0 ? var.launch_template_name : local.launch_template_name
3956
key_name = var.eks_nodes_keypair_name
40-
image_id = var.aws_managed_node_group_arch == "arm64" ? data.aws_ami.launch_template_ami_arm64.image_id : data.aws_ami.launch_template_ami_amd64.image_id
41-
user_data = base64encode(data.template_file.launch_template_userdata.rendered)
57+
image_id = data.aws_ami.launch_template_ami.image_id
58+
user_data = var.enable_bottlerocket_ami ? base64encode(data.template_file.launch_template_userdata_bottlerocket[0].rendered) : base64encode(data.template_file.launch_template_userdata[0].rendered)
4259
update_default_version = true
4360
block_device_mappings {
4461
device_name = "/dev/xvda"
@@ -62,10 +79,21 @@ resource "aws_launch_template" "eks_template" {
6279

6380
tag_specifications {
6481
resource_type = "instance"
65-
tags = {
66-
Name = format("%s-%s-%s", var.environment, var.managed_ng_name, "eks-node")
67-
Environment = var.environment
68-
}
82+
tags = merge(
83+
{
84+
Name = format("%s-%s-%s", var.environment, var.managed_ng_name, "eks-node")
85+
},
86+
var.tags
87+
)
88+
}
89+
tag_specifications {
90+
resource_type = "volume"
91+
tags = merge(
92+
{
93+
Name = format("%s-%s-%s", var.environment, var.managed_ng_name, "eks-volume")
94+
},
95+
var.tags
96+
)
6997
}
7098

7199
lifecycle {
@@ -94,8 +122,10 @@ resource "aws_eks_node_group" "managed_ng" {
94122
update_config {
95123
max_unavailable_percentage = 50
96124
}
97-
tags = {
98-
Name = format("%s-%s-%s", var.environment, var.managed_ng_name, "ng")
99-
Environment = var.environment
100-
}
125+
tags = merge(
126+
{
127+
Name = format("%s-%s-%s", var.environment, var.managed_ng_name, "ng")
128+
},
129+
var.tags
130+
)
101131
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
[settings.kubernetes]
2+
cluster-name = "${cluster_name}"
3+
api-server = "${cluster_endpoint}"
4+
cluster-certificate = "${cluster_ca_data}"
5+
max-pods = ${managed_ng_pod_capacity}
6+
7+
image-gc-high-threshold-percent = ${image_high_threshold_percent}
8+
image-gc-low-threshold-percent = ${image_low_threshold_percent}
9+
event-qps = ${eventRecordQPS}
10+
11+
12+
# Enable kernel lockdown in "integrity" mode.
13+
# This prevents modifications to the running kernel, even by privileged users.
14+
[settings.kernel]
15+
lockdown = "integrity"
16+
17+
18+
[settings.host-containers.admin]
19+
enabled = ${admin_container_enabled}
20+
21+
22+
# The control host container provides out-of-band access via SSM.
23+
# It is enabled by default, and can be disabled if you do not expect to use SSM.
24+
# This could leave you with no way to access the API and change settings on an existing node!
25+
[settings.host-containers.control]
26+
enabled = ${enable_control_container}

modules/managed-nodegroup/variables.tf

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,3 +172,29 @@ variable "aws_managed_node_group_arch" {
172172
type = string
173173
default = "amd64"
174174
}
175+
176+
variable "launch_template_name" {
177+
description = "The name of the launch template."
178+
type = string
179+
default = ""
180+
181+
validation {
182+
condition = length(var.launch_template_name) <= 60
183+
error_message = "The launch_template_name must be 60 characters or fewer. Please provide a shorter name."
184+
}
185+
}
186+
187+
variable "enable_bottlerocket_ami" {
188+
description = "Set to true to enable the use of Bottlerocket AMIs for instances."
189+
default = false
190+
type = bool
191+
}
192+
193+
variable "bottlerocket_node_config" {
194+
type = map(any) # Specify the type as a map for clarity
195+
description = "Bottlerocket Node configurations for EKS."
196+
default = {
197+
bottlerocket_eks_node_admin_container_enabled = false ## For SSH Access
198+
bottlerocket_eks_enable_control_container = true ## For SSM Accesws
199+
}
200+
}

0 commit comments

Comments
 (0)