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

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.
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:
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=1024Setiap NodePool menunjuk ke satu EC2NodeClass lewat nodeClassRef. Satu EC2NodeClass bisa dipakai banyak NodePool — misalnya pool on-demand dan pool Spot berbagi infrastruktur yang sama.
Karpenter memilih AMI lewat dua mekanisme: amiFamily dan amiSelectorTerms.
amiFamily menyediakan AMI yang dikelola dan di-bootstrap otomatis oleh Karpenter. Pilihan yang tersedia:
| amiFamily | Distribusi | Cocok untuk |
|---|---|---|
| AL2 | Amazon Linux 2 | Default yang paling stabil |
| AL2023 | Amazon Linux 2023 | Modern, default sejak versi terbaru |
| Bottlerocket | Bottlerocket OS | Keamanan maksimal, immutable |
| Ubuntu | Ubuntu LTS | Kompatibilitas tooling |
| Custom | AMI milik Anda sendiri | Kebutuhan khusus |
Dengan amiFamily, Karpenter mengelola userData bootstrap kubelet secara otomatis — kalian tinggal menambahkan bagian kustom kalian lewat field userData.
Untuk kontrol penuh, gunakan amiSelectorTerms. Karpenter mencari AMI yang cocok dengan alias atau tag. Contoh memakai alias untuk versi Bottlerocket:
spec:
amiSelectorTerms:
- alias: bottlerocket@latestSelector bisa berbasis alias, name, id, atau tags. Kombinasi amiFamily: Custom dengan selector tag adalah cara paling umum memakai AMI internal perusahaan.
Karpenter menemukan security group dan subnet lewat selector terms berbasis tag. Ini menggantikan keharusan menyebut ID satu per satu.
spec:
subnetSelectorTerms:
- tags:
karpenter.sh/discovery: learn-karpenter
env: prod
securityGroupSelectorTerms:
- tags:
karpenter.sh/discovery: learn-karpenterSelector subnet bisa memilih banyak subnet sekaligus — ini cara Karpenter mendapatkan fleksibilitas Availability Zone. Selama peluncuran, Karpenter memilih AZ dan subnet yang punya kapasitas cukup:
spec:
subnetSelectorTerms:
- tags:
karpenter.sh/discovery: learn-karpenter
- tags:
karpenter.sh/discovery: data-planeKedua 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.
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.
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 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:
spec:
userData: |
#!/bin/bash
echo "EBS-optimized node" > /etc/motd
sysctl -w fs.inotify.max_user_watches=524288
systemctl restart kubeletKarpenter menggabungkan userData kustom dengan bootstrap default-nya secara otomatis. Di Bottlerocket, formatnya memakai TOML — pastikan kalian memakai format yang sesuai dengan amiFamily yang dipilih.
Field tags menambahkan tag EC2 pada setiap instance, volume, dan network interface yang dibuat. Ini sangat berguna untuk tagging biaya:
spec:
tags:
Environment: production
Team: platform
CostCenter: cc-1201Tag tambahan ini muncul di billing AWS dan memudahkan laporan biaya per tim atau per environment.
Kombinasi NodePool + EC2NodeClass sangat fleksibel. Contoh nyata: satu cluster dengan tiga profil node berbeda.
| NodeClass | amiFamily | userData | Dipakai oleh NodePool |
|---|---|---|---|
| default | AL2023 | tanpa tuning | general, spot |
| gpu | Bottlerocket | tuning Nvidia | gpu-pool |
| hardened | Custom | CIS hardening | security-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:
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: mlImportant
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.
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:
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!