No EC2NodeClass when deploying Karpenter

197 Views Asked by At

I've been trying to deploy Karpenter, something similar to this example here: https://github.com/aws/karpenter-provider-aws/blob/main/examples/v1beta1/100-cpu-limit.yaml

I've been getting the following error

flux reconcile source git flux-system && flux reconcile kustomization infrastructure       
► annotating GitRepository flux-system in flux-system namespace
✔ GitRepository annotated
◎ waiting for GitRepository reconciliation
✔ fetched revision master@sha1:29b03359f1871cc930f9d1bf4886dad12151d0e6
► annotating Kustomization infrastructure in flux-system namespace
✔ Kustomization annotated
◎ waiting for Kustomization reconciliation
✗ Kustomization reconciliation failed: EC2NodeClass/karpenter/default dry-run failed, 
error: no matches for kind "EC2NodeClass" in version "karpenter.k8s.aws/v1beta1"

Can't find any issue about EC2NodeClass being unavailable

1

There are 1 best solutions below

0
Cameron Carranza On

From what I found basically none of the examples go over the installation of CRDs. I was able to do this with the following helm_release:

resource "helm_release" "karpenter_crd" {
  namespace           = "karpenter"
  create_namespace    = true
  name                = "karpenter-crd"
  repository          = "oci://public.ecr.aws/karpenter"
  chart               = "karpenter-crd"
  version             = "v0.32.1"
  replace             = true
  force_update        = true
}

Ensure that the primary karpenter helm release leverages depends_on with this and the CRDs should be available for it to use. Here's a fuller example from mine:

resource "helm_release" "karpenter_crd" {
  namespace           = "karpenter"
  create_namespace    = true
  name                = "karpenter-crd"
  repository          = "oci://public.ecr.aws/karpenter"
  chart               = "karpenter-crd"
  version             = "v0.32.1"
  replace             = true
  force_update        = true
}


resource "helm_release" "karpenter" {
  namespace        = "karpenter"
  create_namespace = true

  name                = "karpenter"
  repository          = "oci://public.ecr.aws/karpenter"
  repository_username = var.ecr_token_user
  repository_password = var.ecr_token_password
  chart               = "karpenter"
  version             = "v0.32.1"

  values = [
    <<-EOT
    settings:
      clusterName: ${var.cluster_name}
      clusterEndpoint: ${var.cluster_endpoint}
      interruptionQueueName: ${var.karpenter_queue_name}
    serviceAccount:
      annotations:
        eks.amazonaws.com/role-arn: ${var.karpenter_irsa_arn} 
    EOT
  ]

  depends_on = [
    "helm_release.karpenter_crd"
  ]

}

resource "helm_release" "karpenter_node_class" {
  name       = "karpenter-nodeclass"
  repository = "https://dysnix.github.io/charts"
  chart      = "raw"
  version    = "0.3.2"
  
  values = [
    <<-EOF
    resources:
      - apiVersion: karpenter.k8s.aws/v1beta1
        kind: EC2NodeClass
        metadata:
          name: default
        spec:
          amiFamily: AL2
          role: ${var.karpenter_role_name}
        subnetSelectorTerms:
            - tags:
                karpenter.sh/discovery: ${var.cluster_name}
        securityGroupSelectorTerms:
            - tags:
                karpenter.sh/discovery: ${var.cluster_name}
        tags:
            karpenter.sh/discovery: ${var.cluster_name}
    EOF
  ]

  depends_on = [
    helm_release.karpenter,
  ]
}

Hope this helps you!