Skip to content

Commit 5d4c293

Browse files
authored
feat: switch from cluster-autoscaler to karpenter (#349)
feat: switch from cluster-autoscaler to karpenter
1 parent 79f8442 commit 5d4c293

22 files changed

+666
-729
lines changed

terraform/layer1-aws/.terraform.lock.hcl

+105
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

terraform/layer1-aws/aws-eks.tf

+16-80
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
locals {
2-
eks_worker_tags = {
3-
"k8s.io/cluster-autoscaler/enabled" = "true"
4-
"k8s.io/cluster-autoscaler/${local.name}" = "owned"
5-
}
62

73
eks_map_roles = [
84
{
@@ -13,13 +9,14 @@ locals {
139
]
1410
}
1511

16-
data "aws_ami" "eks_default_bottlerocket" {
12+
data "aws_ami" "eks_default_arm64" {
1713
most_recent = true
1814
owners = ["amazon"]
1915

2016
filter {
2117
name = "name"
22-
values = ["bottlerocket-aws-k8s-${var.eks_cluster_version}-x86_64-*"]
18+
values = ["amazon-eks-arm64-node-${var.eks_cluster_version}-v*"]
19+
2320
}
2421
}
2522

@@ -65,7 +62,10 @@ module "eks" {
6562
cluster_endpoint_private_access = var.eks_cluster_endpoint_private_access
6663
cluster_endpoint_public_access_cidrs = var.eks_cluster_endpoint_only_pritunl ? ["${module.pritunl[0].pritunl_endpoint}/32"] : ["0.0.0.0/0"]
6764

65+
node_security_group_tags = { "karpenter.sh/discovery" = local.name }
66+
6867
self_managed_node_group_defaults = {
68+
ami_id = data.aws_ami.eks_default_arm64.id
6969
block_device_mappings = {
7070
xvda = {
7171
device_name = "/dev/xvda"
@@ -78,7 +78,6 @@ module "eks" {
7878

7979
}
8080
}
81-
iam_role_additional_policies = var.eks_workers_additional_policies
8281
metadata_options = {
8382
http_endpoint = "enabled"
8483
http_tokens = "required"
@@ -88,81 +87,18 @@ module "eks" {
8887
iam_role_attach_cni_policy = false
8988
}
9089
self_managed_node_groups = {
91-
spot = {
92-
name = "${local.name}-spot"
93-
iam_role_name = "${local.name}-spot"
94-
desired_size = var.node_group_spot.desired_capacity
95-
max_size = var.node_group_spot.max_capacity
96-
min_size = var.node_group_spot.min_capacity
97-
subnet_ids = module.vpc.private_subnets
98-
99-
bootstrap_extra_args = "--kubelet-extra-args '--node-labels=eks.amazonaws.com/capacityType=SPOT --node-labels=nodegroup=spot'"
100-
capacity_rebalance = var.node_group_spot.capacity_rebalance
101-
use_mixed_instances_policy = var.node_group_spot.use_mixed_instances_policy
102-
mixed_instances_policy = var.node_group_spot.mixed_instances_policy
103-
104-
tags = local.eks_worker_tags
105-
},
106-
ondemand = {
107-
name = "${local.name}-ondemand"
108-
iam_role_name = "${local.name}-ondemand"
109-
desired_size = var.node_group_ondemand.desired_capacity
110-
max_size = var.node_group_ondemand.max_capacity
111-
min_size = var.node_group_ondemand.min_capacity
112-
instance_type = var.node_group_ondemand.instance_type
113-
subnet_ids = module.vpc.private_subnets
114-
115-
bootstrap_extra_args = "--kubelet-extra-args '--node-labels=eks.amazonaws.com/capacityType=ON_DEMAND --node-labels=nodegroup=ondemand'"
116-
capacity_rebalance = var.node_group_ondemand.capacity_rebalance
117-
use_mixed_instances_policy = var.node_group_ondemand.use_mixed_instances_policy
118-
mixed_instances_policy = var.node_group_ondemand.mixed_instances_policy
119-
120-
tags = local.eks_worker_tags
121-
},
122-
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-
subnet_ids = module.vpc.private_subnets
129-
130-
bootstrap_extra_args = "--kubelet-extra-args '--node-labels=eks.amazonaws.com/capacityType=SPOT --node-labels=nodegroup=ci --register-with-taints=nodegroup=ci:NoSchedule'"
131-
capacity_rebalance = var.node_group_ci.capacity_rebalance
132-
use_mixed_instances_policy = var.node_group_ci.use_mixed_instances_policy
133-
mixed_instances_policy = var.node_group_ci.mixed_instances_policy
134-
135-
tags = merge(local.eks_worker_tags, { "k8s.io/cluster-autoscaler/node-template/label/nodegroup" = "ci" })
136-
},
137-
bottlerocket = {
138-
name = "${local.name}-bottlerocket"
139-
iam_role_name = "${local.name}-bottlerocket"
140-
desired_size = var.node_group_br.desired_capacity
141-
max_size = var.node_group_br.max_capacity
142-
min_size = var.node_group_br.min_capacity
90+
default = {
91+
name = "${local.name}-default"
92+
iam_role_name = "${local.name}-default"
93+
desired_size = var.node_group_default.desired_capacity
94+
max_size = var.node_group_default.max_capacity
95+
min_size = var.node_group_default.min_capacity
14396
subnet_ids = module.vpc.private_subnets
14497

145-
platform = "bottlerocket"
146-
ami_id = data.aws_ami.eks_default_bottlerocket.id
147-
bootstrap_extra_args = <<-EOT
148-
[settings.host-containers.admin]
149-
enabled = false
150-
151-
[settings.host-containers.control]
152-
enabled = true
153-
154-
[settings.kubernetes.node-labels]
155-
"eks.amazonaws.com/capacityType" = "SPOT"
156-
"nodegroup" = "bottlerocket"
157-
158-
[settings.kubernetes.node-taints]
159-
"nodegroup" = "bottlerocket:NoSchedule"
160-
EOT
161-
capacity_rebalance = var.node_group_br.capacity_rebalance
162-
use_mixed_instances_policy = var.node_group_br.use_mixed_instances_policy
163-
mixed_instances_policy = var.node_group_br.mixed_instances_policy
164-
165-
tags = merge(local.eks_worker_tags, { "k8s.io/cluster-autoscaler/node-template/label/nodegroup" = "bottlerocket" })
98+
bootstrap_extra_args = "--kubelet-extra-args '--node-labels=nodegroup=default --register-with-taints=CriticalAddonsOnly=true:NoSchedule'"
99+
capacity_rebalance = var.node_group_default.capacity_rebalance
100+
use_mixed_instances_policy = var.node_group_default.use_mixed_instances_policy
101+
mixed_instances_policy = var.node_group_default.mixed_instances_policy
166102
}
167103
}
168104
fargate_profiles = {

terraform/layer1-aws/aws-vpc.tf

+8-5
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,12 @@ module "vpc" {
2828
database_subnets = local.database_subnets
2929
intra_subnets = local.intra_subnets
3030

31-
single_nat_gateway = var.single_nat_gateway
32-
enable_nat_gateway = true
33-
enable_vpn_gateway = false
34-
enable_dns_hostnames = true
35-
enable_dns_support = true
31+
single_nat_gateway = var.single_nat_gateway
32+
enable_nat_gateway = true
33+
enable_vpn_gateway = false
34+
enable_dns_hostnames = true
35+
enable_dns_support = true
36+
map_public_ip_on_launch = true
3637

3738
create_database_subnet_group = false
3839

@@ -47,6 +48,7 @@ module "vpc" {
4748
private_subnet_tags = {
4849
Name = "${local.name}-private"
4950
destination = "private"
51+
"karpenter.sh/discovery" = "private"
5052
"kubernetes.io/role/internal-elb" = "1"
5153
}
5254

@@ -58,6 +60,7 @@ module "vpc" {
5860
public_subnet_tags = {
5961
Name = "${local.name}-public"
6062
destination = "public"
63+
"karpenter.sh/discovery" = "public"
6164
"kubernetes.io/role/elb" = "1"
6265
}
6366

terraform/layer1-aws/demo.tfvars.example

-11
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,3 @@ single_nat_gateway = true
1919
# EKS
2020
##########
2121
eks_cluster_encryption_config_enable = true
22-
23-
node_group_ondemand = {
24-
instance_types = ["m5a.medium"]
25-
capacity_type = "ON_DEMAND"
26-
max_capacity = 5
27-
min_capacity = 1
28-
desired_capacity = 1
29-
force_update_version = false
30-
}
31-
32-
eks_write_kubeconfig = false

terraform/layer1-aws/outputs.tf

+8
Original file line numberDiff line numberDiff line change
@@ -108,3 +108,11 @@ output "ssl_certificate_arn" {
108108
description = "ARN of SSL certificate"
109109
value = local.ssl_certificate_arn
110110
}
111+
112+
output "node_group_default_iam_role_arn" {
113+
value = module.eks.self_managed_node_groups["default"].iam_role_arn
114+
}
115+
116+
output "node_group_default_iam_role_name" {
117+
value = module.eks.self_managed_node_groups["default"].iam_role_name
118+
}

0 commit comments

Comments
 (0)