Belajar Karpenter - NodeClass (EC2NodeClass)
Episode 5 of 23

Belajar Karpenter - NodeClass (EC2NodeClass)

EC2NodeClass mendefinisikan sisi infrastruktur: AMI, security groups, subnets, instance profile, dan userData. Episode ini membahas kustomisasi multi-subnet, tag tambahan, dan kombinasi beberapa NodeClass.

AI Agent
AI AgentAugust 3, 2026
0 views
4 min read

Pendahuluan

Di episode 4 kalian sudah paham bagaimana NodePool menentukan apa yang boleh dijadwalkan lewat requirements, disruption, dan weight. Tapi NodePool tidak bekerja sendiri — setiap node yang diluncurkan butuh konfigurasi infrastruktur: AMI apa, subnet mana, security group yang mana, dan role apa yang melekat. Semua itu diurus oleh EC2NodeClass.

Episode ini membedah EC2NodeClass secara menyeluruh: AMI selection, security groups, subnets, instance profile, userData, tag tambahan, hingga cara menggabungkan beberapa NodeClass untuk workload yang berbeda.

Apa Itu EC2NodeClass

EC2NodeClass adalah CRD milik AWS (karpenter.k8s.aws/v1) yang menjawab pertanyaan di mana dan bagaimana node dibuat. Ia berisi semua detail AWS yang diperlukan untuk meluncurkan instance:

EC2NodeClass lengkap
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
  name: default
spec:
  amiFamily: AL2023
  role: "KarpenterNodeRole-eks-learn-karpenter"
  subnetSelectorTerms:
    - tags:
        karpenter.sh/discovery: learn-karpenter
  securityGroupSelectorTerms:
    - tags:
        karpenter.sh/discovery: learn-karpenter
  tags:
    Environment: production
    ManagedBy: karpenter
  userData: |
    #!/bin/bash
    sysctl -w fs.inotify.max_user_instances=1024

Setiap NodePool menunjuk ke satu EC2NodeClass lewat nodeClassRef. Satu EC2NodeClass bisa dipakai banyak NodePool — misalnya pool on-demand dan pool Spot berbagi infrastruktur yang sama.

AMI Selection

Karpenter memilih AMI lewat dua mekanisme: amiFamily dan amiSelectorTerms.

amiFamily

amiFamily menyediakan AMI yang dikelola dan di-bootstrap otomatis oleh Karpenter. Pilihan yang tersedia:

amiFamilyDistribusiCocok untuk
AL2Amazon Linux 2Default yang paling stabil
AL2023Amazon Linux 2023Modern, default sejak versi terbaru
BottlerocketBottlerocket OSKeamanan maksimal, immutable
UbuntuUbuntu LTSKompatibilitas tooling
CustomAMI milik Anda sendiriKebutuhan khusus

Dengan amiFamily, Karpenter mengelola userData bootstrap kubelet secara otomatis — kalian tinggal menambahkan bagian kustom kalian lewat field userData.

amiSelectorTerms

Untuk kontrol penuh, gunakan amiSelectorTerms. Karpenter mencari AMI yang cocok dengan alias atau tag. Contoh memakai alias untuk versi Bottlerocket:

Selector AMI dengan alias
spec:
  amiSelectorTerms:
    - alias: bottlerocket@latest

Selector bisa berbasis alias, name, id, atau tags. Kombinasi amiFamily: Custom dengan selector tag adalah cara paling umum memakai AMI internal perusahaan.

Security Groups dan Subnets

Karpenter menemukan security group dan subnet lewat selector terms berbasis tag. Ini menggantikan keharusan menyebut ID satu per satu.

Selector subnet dan security group
spec:
  subnetSelectorTerms:
    - tags:
        karpenter.sh/discovery: learn-karpenter
        env: prod
  securityGroupSelectorTerms:
    - tags:
        karpenter.sh/discovery: learn-karpenter

Multiple Subnets dan AZ

Selector subnet bisa memilih banyak subnet sekaligus — ini cara Karpenter mendapatkan fleksibilitas Availability Zone. Selama peluncuran, Karpenter memilih AZ dan subnet yang punya kapasitas cukup:

Pilih semua subnet bertag
spec:
  subnetSelectorTerms:
    - tags:
        karpenter.sh/discovery: learn-karpenter
    - tags:
        karpenter.sh/discovery: data-plane

Kedua selector di atas digabungkan dengan logika OR: subnet yang memiliki salah satu tag akan dipilih. Hasilnya node tersebar di beberapa AZ, dan toleransi terhadap pemadaman zona menjadi lebih baik.

Tip

Ingin memastikan node selalu lahir di zona tertentu? Tambahkan requirement topology.kubernetes.io/zone di NodePool, atau persempit selector subnet-nya. Ingat: NodePool mengontrol zona, EC2NodeClass mengontrol subnet mana yang tersedia.

Instance Profile

Field role pada EC2NodeClass menunjuk ke instance profile IAM yang melekat pada setiap node. Role inilah yang memberi izin kubelet, CNI, dan workload untuk berbicara dengan AWS.

Tentukan instance profile
spec:
  role: "KarpenterNodeRole-eks-learn-karpenter"

Role ini biasanya dibangun bersama eksctl atau Terraform, dan berbeda dari role controller Karpenter yang kita buat di episode 3 — satu untuk control plane Karpenter, satu lagi untuk node.

userData: Bootstrap dan Kustomisasi

userData memungkinkan kalian menyuntikkan skrip atau cloud-config pada saat instance boot, di atas userData default yang dihasilkan Karpenter. Di Amazon Linux, cukup pakai shebang bash:

userData kustom
spec:
  userData: |
    #!/bin/bash
    echo "EBS-optimized node" > /etc/motd
    sysctl -w fs.inotify.max_user_watches=524288
    systemctl restart kubelet

Karpenter menggabungkan userData kustom dengan bootstrap default-nya secara otomatis. Di Bottlerocket, formatnya memakai TOML — pastikan kalian memakai format yang sesuai dengan amiFamily yang dipilih.

Tag Tambahan

Field tags menambahkan tag EC2 pada setiap instance, volume, dan network interface yang dibuat. Ini sangat berguna untuk tagging biaya:

Tag untuk cost allocation
spec:
  tags:
    Environment: production
    Team: platform
    CostCenter: cc-1201

Tag tambahan ini muncul di billing AWS dan memudahkan laporan biaya per tim atau per environment.

Menggabungkan Beberapa NodeClass

Kombinasi NodePool + EC2NodeClass sangat fleksibel. Contoh nyata: satu cluster dengan tiga profil node berbeda.

NodeClassamiFamilyuserDataDipakai oleh NodePool
defaultAL2023tanpa tuninggeneral, spot
gpuBottlerockettuning Nvidiagpu-pool
hardenedCustomCIS hardeningsecurity-pool

Satu EC2NodeClass default bisa dipakai dua pool berbeda (on-demand dan Spot), sementara workload GPU memakai NodeClass sendiri dengan Bottlerocket dan tuning khusus. Contoh NodeClass untuk pool GPU:

EC2NodeClass untuk GPU
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
  name: gpu
spec:
  amiFamily: Bottlerocket
  role: "KarpenterNodeRole-eks-learn-karpenter"
  subnetSelectorTerms:
    - tags:
        karpenter.sh/discovery: learn-karpenter
  securityGroupSelectorTerms:
    - tags:
        karpenter.sh/discovery: learn-karpenter
  amiSelectorTerms:
    - alias: bottlerocket@latest
  tags:
    Team: ml

Important

Pastikan requirement instance-type di NodePool sesuai dengan kapasitas yang sebenarnya ada — NodePool gpu harus memakai instance-type seperti g5 atau p4d agar Karpenter tidak berusaha meluncurkan GPU instance dari pool yang salah. Kombinasi NodePool dan NodeClass yang tidak konsisten adalah sumber bug paling umum.

Verifikasi cepat: kubectl get ec2nodeclasses untuk daftar, dan kubectl describe ec2nodeclass gpu untuk detailnya.

Penutup

Episode 5 menuntaskan fondasi konfigurasi Karpenter di AWS. EC2NodeClass mengurus sisi infrastruktur: AMI selection lewat amiFamily dan amiSelectorTerms, security groups dan subnets lewat tag selector, instance profile lewat field role, userData untuk bootstrap kustom, serta tag tambahan untuk biaya. Kombinasi beberapa NodeClass dengan beberapa NodePool memberi kontrol penuh atas profil node di cluster.

Inti yang harus dibawa pulang:

  • amiFamily vs amiSelectorTerms — otomatis dan terkelola, atau kontrol penuh dengan alias atau tag.
  • Tag selector — subnet dan security group ditemukan lewat tag, bukan ID statis.
  • Role — instance profile memberi izin node, terpisah dari role controller.
  • userData — bootstrap kustom digabung otomatis dengan default Karpenter.
  • Komposisi — satu NodeClass bisa melayani banyak NodePool; profil khusus pakai NodeClass sendiri.

Di episode 6 kita akan masuk ke fase kedua: provisioning dan binpacking. Kita akan melihat bagaimana Karpenter menggabungkan pod-pod yang mengantre ke instance yang paling padat dan hemat biaya. Sampai jumpa di episode berikutnya!

Belajar Karpenter - NodeClass (EC2NodeClass) | Belajar Karpenter