mirror of
https://github.com/ysoftdevs/terraform-aws-eks.git
synced 2026-01-15 16:23:58 +01:00
feat: Add Karpenter v1beta1 compatibility (#2800)
* feat: Add Karpenter v1beta1 compatibility * fix: Update to make changes opt-in * fix: Update resource schemas to align with latest Karpenter version - validated and working as intended --------- Co-authored-by: Bryant Biggs <bryantbiggs@gmail.com>
This commit is contained in:
committed by
GitHub
parent
69eb4569b9
commit
aec2bab1d8
@@ -1,6 +1,6 @@
|
|||||||
repos:
|
repos:
|
||||||
- repo: https://github.com/antonbabenko/pre-commit-terraform
|
- repo: https://github.com/antonbabenko/pre-commit-terraform
|
||||||
rev: v1.83.4
|
rev: v1.83.5
|
||||||
hooks:
|
hooks:
|
||||||
- id: terraform_fmt
|
- id: terraform_fmt
|
||||||
- id: terraform_validate
|
- id: terraform_validate
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ Note that this example may create resources which cost money. Run `terraform des
|
|||||||
|------|--------|---------|
|
|------|--------|---------|
|
||||||
| <a name="module_eks"></a> [eks](#module\_eks) | ../.. | n/a |
|
| <a name="module_eks"></a> [eks](#module\_eks) | ../.. | n/a |
|
||||||
| <a name="module_karpenter"></a> [karpenter](#module\_karpenter) | ../../modules/karpenter | n/a |
|
| <a name="module_karpenter"></a> [karpenter](#module\_karpenter) | ../../modules/karpenter | n/a |
|
||||||
| <a name="module_vpc"></a> [vpc](#module\_vpc) | terraform-aws-modules/vpc/aws | ~> 4.0 |
|
| <a name="module_vpc"></a> [vpc](#module\_vpc) | terraform-aws-modules/vpc/aws | ~> 5.0 |
|
||||||
|
|
||||||
## Resources
|
## Resources
|
||||||
|
|
||||||
@@ -81,8 +81,8 @@ Note that this example may create resources which cost money. Run `terraform des
|
|||||||
|------|------|
|
|------|------|
|
||||||
| [helm_release.karpenter](https://registry.terraform.io/providers/hashicorp/helm/latest/docs/resources/release) | resource |
|
| [helm_release.karpenter](https://registry.terraform.io/providers/hashicorp/helm/latest/docs/resources/release) | resource |
|
||||||
| [kubectl_manifest.karpenter_example_deployment](https://registry.terraform.io/providers/gavinbunney/kubectl/latest/docs/resources/manifest) | resource |
|
| [kubectl_manifest.karpenter_example_deployment](https://registry.terraform.io/providers/gavinbunney/kubectl/latest/docs/resources/manifest) | resource |
|
||||||
| [kubectl_manifest.karpenter_node_template](https://registry.terraform.io/providers/gavinbunney/kubectl/latest/docs/resources/manifest) | resource |
|
| [kubectl_manifest.karpenter_node_class](https://registry.terraform.io/providers/gavinbunney/kubectl/latest/docs/resources/manifest) | resource |
|
||||||
| [kubectl_manifest.karpenter_provisioner](https://registry.terraform.io/providers/gavinbunney/kubectl/latest/docs/resources/manifest) | resource |
|
| [kubectl_manifest.karpenter_node_pool](https://registry.terraform.io/providers/gavinbunney/kubectl/latest/docs/resources/manifest) | resource |
|
||||||
| [aws_availability_zones.available](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/availability_zones) | data source |
|
| [aws_availability_zones.available](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/availability_zones) | data source |
|
||||||
| [aws_ecrpublic_authorization_token.token](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/ecrpublic_authorization_token) | data source |
|
| [aws_ecrpublic_authorization_token.token](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/ecrpublic_authorization_token) | data source |
|
||||||
|
|
||||||
|
|||||||
@@ -160,10 +160,9 @@ module "karpenter" {
|
|||||||
cluster_name = module.eks.cluster_name
|
cluster_name = module.eks.cluster_name
|
||||||
irsa_oidc_provider_arn = module.eks.oidc_provider_arn
|
irsa_oidc_provider_arn = module.eks.oidc_provider_arn
|
||||||
|
|
||||||
# Used to attach additional IAM policies to the Karpenter controller IRSA role
|
# In v0.32.0/v1beta1, Karpenter now creates the IAM instance profile
|
||||||
# policies = {
|
# so we disable the Terraform creation and add the necessary permissions for Karpenter IRSA
|
||||||
# "xxx" = "yyy"
|
enable_karpenter_instance_profile_creation = true
|
||||||
# }
|
|
||||||
|
|
||||||
# Used to attach additional IAM policies to the Karpenter node IAM role
|
# Used to attach additional IAM policies to the Karpenter node IAM role
|
||||||
iam_role_additional_policies = {
|
iam_role_additional_policies = {
|
||||||
@@ -182,51 +181,38 @@ resource "helm_release" "karpenter" {
|
|||||||
repository_username = data.aws_ecrpublic_authorization_token.token.user_name
|
repository_username = data.aws_ecrpublic_authorization_token.token.user_name
|
||||||
repository_password = data.aws_ecrpublic_authorization_token.token.password
|
repository_password = data.aws_ecrpublic_authorization_token.token.password
|
||||||
chart = "karpenter"
|
chart = "karpenter"
|
||||||
version = "v0.29.0"
|
version = "v0.32.1"
|
||||||
|
|
||||||
set {
|
values = [
|
||||||
name = "settings.aws.clusterName"
|
<<-EOT
|
||||||
value = module.eks.cluster_name
|
settings:
|
||||||
}
|
clusterName: ${module.eks.cluster_name}
|
||||||
|
clusterEndpoint: ${module.eks.cluster_endpoint}
|
||||||
set {
|
interruptionQueueName: ${module.karpenter.queue_name}
|
||||||
name = "settings.aws.clusterEndpoint"
|
serviceAccount:
|
||||||
value = module.eks.cluster_endpoint
|
annotations:
|
||||||
}
|
eks.amazonaws.com/role-arn: ${module.karpenter.irsa_arn}
|
||||||
|
EOT
|
||||||
set {
|
]
|
||||||
name = "serviceAccount.annotations.eks\\.amazonaws\\.com/role-arn"
|
|
||||||
value = module.karpenter.irsa_arn
|
|
||||||
}
|
|
||||||
|
|
||||||
set {
|
|
||||||
name = "settings.aws.defaultInstanceProfile"
|
|
||||||
value = module.karpenter.instance_profile_name
|
|
||||||
}
|
|
||||||
|
|
||||||
set {
|
|
||||||
name = "settings.aws.interruptionQueueName"
|
|
||||||
value = module.karpenter.queue_name
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "kubectl_manifest" "karpenter_provisioner" {
|
resource "kubectl_manifest" "karpenter_node_class" {
|
||||||
yaml_body = <<-YAML
|
yaml_body = <<-YAML
|
||||||
apiVersion: karpenter.sh/v1alpha5
|
apiVersion: karpenter.k8s.aws/v1beta1
|
||||||
kind: Provisioner
|
kind: EC2NodeClass
|
||||||
metadata:
|
metadata:
|
||||||
name: default
|
name: default
|
||||||
spec:
|
spec:
|
||||||
requirements:
|
amiFamily: AL2
|
||||||
- key: karpenter.sh/capacity-type
|
role: ${module.karpenter.role_name}
|
||||||
operator: In
|
subnetSelectorTerms:
|
||||||
values: ["spot"]
|
- tags:
|
||||||
limits:
|
karpenter.sh/discovery: ${module.eks.cluster_name}
|
||||||
resources:
|
securityGroupSelectorTerms:
|
||||||
cpu: 1000
|
- tags:
|
||||||
providerRef:
|
karpenter.sh/discovery: ${module.eks.cluster_name}
|
||||||
name: default
|
tags:
|
||||||
ttlSecondsAfterEmpty: 30
|
karpenter.sh/discovery: ${module.eks.cluster_name}
|
||||||
YAML
|
YAML
|
||||||
|
|
||||||
depends_on = [
|
depends_on = [
|
||||||
@@ -234,23 +220,39 @@ resource "kubectl_manifest" "karpenter_provisioner" {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "kubectl_manifest" "karpenter_node_template" {
|
resource "kubectl_manifest" "karpenter_node_pool" {
|
||||||
yaml_body = <<-YAML
|
yaml_body = <<-YAML
|
||||||
apiVersion: karpenter.k8s.aws/v1alpha1
|
apiVersion: karpenter.sh/v1beta1
|
||||||
kind: AWSNodeTemplate
|
kind: NodePool
|
||||||
metadata:
|
metadata:
|
||||||
name: default
|
name: default
|
||||||
spec:
|
spec:
|
||||||
subnetSelector:
|
template:
|
||||||
karpenter.sh/discovery: ${module.eks.cluster_name}
|
spec:
|
||||||
securityGroupSelector:
|
nodeClassRef:
|
||||||
karpenter.sh/discovery: ${module.eks.cluster_name}
|
name: default
|
||||||
tags:
|
requirements:
|
||||||
karpenter.sh/discovery: ${module.eks.cluster_name}
|
- key: "karpenter.k8s.aws/instance-category"
|
||||||
|
operator: In
|
||||||
|
values: ["c", "m", "r"]
|
||||||
|
- key: "karpenter.k8s.aws/instance-cpu"
|
||||||
|
operator: In
|
||||||
|
values: ["4", "8", "16", "32"]
|
||||||
|
- key: "karpenter.k8s.aws/instance-hypervisor"
|
||||||
|
operator: In
|
||||||
|
values: ["nitro"]
|
||||||
|
- key: "karpenter.k8s.aws/instance-generation"
|
||||||
|
operator: Gt
|
||||||
|
values: ["2"]
|
||||||
|
limits:
|
||||||
|
cpu: 1000
|
||||||
|
disruption:
|
||||||
|
consolidationPolicy: WhenEmpty
|
||||||
|
consolidateAfter: 30s
|
||||||
YAML
|
YAML
|
||||||
|
|
||||||
depends_on = [
|
depends_on = [
|
||||||
helm_release.karpenter
|
kubectl_manifest.karpenter_node_class
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -292,7 +294,7 @@ resource "kubectl_manifest" "karpenter_example_deployment" {
|
|||||||
|
|
||||||
module "vpc" {
|
module "vpc" {
|
||||||
source = "terraform-aws-modules/vpc/aws"
|
source = "terraform-aws-modules/vpc/aws"
|
||||||
version = "~> 4.0"
|
version = "~> 5.0"
|
||||||
|
|
||||||
name = local.name
|
name = local.name
|
||||||
cidr = local.vpc_cidr
|
cidr = local.vpc_cidr
|
||||||
|
|||||||
@@ -150,6 +150,7 @@ No modules.
|
|||||||
| <a name="input_create_iam_role"></a> [create\_iam\_role](#input\_create\_iam\_role) | Determines whether an IAM role is created or to use an existing IAM role | `bool` | `true` | no |
|
| <a name="input_create_iam_role"></a> [create\_iam\_role](#input\_create\_iam\_role) | Determines whether an IAM role is created or to use an existing IAM role | `bool` | `true` | no |
|
||||||
| <a name="input_create_instance_profile"></a> [create\_instance\_profile](#input\_create\_instance\_profile) | Whether to create an IAM instance profile | `bool` | `true` | no |
|
| <a name="input_create_instance_profile"></a> [create\_instance\_profile](#input\_create\_instance\_profile) | Whether to create an IAM instance profile | `bool` | `true` | no |
|
||||||
| <a name="input_create_irsa"></a> [create\_irsa](#input\_create\_irsa) | Determines whether an IAM role for service accounts is created | `bool` | `true` | no |
|
| <a name="input_create_irsa"></a> [create\_irsa](#input\_create\_irsa) | Determines whether an IAM role for service accounts is created | `bool` | `true` | no |
|
||||||
|
| <a name="input_enable_karpenter_instance_profile_creation"></a> [enable\_karpenter\_instance\_profile\_creation](#input\_enable\_karpenter\_instance\_profile\_creation) | Determines whether Karpenter will be allowed to create the IAM instance profile (v1beta1) or if Terraform will (v1alpha1) | `bool` | `false` | no |
|
||||||
| <a name="input_enable_spot_termination"></a> [enable\_spot\_termination](#input\_enable\_spot\_termination) | Determines whether to enable native spot termination handling | `bool` | `true` | no |
|
| <a name="input_enable_spot_termination"></a> [enable\_spot\_termination](#input\_enable\_spot\_termination) | Determines whether to enable native spot termination handling | `bool` | `true` | no |
|
||||||
| <a name="input_iam_role_additional_policies"></a> [iam\_role\_additional\_policies](#input\_iam\_role\_additional\_policies) | Additional policies to be added to the IAM role | `map(string)` | `{}` | no |
|
| <a name="input_iam_role_additional_policies"></a> [iam\_role\_additional\_policies](#input\_iam\_role\_additional\_policies) | Additional policies to be added to the IAM role | `map(string)` | `{}` | no |
|
||||||
| <a name="input_iam_role_arn"></a> [iam\_role\_arn](#input\_iam\_role\_arn) | Existing IAM role ARN for the IAM instance profile. Required if `create_iam_role` is set to `false` | `string` | `null` | no |
|
| <a name="input_iam_role_arn"></a> [iam\_role\_arn](#input\_iam\_role\_arn) | Existing IAM role ARN for the IAM instance profile. Required if `create_iam_role` is set to `false` | `string` | `null` | no |
|
||||||
|
|||||||
@@ -160,6 +160,24 @@ data "aws_iam_policy_document" "irsa" {
|
|||||||
resources = [aws_sqs_queue.this[0].arn]
|
resources = [aws_sqs_queue.this[0].arn]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# TODO - this will be replaced in v20.0 with the scoped policy provided by Karpenter
|
||||||
|
# https://github.com/aws/karpenter/blob/main/website/content/en/docs/upgrading/v1beta1-controller-policy.json
|
||||||
|
dynamic "statement" {
|
||||||
|
for_each = var.enable_karpenter_instance_profile_creation ? [1] : []
|
||||||
|
|
||||||
|
content {
|
||||||
|
actions = [
|
||||||
|
"iam:AddRoleToInstanceProfile",
|
||||||
|
"iam:CreateInstanceProfile",
|
||||||
|
"iam:DeleteInstanceProfile",
|
||||||
|
"iam:GetInstanceProfile",
|
||||||
|
"iam:RemoveRoleFromInstanceProfile",
|
||||||
|
"iam:TagInstanceProfile",
|
||||||
|
]
|
||||||
|
resources = ["*"]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "aws_iam_policy" "irsa" {
|
resource "aws_iam_policy" "irsa" {
|
||||||
@@ -368,7 +386,7 @@ locals {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resource "aws_iam_instance_profile" "this" {
|
resource "aws_iam_instance_profile" "this" {
|
||||||
count = var.create && var.create_instance_profile ? 1 : 0
|
count = var.create && var.create_instance_profile && !var.enable_karpenter_instance_profile_creation ? 1 : 0
|
||||||
|
|
||||||
name = var.iam_role_use_name_prefix ? null : local.iam_role_name
|
name = var.iam_role_use_name_prefix ? null : local.iam_role_name
|
||||||
name_prefix = var.iam_role_use_name_prefix ? "${local.iam_role_name}-" : null
|
name_prefix = var.iam_role_use_name_prefix ? "${local.iam_role_name}-" : null
|
||||||
|
|||||||
@@ -123,6 +123,12 @@ variable "irsa_assume_role_condition_test" {
|
|||||||
default = "StringEquals"
|
default = "StringEquals"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
variable "enable_karpenter_instance_profile_creation" {
|
||||||
|
description = "Determines whether Karpenter will be allowed to create the IAM instance profile (v1beta1) or if Terraform will (v1alpha1)"
|
||||||
|
type = bool
|
||||||
|
default = false
|
||||||
|
}
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Node Termination Queue
|
# Node Termination Queue
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|||||||
Reference in New Issue
Block a user