Skip to content

Commit 3beda57

Browse files
authored
refactor: switch from aws-managed nodegroups to self-managed (#277)
1 parent ccd8e98 commit 3beda57

File tree

4 files changed

+199
-146
lines changed

4 files changed

+199
-146
lines changed

terraform/layer1-aws/README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,9 @@
3232
|------|------|
3333
| [aws_ebs_encryption_by_default.this](https://registry.terraform.io/providers/aws/4.10.0/docs/resources/ebs_encryption_by_default) | resource |
3434
| [aws_kms_key.eks](https://registry.terraform.io/providers/aws/4.10.0/docs/resources/kms_key) | resource |
35-
| [kubectl_manifest.this](https://registry.terraform.io/providers/gavinbunney/kubectl/1.14.0/docs/resources/manifest) | resource |
35+
| [kubectl_manifest.aws_auth_configmap](https://registry.terraform.io/providers/gavinbunney/kubectl/1.14.0/docs/resources/manifest) | resource |
3636
| [aws_acm_certificate.main](https://registry.terraform.io/providers/aws/4.10.0/docs/data-sources/acm_certificate) | data source |
37+
| [aws_ami.eks_default_bottlerocket](https://registry.terraform.io/providers/aws/4.10.0/docs/data-sources/ami) | data source |
3738
| [aws_availability_zones.available](https://registry.terraform.io/providers/aws/4.10.0/docs/data-sources/availability_zones) | data source |
3839
| [aws_caller_identity.current](https://registry.terraform.io/providers/aws/4.10.0/docs/data-sources/caller_identity) | data source |
3940
| [aws_eks_cluster.main](https://registry.terraform.io/providers/aws/4.10.0/docs/data-sources/eks_cluster) | data source |
@@ -65,10 +66,10 @@
6566
| <a name="input_eks_write_kubeconfig"></a> [eks\_write\_kubeconfig](#input\_eks\_write\_kubeconfig) | Flag for eks module to write kubeconfig | `bool` | `false` | no |
6667
| <a name="input_environment"></a> [environment](#input\_environment) | Env name in case workspace wasn't used | `string` | `"demo"` | no |
6768
| <a name="input_name"></a> [name](#input\_name) | Project name, required to create unique resource names | `any` | n/a | yes |
68-
| <a name="input_node_group_br"></a> [node\_group\_br](#input\_node\_group\_br) | Bottlerocket node group configuration | <pre>object({<br> instance_types = list(string)<br> capacity_type = string<br> max_capacity = number<br> min_capacity = number<br> desired_capacity = number<br> force_update_version = bool<br> })</pre> | <pre>{<br> "capacity_type": "SPOT",<br> "desired_capacity": 0,<br> "force_update_version": true,<br> "instance_types": [<br> "t3a.medium",<br> "t3.medium"<br> ],<br> "max_capacity": 5,<br> "min_capacity": 0<br>}</pre> | no |
69-
| <a name="input_node_group_ci"></a> [node\_group\_ci](#input\_node\_group\_ci) | CI node group configuration | <pre>object({<br> instance_types = list(string)<br> capacity_type = string<br> max_capacity = number<br> min_capacity = number<br> desired_capacity = number<br> force_update_version = bool<br> })</pre> | <pre>{<br> "capacity_type": "SPOT",<br> "desired_capacity": 0,<br> "force_update_version": true,<br> "instance_types": [<br> "t3a.medium",<br> "t3.medium"<br> ],<br> "max_capacity": 5,<br> "min_capacity": 0<br>}</pre> | no |
70-
| <a name="input_node_group_ondemand"></a> [node\_group\_ondemand](#input\_node\_group\_ondemand) | Default ondemand node group configuration | <pre>object({<br> instance_types = list(string)<br> capacity_type = string<br> max_capacity = number<br> min_capacity = number<br> desired_capacity = number<br> force_update_version = bool<br> })</pre> | <pre>{<br> "capacity_type": "ON_DEMAND",<br> "desired_capacity": 1,<br> "force_update_version": true,<br> "instance_types": [<br> "t3a.medium"<br> ],<br> "max_capacity": 5,<br> "min_capacity": 1<br>}</pre> | no |
71-
| <a name="input_node_group_spot"></a> [node\_group\_spot](#input\_node\_group\_spot) | Spot node group configuration | <pre>object({<br> instance_types = list(string)<br> capacity_type = string<br> max_capacity = number<br> min_capacity = number<br> desired_capacity = number<br> force_update_version = bool<br> })</pre> | <pre>{<br> "capacity_type": "SPOT",<br> "desired_capacity": 1,<br> "force_update_version": true,<br> "instance_types": [<br> "t3a.medium",<br> "t3.medium"<br> ],<br> "max_capacity": 5,<br> "min_capacity": 0<br>}</pre> | no |
69+
| <a name="input_node_group_br"></a> [node\_group\_br](#input\_node\_group\_br) | Bottlerocket node group configuration | <pre>object({<br> instance_type = string<br> max_capacity = number<br> min_capacity = number<br> desired_capacity = number<br> capacity_rebalance = bool<br> use_mixed_instances_policy = bool<br> mixed_instances_policy = any<br> })</pre> | <pre>{<br> "capacity_rebalance": true,<br> "desired_capacity": 0,<br> "instance_type": "t3.medium",<br> "max_capacity": 5,<br> "min_capacity": 0,<br> "mixed_instances_policy": {<br> "instances_distribution": {<br> "on_demand_base_capacity": 0,<br> "on_demand_percentage_above_base_capacity": 0<br> },<br> "override": [<br> {<br> "instance_type": "t3.medium"<br> },<br> {<br> "instance_type": "t3a.medium"<br> }<br> ]<br> },<br> "use_mixed_instances_policy": true<br>}</pre> | no |
70+
| <a name="input_node_group_ci"></a> [node\_group\_ci](#input\_node\_group\_ci) | CI node group configuration | <pre>object({<br> instance_type = string<br> max_capacity = number<br> min_capacity = number<br> desired_capacity = number<br> capacity_rebalance = bool<br> use_mixed_instances_policy = bool<br> mixed_instances_policy = any<br> })</pre> | <pre>{<br> "capacity_rebalance": false,<br> "desired_capacity": 0,<br> "instance_type": "t3.medium",<br> "max_capacity": 5,<br> "min_capacity": 0,<br> "mixed_instances_policy": {<br> "instances_distribution": {<br> "on_demand_base_capacity": 0,<br> "on_demand_percentage_above_base_capacity": 0<br> },<br> "override": [<br> {<br> "instance_type": "t3.medium"<br> },<br> {<br> "instance_type": "t3a.medium"<br> }<br> ]<br> },<br> "use_mixed_instances_policy": true<br>}</pre> | no |
71+
| <a name="input_node_group_ondemand"></a> [node\_group\_ondemand](#input\_node\_group\_ondemand) | Default ondemand node group configuration | <pre>object({<br> instance_type = string<br> max_capacity = number<br> min_capacity = number<br> desired_capacity = number<br> capacity_rebalance = bool<br> use_mixed_instances_policy = bool<br> mixed_instances_policy = any<br> })</pre> | <pre>{<br> "capacity_rebalance": false,<br> "desired_capacity": 1,<br> "instance_type": "t3a.medium",<br> "max_capacity": 5,<br> "min_capacity": 1,<br> "mixed_instances_policy": null,<br> "use_mixed_instances_policy": false<br>}</pre> | no |
72+
| <a name="input_node_group_spot"></a> [node\_group\_spot](#input\_node\_group\_spot) | Spot node group configuration | <pre>object({<br> instance_type = string<br> max_capacity = number<br> min_capacity = number<br> desired_capacity = number<br> capacity_rebalance = bool<br> use_mixed_instances_policy = bool<br> mixed_instances_policy = any<br> })</pre> | <pre>{<br> "capacity_rebalance": true,<br> "desired_capacity": 1,<br> "instance_type": "t3.medium",<br> "max_capacity": 5,<br> "min_capacity": 0,<br> "mixed_instances_policy": {<br> "instances_distribution": {<br> "on_demand_base_capacity": 0,<br> "on_demand_percentage_above_base_capacity": 0<br> },<br> "override": [<br> {<br> "instance_type": "t3.medium"<br> },<br> {<br> "instance_type": "t3a.medium"<br> }<br> ]<br> },<br> "use_mixed_instances_policy": true<br>}</pre> | no |
7273
| <a name="input_pritunl_vpn_access_cidr_blocks"></a> [pritunl\_vpn\_access\_cidr\_blocks](#input\_pritunl\_vpn\_access\_cidr\_blocks) | IP address that will have access to the web console | `string` | `"127.0.0.1/32"` | no |
7374
| <a name="input_pritunl_vpn_server_enable"></a> [pritunl\_vpn\_server\_enable](#input\_pritunl\_vpn\_server\_enable) | Indicates whether or not the Pritunl VPN server is deployed. | `bool` | `false` | no |
7475
| <a name="input_region"></a> [region](#input\_region) | Default infrastructure region | `string` | `"us-east-1"` | no |

terraform/layer1-aws/aws-eks-auth.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ locals {
1616
CONTENT
1717
}
1818

19-
resource "kubectl_manifest" "this" {
19+
resource "kubectl_manifest" "aws_auth_configmap" {
2020
yaml_body = local.aws_auth_configmap_yaml
2121
}

terraform/layer1-aws/aws-eks.tf

Lines changed: 106 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,20 @@
1+
locals {
2+
eks_worker_tags = {
3+
"k8s.io/cluster-autoscaler/enabled" = "true"
4+
"k8s.io/cluster-autoscaler/${local.name}" = "owned"
5+
}
6+
}
7+
8+
data "aws_ami" "eks_default_bottlerocket" {
9+
most_recent = true
10+
owners = ["amazon"]
11+
12+
filter {
13+
name = "name"
14+
values = ["bottlerocket-aws-k8s-${var.eks_cluster_version}-x86_64-*"]
15+
}
16+
}
17+
118
#tfsec:ignore:aws-vpc-no-public-egress-sgr tfsec:ignore:aws-eks-enable-control-plane-logging tfsec:ignore:aws-eks-encrypt-secrets tfsec:ignore:aws-eks-no-public-cluster-access tfsec:ignore:aws-eks-no-public-cluster-access-to-cidr
219
module "eks" {
320
source = "terraform-aws-modules/eks/aws"
@@ -72,108 +89,104 @@ module "eks" {
7289
}
7390
}
7491

75-
eks_managed_node_group_defaults = {
76-
ami_type = "AL2_x86_64"
77-
disk_size = 100
92+
self_managed_node_group_defaults = {
93+
block_device_mappings = {
94+
xvda = {
95+
device_name = "/dev/xvda"
96+
ebs = {
97+
delete_on_termination = true
98+
encrypted = false
99+
volume_size = 100
100+
volume_type = "gp3"
101+
}
102+
103+
}
104+
}
78105
iam_role_additional_policies = var.eks_workers_additional_policies
106+
metadata_options = {
107+
http_endpoint = "enabled"
108+
http_tokens = "required"
109+
http_put_response_hop_limit = 1
110+
instance_metadata_tags = "disabled"
111+
}
79112
}
80113

81-
eks_managed_node_groups = {
114+
self_managed_node_groups = {
82115
spot = {
83-
name = "${local.name}-spot"
84-
iam_role_name = "${local.name}-spot"
85-
desired_size = var.node_group_spot.desired_capacity
86-
max_size = var.node_group_spot.max_capacity
87-
min_size = var.node_group_spot.min_capacity
88-
instance_types = var.node_group_spot.instance_types
89-
capacity_type = var.node_group_spot.capacity_type
90-
subnet_ids = module.vpc.private_subnets
91-
92-
force_update_version = var.node_group_spot.force_update_version
93-
94-
labels = {
95-
Environment = local.env
96-
nodegroup = "spot"
97-
}
98-
tags = {
99-
Name = "${local.name}-spot"
100-
}
116+
name = "${local.name}-spot"
117+
iam_role_name = "${local.name}-spot"
118+
desired_size = var.node_group_spot.desired_capacity
119+
max_size = var.node_group_spot.max_capacity
120+
min_size = var.node_group_spot.min_capacity
121+
subnet_ids = module.vpc.private_subnets
122+
123+
bootstrap_extra_args = "--kubelet-extra-args '--node-labels=eks.amazonaws.com/capacityType=SPOT --node-labels=nodegroup=spot'"
124+
capacity_rebalance = var.node_group_spot.capacity_rebalance
125+
use_mixed_instances_policy = var.node_group_spot.use_mixed_instances_policy
126+
mixed_instances_policy = var.node_group_spot.mixed_instances_policy
127+
128+
tags = local.eks_worker_tags
101129
},
102130
ondemand = {
103-
name = "${local.name}-ondemand"
104-
iam_role_name = "${local.name}-ondemand"
105-
desired_size = var.node_group_ondemand.desired_capacity
106-
max_size = var.node_group_ondemand.max_capacity
107-
min_size = var.node_group_ondemand.min_capacity
108-
instance_types = var.node_group_ondemand.instance_types
109-
capacity_type = var.node_group_ondemand.capacity_type
110-
subnet_ids = module.vpc.private_subnets
111-
112-
force_update_version = var.node_group_ondemand.force_update_version
113-
114-
labels = {
115-
Environment = local.env
116-
nodegroup = "ondemand"
117-
}
118-
tags = {
119-
Name = "${local.name}-ondemand"
120-
}
131+
name = "${local.name}-ondemand"
132+
iam_role_name = "${local.name}-ondemand"
133+
desired_size = var.node_group_ondemand.desired_capacity
134+
max_size = var.node_group_ondemand.max_capacity
135+
min_size = var.node_group_ondemand.min_capacity
136+
instance_type = var.node_group_ondemand.instance_type
137+
subnet_ids = module.vpc.private_subnets
138+
139+
bootstrap_extra_args = "--kubelet-extra-args '--node-labels=eks.amazonaws.com/capacityType=ON_DEMAND --node-labels=nodegroup=ondemand'"
140+
capacity_rebalance = var.node_group_ondemand.capacity_rebalance
141+
use_mixed_instances_policy = var.node_group_ondemand.use_mixed_instances_policy
142+
mixed_instances_policy = var.node_group_ondemand.mixed_instances_policy
143+
144+
tags = local.eks_worker_tags
121145
},
122146
ci = {
123-
name = "${local.name}-ci"
124-
iam_role_name = "${local.name}-ci"
125-
desired_size = var.node_group_ci.desired_capacity
126-
max_size = var.node_group_ci.max_capacity
127-
min_size = var.node_group_ci.min_capacity
128-
instance_types = var.node_group_ci.instance_types
129-
capacity_type = var.node_group_ci.capacity_type
130-
subnet_ids = module.vpc.private_subnets
131-
132-
force_update_version = var.node_group_ci.force_update_version
133-
134-
labels = {
135-
Environment = local.env
136-
nodegroup = "ci"
137-
}
138-
tags = {
139-
Name = "${local.name}-ci"
140-
}
141-
taints = [
142-
{
143-
key = "nodegroup"
144-
value = "ci"
145-
effect = "NO_SCHEDULE"
146-
}
147-
]
147+
name = "${local.name}-ci"
148+
iam_role_name = "${local.name}-ci"
149+
desired_size = var.node_group_ci.desired_capacity
150+
max_size = var.node_group_ci.max_capacity
151+
min_size = var.node_group_ci.min_capacity
152+
subnet_ids = module.vpc.private_subnets
153+
154+
bootstrap_extra_args = "--kubelet-extra-args '--node-labels=eks.amazonaws.com/capacityType=SPOT --node-labels=nodegroup=ci --register-with-taints=nodegroup=ci:NoSchedule'"
155+
capacity_rebalance = var.node_group_ci.capacity_rebalance
156+
use_mixed_instances_policy = var.node_group_ci.use_mixed_instances_policy
157+
mixed_instances_policy = var.node_group_ci.mixed_instances_policy
158+
159+
tags = merge(local.eks_worker_tags, { "k8s.io/cluster-autoscaler/node-template/label/nodegroup" = "ci" })
148160
},
149161
bottlerocket = {
150-
name = "${local.name}-bottlerocket"
151-
iam_role_name = "${local.name}-bottlerocket"
152-
desired_size = var.node_group_br.desired_capacity
153-
max_size = var.node_group_br.max_capacity
154-
min_size = var.node_group_br.min_capacity
155-
instance_types = var.node_group_br.instance_types
156-
capacity_type = var.node_group_br.capacity_type
157-
subnet_ids = module.vpc.private_subnets
158-
159-
ami_type = "BOTTLEROCKET_x86_64"
160-
161-
force_update_version = var.node_group_br.force_update_version
162-
163-
labels = {
164-
Environment = local.env
165-
nodegroup = "bottlerocket"
166-
}
167-
taints = [
168-
{
169-
key = "nodegroup"
170-
value = "bottlerocket"
171-
effect = "NO_SCHEDULE"
172-
}
173-
]
174-
tags = {
175-
Name = "${local.name}-bottlerocket"
176-
}
162+
name = "${local.name}-bottlerocket"
163+
iam_role_name = "${local.name}-bottlerocket"
164+
desired_size = var.node_group_br.desired_capacity
165+
max_size = var.node_group_br.max_capacity
166+
min_size = var.node_group_br.min_capacity
167+
subnet_ids = module.vpc.private_subnets
168+
169+
platform = "bottlerocket"
170+
ami_id = data.aws_ami.eks_default_bottlerocket.id
171+
bootstrap_extra_args = <<-EOT
172+
[settings.host-containers.admin]
173+
enabled = false
174+
175+
[settings.host-containers.control]
176+
enabled = true
177+
178+
[settings.kubernetes.node-labels]
179+
"eks.amazonaws.com/capacityType" = "SPOT"
180+
"nodegroup" = "bottlerocket"
181+
182+
[settings.kubernetes.node-taints]
183+
"nodegroup" = "bottlerocket:NoSchedule"
184+
EOT
185+
capacity_rebalance = var.node_group_br.capacity_rebalance
186+
use_mixed_instances_policy = var.node_group_br.use_mixed_instances_policy
187+
mixed_instances_policy = var.node_group_br.mixed_instances_policy
188+
189+
tags = merge(local.eks_worker_tags, { "k8s.io/cluster-autoscaler/node-template/label/nodegroup" = "bottlerocket" })
177190
}
178191
}
179192

@@ -194,4 +207,5 @@ module "eks" {
194207
})
195208
}
196209
}
210+
197211
}

0 commit comments

Comments
 (0)