Skip to content

Commit 231e6dd

Browse files
authored
feat: Update Karpenter addon to support v0.32.1/v1beta1 (#285)
1 parent f039cda commit 231e6dd

File tree

6 files changed

+69
-39
lines changed

6 files changed

+69
-39
lines changed

.pre-commit-config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
repos:
22
- repo: https://github.com/pre-commit/pre-commit-hooks
3-
rev: v4.4.0
3+
rev: v4.5.0
44
hooks:
55
- id: trailing-whitespace
66
args: ['--markdown-linebreak-ext=md']
@@ -10,7 +10,7 @@ repos:
1010
- id: detect-aws-credentials
1111
args: ['--allow-missing-credentials']
1212
- repo: https://github.com/antonbabenko/pre-commit-terraform
13-
rev: v1.83.4
13+
rev: v1.83.5
1414
hooks:
1515
- id: terraform_fmt
1616
- id: terraform_docs

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ module "eks_blueprints_addons" {
219219
| <a name="input_helm_releases"></a> [helm\_releases](#input\_helm\_releases) | A map of Helm releases to create. This provides the ability to pass in an arbitrary map of Helm chart definitions to create | `any` | `{}` | no |
220220
| <a name="input_ingress_nginx"></a> [ingress\_nginx](#input\_ingress\_nginx) | Ingress Nginx add-on configurations | `any` | `{}` | no |
221221
| <a name="input_karpenter"></a> [karpenter](#input\_karpenter) | Karpenter add-on configuration values | `any` | `{}` | no |
222+
| <a name="input_karpenter_enable_instance_profile_creation"></a> [karpenter\_enable\_instance\_profile\_creation](#input\_karpenter\_enable\_instance\_profile\_creation) | Determines whether Karpenter will be allowed to create the IAM instance profile (v1beta1) or if Terraform will (v1alpha1) | `bool` | `true` | no |
222223
| <a name="input_karpenter_enable_spot_termination"></a> [karpenter\_enable\_spot\_termination](#input\_karpenter\_enable\_spot\_termination) | Determines whether to enable native node termination handling | `bool` | `true` | no |
223224
| <a name="input_karpenter_node"></a> [karpenter\_node](#input\_karpenter\_node) | Karpenter IAM role and IAM instance profile configuration values | `any` | `{}` | no |
224225
| <a name="input_karpenter_sqs"></a> [karpenter\_sqs](#input\_karpenter\_sqs) | Karpenter SQS queue for native node termination handling configuration values | `any` | `{}` | no |

main.tf

Lines changed: 54 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2730,6 +2730,34 @@ locals {
27302730
karpenter_node_iam_role_name = try(var.karpenter_node.iam_role_name, "karpenter-${var.cluster_name}")
27312731
karpenter_node_instance_profile_name = try(aws_iam_instance_profile.karpenter[0].name, var.karpenter_node.instance_profile_name, "")
27322732
karpenter_namespace = try(var.karpenter.namespace, "karpenter")
2733+
2734+
# Due to change in v0.32.0
2735+
# TODO - remove at next breaking change
2736+
karpenter_aws_scope = var.karpenter_enable_instance_profile_creation ? "" : "aws."
2737+
2738+
karpenter_set = [
2739+
{
2740+
name = "settings.${local.karpenter_aws_scope}clusterName"
2741+
value = local.cluster_name
2742+
},
2743+
{
2744+
name = "settings.${local.karpenter_aws_scope}clusterEndpoint"
2745+
value = local.cluster_endpoint
2746+
},
2747+
{
2748+
name = "settings.${local.karpenter_aws_scope}interruptionQueueName"
2749+
value = local.karpenter_enable_spot_termination ? module.karpenter_sqs.queue_name : null
2750+
},
2751+
# TODO - remove at next breaking change
2752+
{
2753+
name = "settings.${local.karpenter_aws_scope}defaultInstanceProfile"
2754+
value = var.karpenter_enable_instance_profile_creation ? null : local.karpenter_node_instance_profile_name
2755+
},
2756+
{
2757+
name = "serviceAccount.name"
2758+
value = local.karpenter_service_account_name
2759+
},
2760+
]
27332761
}
27342762

27352763
data "aws_iam_policy_document" "karpenter" {
@@ -2811,6 +2839,22 @@ data "aws_iam_policy_document" "karpenter" {
28112839
resources = [module.karpenter_sqs.queue_arn]
28122840
}
28132841
}
2842+
2843+
dynamic "statement" {
2844+
for_each = var.karpenter_enable_instance_profile_creation ? [1] : []
2845+
2846+
content {
2847+
actions = [
2848+
"iam:AddRoleToInstanceProfile",
2849+
"iam:CreateInstanceProfile",
2850+
"iam:DeleteInstanceProfile",
2851+
"iam:GetInstanceProfile",
2852+
"iam:RemoveRoleFromInstanceProfile",
2853+
"iam:TagInstanceProfile",
2854+
]
2855+
resources = ["*"]
2856+
}
2857+
}
28142858
}
28152859

28162860
module "karpenter_sqs" {
@@ -2916,7 +2960,7 @@ resource "aws_iam_role_policy_attachment" "additional" {
29162960
}
29172961

29182962
resource "aws_iam_instance_profile" "karpenter" {
2919-
count = var.enable_karpenter && try(var.karpenter_node.create_instance_profile, true) ? 1 : 0
2963+
count = var.enable_karpenter && try(var.karpenter_node.create_instance_profile, true) && !var.karpenter_enable_instance_profile_creation ? 1 : 0
29202964

29212965
name = try(var.karpenter_node.iam_role_use_name_prefix, true) ? null : local.karpenter_node_iam_role_name
29222966
name_prefix = try(var.karpenter_node.iam_role_use_name_prefix, true) ? "${local.karpenter_node_iam_role_name}-" : null
@@ -2941,7 +2985,7 @@ module "karpenter" {
29412985
namespace = local.karpenter_namespace
29422986
create_namespace = try(var.karpenter.create_namespace, true)
29432987
chart = try(var.karpenter.chart, "karpenter")
2944-
chart_version = try(var.karpenter.chart_version, "v0.30.0")
2988+
chart_version = try(var.karpenter.chart_version, "v0.32.1")
29452989
repository = try(var.karpenter.repository, "oci://public.ecr.aws/karpenter")
29462990
values = try(var.karpenter.values, [])
29472991

@@ -2973,28 +3017,7 @@ module "karpenter" {
29733017

29743018
postrender = try(var.karpenter.postrender, [])
29753019
set = concat(
2976-
[
2977-
{
2978-
name = "settings.aws.clusterName"
2979-
value = local.cluster_name
2980-
},
2981-
{
2982-
name = "settings.aws.clusterEndpoint"
2983-
value = local.cluster_endpoint
2984-
},
2985-
{
2986-
name = "settings.aws.defaultInstanceProfile"
2987-
value = local.karpenter_node_instance_profile_name
2988-
},
2989-
{
2990-
name = "settings.aws.interruptionQueueName"
2991-
value = local.karpenter_enable_spot_termination ? module.karpenter_sqs.queue_name : ""
2992-
},
2993-
{
2994-
name = "serviceAccount.name"
2995-
value = local.karpenter_service_account_name
2996-
},
2997-
],
3020+
[for s in local.karpenter_set : s if s.value != null],
29983021
try(var.karpenter.set, [])
29993022
)
30003023
set_sensitive = try(var.karpenter.set_sensitive, [])
@@ -3373,13 +3396,13 @@ module "velero" {
33733396
{
33743397
name = "initContainers"
33753398
value = <<-EOT
3376-
- name: velero-plugin-for-aws
3377-
image: velero/velero-plugin-for-aws:v1.7.1
3378-
imagePullPolicy: IfNotPresent
3379-
volumeMounts:
3380-
- mountPath: /target
3381-
name: plugins
3382-
EOT
3399+
- name: velero-plugin-for-aws
3400+
image: velero/velero-plugin-for-aws:v1.7.1
3401+
imagePullPolicy: IfNotPresent
3402+
volumeMounts:
3403+
- mountPath: /target
3404+
name: plugins
3405+
EOT
33833406
},
33843407
{
33853408
name = "serviceAccount.server.name"

tests/complete/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ Note that this example may create resources which will incur monetary charges on
4040
|------|--------|---------|
4141
| <a name="module_adot_irsa"></a> [adot\_irsa](#module\_adot\_irsa) | terraform-aws-modules/iam/aws//modules/iam-role-for-service-accounts-eks | ~> 5.20 |
4242
| <a name="module_ebs_csi_driver_irsa"></a> [ebs\_csi\_driver\_irsa](#module\_ebs\_csi\_driver\_irsa) | terraform-aws-modules/iam/aws//modules/iam-role-for-service-accounts-eks | ~> 5.20 |
43-
| <a name="module_eks"></a> [eks](#module\_eks) | terraform-aws-modules/eks/aws | ~> 19.13 |
43+
| <a name="module_eks"></a> [eks](#module\_eks) | terraform-aws-modules/eks/aws | ~> 19.17 |
4444
| <a name="module_eks_blueprints_addons"></a> [eks\_blueprints\_addons](#module\_eks\_blueprints\_addons) | ../../ | n/a |
4545
| <a name="module_velero_backup_s3_bucket"></a> [velero\_backup\_s3\_bucket](#module\_velero\_backup\_s3\_bucket) | terraform-aws-modules/s3-bucket/aws | ~> 3.0 |
4646
| <a name="module_vpc"></a> [vpc](#module\_vpc) | terraform-aws-modules/vpc/aws | ~> 5.0 |

tests/complete/main.tf

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,12 @@ locals {
5757
# Cluster
5858
################################################################################
5959

60-
#tfsec:ignore:aws-eks-enable-control-plane-logging
6160
module "eks" {
6261
source = "terraform-aws-modules/eks/aws"
63-
version = "~> 19.13"
62+
version = "~> 19.17"
6463

6564
cluster_name = local.name
66-
cluster_version = "1.26"
65+
cluster_version = "1.28"
6766
cluster_endpoint_public_access = true
6867

6968
vpc_id = module.vpc.vpc_id
@@ -192,7 +191,8 @@ module "eks_blueprints_addons" {
192191
enable_aws_node_termination_handler = true
193192
aws_node_termination_handler_asg_arns = [for asg in module.eks.self_managed_node_groups : asg.autoscaling_group_arn]
194193

195-
enable_karpenter = true
194+
enable_karpenter = true
195+
karpenter_enable_instance_profile_creation = true
196196
# ECR login required
197197
karpenter = {
198198
repository_username = data.aws_ecrpublic_authorization_token.token.user_name
@@ -238,7 +238,7 @@ module "eks_blueprints_addons" {
238238
namespace = "gpu-operator"
239239
create_namespace = true
240240
chart = "gpu-operator"
241-
chart_version = "v23.3.2"
241+
chart_version = "v23.9.0"
242242
repository = "https://nvidia.github.io/gpu-operator"
243243
values = [
244244
<<-EOT

variables.tf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,12 @@ variable "karpenter_enable_spot_termination" {
442442
default = true
443443
}
444444

445+
variable "karpenter_enable_instance_profile_creation" {
446+
description = "Determines whether Karpenter will be allowed to create the IAM instance profile (v1beta1) or if Terraform will (v1alpha1)"
447+
type = bool
448+
default = true
449+
}
450+
445451
variable "karpenter_sqs" {
446452
description = "Karpenter SQS queue for native node termination handling configuration values"
447453
type = any

0 commit comments

Comments
 (0)