Skip to content

Karpenter NodePool

Karpenter NodePool

Category: Compute Type: Cluster Service Tags: karpenter · autoscaling · ec2 · nodepool · aws · cluster-level


Overview

The Karpenter NodePool plugin configures a single Karpenter NodePool — the scaling policy that controls which EC2 instance types Karpenter provisions, under what constraints, and for which workloads. Each installation creates one NodePool. Install multiple times to create multiple pools (service, workstation, GPU, etc.), each independently configured and named by its install name.

Requires karpenter-nodeclass (or an equivalent EC2NodeClass) to already be installed in the cluster.


How It Works

Cluster Service — Each install creates one NodePool resource in the cluster. The install name becomes the NodePool resource name. The pool_type field controls which node label and CPU architecture are applied to provisioned nodes — this is how workloads target the correct pool.

Pool Type Node Label Architecture
service juno-innovations.com/service=true amd64
workstation-cpu juno-innovations.com/workstation=true amd64
workstation-arm64 juno-innovations.com/workstation=true arm64
workstation-gpu juno-innovations.com/workstation=true amd64

Prerequisites

  • EKS cluster with Karpenter installed
  • karpenter-nodeclass plugin installed (or an EC2NodeClass already present in the cluster)

Installation

  1. Open Terra and navigate to the Plugin Marketplace
  2. Search for "Karpenter NodePool"
  3. Click Install
  4. Choose an install name — this becomes the NodePool resource name (e.g. service, arm64-workstations, gpu)
  5. Fill in the configuration fields below
  6. Click Confirm to deploy

Repeat for each additional NodePool your cluster needs.


Configuration

Install-Time Fields

Field Details
nodeclass_ref string · Required
Name of the EC2NodeClass to use. Must match the install name of your karpenter-nodeclass plugin install.
pool_type select · Required
Type of NodePool. Controls the node label and CPU architecture. Options: service, workstation-cpu, workstation-arm64, workstation-gpu.
availability_zone string · Required
Availability zone for provisioned nodes (e.g. us-east-1a).
capacity_type select · Required · Default: spot
EC2 capacity type. spot for cost savings, on-demand for guaranteed availability. GPU pools typically use on-demand.
instance_categories string · Required · Default: c,t,r
Comma-separated Karpenter instance category letters. c=compute, m=general, r=memory, t=burstable, g=GPU, p=GPU-optimized.
instance_types string · Required · Default: c5.xlarge,c5a.xlarge,c5ad.xlarge,c6a.xlarge,c7i-flex.xlarge
Comma-separated EC2 instance types Karpenter may provision. Use ARM64 instance types (e.g. c6g.xlarge) for workstation-arm64 pools.
cpu_limit string · Required · Default: 16
Maximum total CPU cores this pool may provision across all nodes.
memory_limit string · Required · Default: 32Gi
Maximum total memory this pool may provision across all nodes.
weight int · Optional
NodePool scheduling weight (1–100). Higher weight = higher priority when Karpenter selects between pools. Leave empty for Karpenter default (0).
min_cpu string · Optional
Minimum vCPUs for candidate instance types. Leave empty to allow any size.

Notes

  • Install once per logical pool — most clusters need at minimum a service pool (for ingress-nginx) and one or more workstation pools
  • Use weight to express pool preference: e.g. set GPU pool weight lower than CPU pools so Karpenter exhausts cheaper options first
  • instance_categories and instance_types work together — Karpenter must satisfy both constraints when selecting an instance
  • For ARM64 pools, ensure instance_types contains only ARM64 instance families (e.g. c6g, c7g, m6g, r6g)
  • For GPU pools, on-demand capacity is recommended — spot GPU interruptions can disrupt long-running training jobs

plugins/karpenter-nodepool/terra.yaml
resource_id: karpenter-nodepool
name: Karpenter NodePool
icon: https://github.com/juno-fx/Terra-Official-Plugins/blob/main/plugins/karpenter-nodepool/assets/logo.png?raw=true
description: |
  Configure a single Karpenter NodePool for EKS auto-scaling. The install name becomes the
  NodePool resource name. Install multiple times to create multiple NodePools — each install
  is independent. Requires a karpenter-nodeclass install (or equivalent EC2NodeClass) to
  already exist in the cluster.
category: Compute
compatibility: genesis-deployment>=3.0.2,orion-deployment>=3.1.0
editable: true
tags:
  - karpenter
  - autoscaling
  - ec2
  - nodepool
  - aws
  - cluster-level
fields:
  - name: nodeclass_ref
    description: >-
      Name of the EC2NodeClass to use for this pool. Must match the install name of your
      karpenter-nodeclass plugin install.
    required: true
    type: string
  - name: pool_type
    description: >-
      Type of NodePool. Determines the node label and CPU architecture applied to provisioned nodes.
      service = amd64, labeled for ingress-nginx (juno-innovations.com/service=true).
      workstation-cpu = amd64 general workstation.
      workstation-arm64 = ARM64 workstation.
      workstation-gpu = amd64 GPU workstation.
    required: true
    type: select
    options:
      - service
      - workstation-cpu
      - workstation-arm64
      - workstation-gpu
  - name: availability_zone
    description: 'Availability zone for provisioned nodes (e.g. us-east-1a).'
    required: true
    type: string
  - name: capacity_type
    description: EC2 capacity type. Use spot for cost savings, on-demand for guaranteed availability.
    required: true
    type: select
    default: spot
    options:
      - spot
      - on-demand
  - name: instance_categories
    description: >-
      Comma-separated Karpenter instance category letters (e.g. c,t,r).
      c=compute, m=general, r=memory, t=burstable, g=GPU, p=GPU-optimized.
    required: true
    type: string
    default: 'c,t,r'
  - name: instance_types
    description: >-
      Comma-separated EC2 instance types Karpenter may provision (e.g. c5.xlarge,c6a.xlarge).
      Karpenter picks from this list when launching nodes.
    required: true
    type: string
    default: 'c5.xlarge,c5a.xlarge,c5ad.xlarge,c6a.xlarge,c7i-flex.xlarge'
  - name: cpu_limit
    description: Maximum total CPU cores this pool may provision across all nodes.
    required: true
    type: string
    default: '16'
  - name: memory_limit
    description: 'Maximum total memory this pool may provision across all nodes (e.g. 32Gi).'
    required: true
    type: string
    default: 32Gi
  - name: weight
    description: >-
      NodePool scheduling weight (1-100). Higher weight = higher priority when Karpenter chooses
      between pools. Leave empty to use Karpenter default (0).
    required: false
    type: int
  - name: min_cpu
    description: >-
      Minimum vCPUs for candidate instance types. Adds a Gt (greater-than) CPU requirement.
      Leave empty to allow any size instance that matches the other requirements.
    required: false
    type: string