Cara mendiagnosis masalah Karpenter secara sistematis: membaca log controller, memeriksa kondisi NodeClaim dan NodePool, memahami pesan validasi webhook, dan menelusuri event Kubernetes. Termasuk solusi untuk masalah umum seperti node gagal dibuat, spot capacity kosong, drift berlebihan, disruption yang terblokir PDB, dan pod pending.

Di episode 17 kalian sudah mengenal fitur lanjutan Karpenter: static capacity, bare metal, hingga dukungan provider komunitas di platform lain. Semakin kompleks sebuah sistem, semakin penting kemampuan mencari tahu mengapa ia tidak bekerja seperti harapan. Karpenter adalah sistem yang bergerak cepat — puluhan keputusan dilakukan setiap detik — sehingga ketika ada yang salah, gejala muncul jauh dari akar masalah.
Episode ini membekali kalian dengan alur diagnostik yang sistematis. Kita mulai dari log controller, lalu kondisi NodeClaim dan NodePool, pesan validasi webhook, dan event Kubernetes. Terakhir, kita bedah masalah umum beserta solusinya satu per satu.
Jangan langsung membuka log. Mulailah dengan pertanyaan: apa yang sebenarnya terjadi? Pod pending, node tidak dibuat, atau node tidak pernah dibongkar? Tiga gejala ini menunjuk ke lapisan yang berbeda — scheduler, cloud provider, atau disruption.
Urutan yang paling efektif:
Tip
Catat waktu kejadian. Karpenter memproses banyak hal secara paralel, sehingga log dan event bisa bertele-tele. Mencari entri di sekitar waktu kejadian jauh lebih cepat daripada membaca semuanya dari awal.
Controller Karpenter berjalan di namespace karpenter sebagai deployment bernama karpenter. Log di sana adalah sumber kebenaran utama tentang apa yang sedang dipikirkan Karpenter.
kubectl logs -n karpenter deploy/karpenter --tail=200Level log bisa dinaikkan ke debug melalui ConfigMap karpenter-global-settings di namespace yang sama, dengan mengubah key logLevel. Log debug menampilkan detail scheduling simulation, pilihan instance type, dan alasan sebuah node ditolak — sangat berguna saat gejalanya samar.
NodeClaim adalah objek paling penting untuk dibaca. Setiap claim memiliki kondisi di status yang menunjukkan fase hidupnya.
kubectl get nodeclaims
kubectl get nodeclaim <nama-nodeclaim> -o yamlPerhatikan bagian status.conditions. Kondisi seperti Launching, Registered, dan Initialized menandakan progres normal. Jika Registered bernilai false, node tidak bisa bergabung ke cluster — biasanya soal IAM atau bootstrap. NodePool punya kondisi serupa; NodePool yang tidak sehat membuat semua workload yang menunjuk ke sana tidak pernah terjadwal.
Important
Periksa juga bagian status untuk pesan error dari cloud provider, misalnya kegagalan peluncuran instance. Pesan ini sering langsung menyebut penyebabnya, seperti kuota vCPU terlampaui atau instance type tidak tersedia.
Karpenter memasang admission webhook untuk memvalidasi NodePool dan EC2NodeClass sebelum diterima. Kesalahan konfigurasi biasanya muncul di sini — sebelum resource dibuat, bukan saat dijalankan.
kubectl apply -f nodepool.yaml
kubectl get validatingwebhookconfiguration -l app.kubernetes.io/name=karpenterJika YAML salah, kubectl apply akan menolak dengan pesan yang cukup eksplisit, misalnya requirement yang duplikat atau field yang tidak dikenal. Pastikan apiVersion sesuai dengan versi Karpenter yang terpasang; mencampur versi CRD adalah penyebab paling umum error no matches for kind.
Event merekam apa yang terjadi pada objek tertentu. Untuk pod yang pending, deskripsikan pod-nya; untuk node yang tidak kunjung dibuat, saring event berdasarkan kind NodeClaim.
kubectl describe pod <nama-pod>
kubectl get events --field-selector involvedObject.name=<nama-pod>Event pada NodeClaim menampilkan perjalanan claim tersebut: diluncurkan, terdaftar, terinisialisasi, hingga dihapus. Jika claim berhenti di tengah, event di sekitarnya menceritakan alasannya.
| Gejala | Penyebab paling mungkin | Langkah pertama |
|---|---|---|
| Node tidak pernah dibuat | IAM role atau instance profile tidak cocok | Periksa log controller untuk AccessDenied |
| Node tidak dibuat, error kuota | vCPU quota EC2 terlampaui | Cek service quotas dan kurangi instance size |
| Spot selalu gagal | Kapasitas spot kosong di zona | Tambah instance type dan zona |
| Node dibuat berulang-ulang | Drift berlebihan karena konfigurasi sering berubah | Batasi perubahan dan gunakan budget Drifted |
| Node tidak dibongkar | Disruption diblokir PDB | Periksa kubectl get pdb -A |
| Pod pending selamanya | Constraint scheduling tidak cocok | Deskripsikan pod dan baca event |
Ketika Karpenter tidak bisa meluncurkan instance, log controller akan memuat error dari API AWS, misalnya AccessDenied pada instance profile, atau pesan kuota untuk batas vCPU. Solusi untuk IAM: pastikan instance profile di EC2NodeClass benar dan role tersebut memiliki policy yang dibutuhkan untuk meluncurkan instance.
Untuk limit instance, cek kuota vCPU EC2 di region yang dipakai. Karpenter tidak punya mekanisme coba-coba sampai lolos — ia menunggu error lalu mengirim event. Lebih baik menaikkan kuota di AWS Support Center, atau memperluas pilihan instance type di NodePool agar ada opsi yang tersedia.
Kapan pun kapasitas spot menipis, error seperti InsufficientInstanceCapacity atau NoSpotCapacity muncul di NodeClaim. Karpenter akan mencoba instance type lain dalam satu batch, tetapi jika NodePool membatasi terlalu sempit — misalnya satu keluarga instance di satu zona — peluang sukses sangat kecil.
Perbaikan tercepat: tambahkan lebih banyak instance type melalui requirement, dan aktifkan beberapa zona. Semakin beragam pilihan, semakin tahan terhadap gejolak kapasitas spot.
Drift terjadi saat node tidak lagi cocok dengan spesifikasi — misalnya AMI atau security group berubah di EC2NodeClass. Jika perubahan terjadi terus-menerus, Karpenter terus mengganti node dan cluster terasa tidak stabil.
Cara mengendalikan: kurangi frekuensi perubahan pada EC2NodeClass, dan gunakan disruption budget untuk membatasi berapa banyak node drift yang boleh diproses sekaligus.
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: general
spec:
disruption:
budgets:
- nodes: "20%"
reasons:
- DriftedKonsolidasi dan drift menghormati Pod Disruption Budget. Jika sebuah PDB menolak eviction — karena minAvailable terlalu tinggi atau maxUnavailable nol — NodeClaim tidak akan dibongkar dan event DisruptionBlockedByPDB muncul.
Periksa dengan kubectl get pdb -A lalu lihat aplikasi mana yang menahan. Opsi solusi: turunkan minAvailable, beri toleransi untuk pod yang benar-benar bisa diganggu, atau pisahkan workload tersebut ke NodePool yang tidak dikonsolidasi.
Pod pending tanpa NodeClaim berarti Karpenter menganggap tidak ada NodePool yang cocok. Deskripsikan pod dan baca event didn't match any node atau Insufficient — di sana tercantum constraint yang gagal.
Cek juga apakah ada taint tanpa toleration, topology spread yang mustahil dipenuhi, atau requirement NodePool yang bentrok. Karpenter tidak membuat NodeClaim jika tidak ada instance type yang lolos semua constraint pod.
Troubleshooting Karpenter bukanlah sihir, melainkan disiplin membaca tanda-tanda di urutan yang benar.
Inti yang harus dibawa pulang:
kubectl logs -n karpenter memperlihatkan keputusan dan error internal Karpenter.Registered dan Initialized adalah penanda sehat; error di status langsung mengarah ke IAM atau kuota.DisruptionBlockedByPDB dan kubectl get pdb -A memastikan budget disruption dipatuhi.Karpenter yang berjalan bukan berarti berjalan cepat. Di episode 19 kita membahas Performance dan Tuning — faktor latency provisioning, tuning spec.template dan consolidation windows, efisiensi binpacking, hingga cara menghindari fragmentasi dengan resource requests yang benar. Sampai jumpa!