diff --git a/README.md b/README.md index e38ebc1..e40241c 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,8 @@ The module deploys Karpenter needed AWS resources, namely in IAM. It copies the | Name | Version | |------|---------| -| [aws](#provider\_aws) | 5.100.0 | -| [aws.eecr](#provider\_aws.eecr) | 5.100.0 | +| [aws](#provider\_aws) | 6.15.0 | +| [aws.eecr](#provider\_aws.eecr) | 6.15.0 | | [helm](#provider\_helm) | 3.0.2 | | [null](#provider\_null) | 3.2.4 | @@ -36,12 +36,13 @@ The module deploys Karpenter needed AWS resources, namely in IAM. It copies the | Name | Source | Version | |------|--------|---------| | [images](#module\_images) | git::https://github.e.it.census.gov/terraform-modules/aws-ecr-copy-images.git | tf-upgrade | -| [karpenter\_resources](#module\_karpenter\_resources) | git::https://github.e.it.census.gov/SCT-Engineering/terraform-aws-eks.git//modules/karpenter | v20.37.2 | +| [karpenter\_resources](#module\_karpenter\_resources) | git::https://github.e.it.census.gov/SCT-Engineering/terraform-aws-eks.git//modules/karpenter | v21.11.0 | ## Resources | Name | Type | |------|------| +| [aws_iam_service_linked_role.spot](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_service_linked_role) | resource | | [helm_release.karpenter](https://registry.terraform.io/providers/hashicorp/helm/latest/docs/resources/release) | resource | | [helm_release.nodepool_resources](https://registry.terraform.io/providers/hashicorp/helm/latest/docs/resources/release) | resource | | [null_resource.git_version](https://registry.terraform.io/providers/hashicorp/null/latest/docs/resources/resource) | resource | @@ -58,6 +59,7 @@ The module deploys Karpenter needed AWS resources, namely in IAM. It copies the | [account\_id](#input\_account\_id) | aws account number | `string` | `""` | no | | [cluster\_endpoint](#input\_cluster\_endpoint) | Endpoint for your Kubernetes API server | `string` | n/a | yes | | [cluster\_name](#input\_cluster\_name) | EKS cluster name name component used through out the EKS cluster describing its purpose (ex: dice-dev) | `string` | n/a | yes | +| [create\_spot\_service\_linked\_role](#input\_create\_spot\_service\_linked\_role) | Whether to create the service-linked role for EC2 Spot (required for Karpenter spot instances) | `bool` | `false` | no | | [eecr\_info](#input\_eecr\_info) | Enterprise ECR source information |
object({
account_id = string
alias = string
profile = string
region = string
})
|
{
"account_id": "269222635945",
"alias": "lab-gov-shared-nonprod",
"profile": "269222635945-lab-gov-shared-nonprod",
"region": "us-gov-east-1"
}
| no | | [karpenter\_helm\_chart](#input\_karpenter\_helm\_chart) | Which helm chart of karpenter | `string` | `"1.1.1"` | no | | [karpenter\_helm\_repo](#input\_karpenter\_helm\_repo) | Helm repo for official karpenter chart | `string` | `"oci://public.ecr.aws/karpenter"` | no | diff --git a/copy_images.tf b/copy_images.tf index daa4606..8ef9d2f 100644 --- a/copy_images.tf +++ b/copy_images.tf @@ -4,11 +4,12 @@ locals { image_config = [ { - enabled = true - dest_path = null - name = "karpenter/controller" - source_image = "karpenter/controller" - source_registry = format("%v/%v", local.ent_ecr_source, "public-ecr") + enabled = true + dest_path = null + name = "karpenter/controller" + source_image = "opensource/aws/karpenter/controller" + # source_registry = "public.ecr.aws" + source_registry = format("%v/%v", local.ent_ecr_source, "ironbank") source_tag = var.karpenter_tag tag = var.karpenter_tag }, diff --git a/main.tf b/main.tf index ffbc633..acd95a6 100644 --- a/main.tf +++ b/main.tf @@ -21,18 +21,14 @@ locals { # Replicating from here: https://github.e.it.census.gov/SCT-Engineering/terraform-aws-eks/tree/master/modules/karpenter # Karpenter IRSA roles and policies module "karpenter_resources" { - source = "git::https://github.e.it.census.gov/SCT-Engineering/terraform-aws-eks.git//modules/karpenter?ref=v20.37.2" + source = "git::https://github.e.it.census.gov/SCT-Engineering/terraform-aws-eks.git//modules/karpenter?ref=v21.11.0" cluster_name = var.cluster_name create_access_entry = true create_instance_profile = true create_node_iam_role = true create_pod_identity_association = true - enable_irsa = true - irsa_namespace_service_accounts = ["${var.namespace}:karpenter"] - irsa_oidc_provider_arn = var.oidc_provider_arn - enable_pod_identity = true - enable_v1_permissions = true + namespace = var.namespace node_iam_role_name = local.node_iam_role_name queue_name = local.queue_name rule_name_prefix = local.rule_name_prefix @@ -60,7 +56,7 @@ data "aws_ecr_image" "karpenter_image" { resource "helm_release" "karpenter" { depends_on = [ data.aws_ecr_image.karpenter_image, - # aws_iam_service_linked_role.spot + aws_iam_service_linked_role.spot ] name = "karpenter" chart = "karpenter" @@ -117,15 +113,16 @@ resource "helm_release" "nodepool_resources" { } # Create service-linked role for EC2 Spot (required for Karpenter spot instances) -# resource "aws_iam_service_linked_role" "spot" { -# aws_service_name = "spot.amazonaws.com" -# description = "Service-linked role for EC2 Spot instances used by Karpenter" - -# # This will only create the role if it doesn't already exist -# # If it exists, Terraform will import the existing role -# lifecycle { -# ignore_changes = [ -# description, -# ] -# } -# } +resource "aws_iam_service_linked_role" "spot" { + count = var.create_spot_service_linked_role ? 1 : 0 + aws_service_name = "spot.amazonaws.com" + description = "Service-linked role for EC2 Spot instances used by Karpenter" + + # This will only create the role if it doesn't already exist + # If it exists, Terraform will import the existing role + lifecycle { + ignore_changes = [ + description, + ] + } +} diff --git a/variables.tf b/variables.tf index 1cd76ec..d2bb162 100644 --- a/variables.tf +++ b/variables.tf @@ -1,3 +1,4 @@ +# tflint-ignore: terraform_unused_declarations variable "account_id" { description = "aws account number" type = string @@ -14,6 +15,7 @@ variable "cluster_name" { type = string } +# tflint-ignore: terraform_unused_declarations variable "eecr_info" { description = "Enterprise ECR source information" type = object({ @@ -89,3 +91,9 @@ variable "tags" { type = map(string) default = {} } + +variable "create_spot_service_linked_role" { + description = "Whether to create the service-linked role for EC2 Spot (required for Karpenter spot instances)" + type = bool + default = false +}