Mengamati Karpenter lewat Prometheus: metrik node dan pod, latency scheduling, serta provisioning metrics. Disertai dashboard Grafana dan alerting untuk pod Pending lama dan konsolidasi yang efektif.

Di episode 11 kalian sudah memahami drift detection dan bagaimana Karpenter menjaga node tetap selaras dengan template NodeClass dan NodePool. Tapi ada pertanyaan yang selalu muncul begitu sistem otomatis berjalan: bagaimana kita tahu semuanya bekerja dengan benar? Autoscaler yang tidak diamati adalah bom waktu. Setiap keputusan provisioning dan konsolidasi terjadi otomatis tanpa pengawasan manusia, sehingga tanpa metrik kalian tidak akan pernah tahu mengapa sebuah node dibuat, kenapa dihapus, atau mengapa sebuah pod menganggur sebagai Pending.
Episode ini membahas observability. Kalian akan belajar membaca metrik Prometheus yang diekspos Karpenter, memahami makna tiap kelompok metrik, memakai dashboard Grafana siap pakai, dan menyusun alerting untuk dua skenario kritis: pod yang terlalu lama Pending dan konsolidasi yang gagal atau tidak kunjung terjadi.
Autoscaler node mengelola sumber daya paling mahal di cluster: mesin EC2. Berbeda dengan HPA yang hanya mengubah replica, Karpenter membuat dan menghapus infrastruktur nyata, sehingga galat di sini berdampak finansial langsung. Observability bukan sekadar keinginan, melainkan kebutuhan untuk menjawab pertanyaan-pertanyaan ini:
| Kelompok Metrik | Pertanyaan yang Dijawab |
|---|---|
| Node | Berapa kapasitas yang sedang disediakan untuk cluster |
| Pod | Seberapa cepat pod dijadwalkan dan menjadi siap |
| Provisioning | Berapa lama proses scheduling dan pembuatan node |
| Consolidation | Apakah penghematan berjalan dan tidak menggagalkan pod |
| Interruption | Apakah event Spot dan health check ditangani |
Metrik dengan awalan karpenter_nodes_* menggambarkan siklus hidup node yang dikelola Karpenter. Yang paling sering dipakai adalah karpenter_nodes_allocatable — gauge yang berisi jumlah resource yang tersedia pada node yang dimiliki Karpenter, dengan label resource seperti cpu, memory, dan pods.
# Kapasitas CPU total yang disediakan Karpenter
sum(karpenter_nodes_allocatable{resource="cpu"})
# Jumlah node yang dibuat dan dihapus dalam satu jam terakhir
sum(increase(karpenter_nodes_created[1h]))
sum(increase(karpenter_nodes_terminated[1h]))
# Perbandingan resource yang terpakai vs total allocatable
sum(karpenter_nodes_allocatable{resource="cpu"}) -
sum(karpenter_node_utilization{resource="cpu"})Perhatikan metrik karpenter_nodes_terminated bersama label alasan terminasi. Lonjakan angka ini bersamaan dengan berkurangnya pod bisa menandakan konsolidasi bekerja, tetapi jika terjadi terus-menerus tanpa jeda, bisa jadi ada masalah dengan PDB atau disruption.budgets yang terlalu agresif.
karpenter_pods_startup_time_seconds adalah histogram yang mengukur waktu dari pod disubmit sampai pod siap menerima traffic. Inilah metrik terbaik untuk mengevaluasi janji utama Karpenter: latency provisioning dalam hitungan detik. Nilai _sum dibagi _count memberikan rata-rata waktu startup.
# Rata-rata startup pod dalam detik
rate(karpenter_pods_startup_time_seconds_sum[5m]) /
rate(karpenter_pods_startup_time_seconds_count[5m])Selain itu ada karpenter_pods_pending_duration_seconds yang mengukur berapa lama pod menunggu di antrian scheduling. Jika metrik ini tinggi sementara node tidak dibuat, masalahnya bukan di kecepatan provisioning melainkan di constraint NodePool yang terlalu sempit atau kuota AWS yang habis.
Karpenter mengekspos karpenter_provisioner_scheduling_duration_seconds untuk mengukur durasi pengambilan keputusan scheduling — dari pod masuk queue sampai instance type terpilih. Metrik ini penting karena membedakan dua sumber delay yang berbeda: waktu komputasi internal Karpenter melawan waktu API AWS untuk meluncurkan instance.
Tip
Saat mengevaluasi performa Karpenter, pisahkan tiga durasi: scheduling (metrik provisioner), pembuatan instance (metrik cloudprovider), dan startup pod (histogram pod). Menyamakan ketiganya akan membuat kalian salah mengambil kesimpulan saat mengejar target latency sub-30 detik.
Karpenter mengekspos endpoint /metrics pada port 8080 di namespace karpenter. Prometheus dapat mengumpulkannya lewat ServiceMonitor, atau dengan scrape config langsung seperti contoh berikut:
scrape_configs:
- job_name: karpenter
kubernetes_sd_configs:
- role: endpoints
namespaces:
names:
- karpenter
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_app_kubernetes_io_name]
regex: karpenter
action: keep
- source_labels: [__meta_kubernetes_endpoint_port_name]
regex: http
action: keepSetelah scrape aktif, verifikasi bahwa metrik masuk lewat kubectl port-forward -n karpenter service/karpenter 8080:8080 lalu kunjungi endpoint. Untuk skala produksi, simpan data lebih lama dengan remote write atau thanos, karena metrik Karpenter paling berguna ketika bisa dibandingkan antar minggu untuk melihat tren biaya dan latency.
Membangun dashboard dari nol memakan waktu. Untungnya komunitas dan AWS menyediakan dashboard siap impor. Karpenter menyertakan JSON dashboard resmi di repositorinya, dan contoh deployment EKS dari aws-samples juga memuat panel untuk Karpenter bersama metrik node lainnya.
karpenter_nodes_allocatable dibanding karpenter_pods_startup_time_seconds sering cukup untuk memantau efisiensi.Important
Dashboard hanyalah alat bantu visual. Yang lebih penting adalah label yang konsisten. Pastikan semua node Karpenter diberi tag sesuai NodePool, misalnya dengan tag karpenter.sh/discovery dan label cost center, agar panel biaya per workload bisa dikelompokkan dengan benar.
Pod yang menganggur sebagai Pending adalah sinyal paling awal bahwa autoscaling gagal. Kombinasi metrik Kubelet dan kube-state-metrics menghasilkan alert yang akurat:
groups:
- name: karpenter-alerts
rules:
- alert: KarpenterPodPendingLong
expr: |
time() - kube_pod_created > 300
and on(namespace, pod) kube_pod_status_phase{phase="Pending"} == 1
for: 5m
labels:
severity: warning
annotations:
summary: "Pod pending lebih dari 5 menit"Saat alert ini berbunyi, gunakan langkah diagnosis berikut: cek kondisi NodeClaim dengan kubectl get nodeclaims, periksa log controller dengan kubectl logs -n karpenter -l app.kubernetes.io/name=karpenter, dan pastikan limit EC2 instance tidak tercapai. Episode 18 akan membahas troubleshooting ini lebih dalam.
Konsolidasi adalah fitur penghematan, tetapi ia juga bisa menjadi sumber gangguan jika salah konfigurasi. Pantau karpenter_consolidation_seconds_since_last untuk mendeteksi konsolidasi yang tidak berjalan sama sekali, dan karpenter_consolidation_pods_evicted_total untuk melihat jumlah pod yang dievakuasi.
# Berapa detik terakhir sejak konsolidasi terakhir berjalan
karpenter_consolidation_seconds_since_last
# Pod yang di-evict oleh konsolidasi dalam satu jam
sum(increase(karpenter_consolidation_pods_evicted_total[1h]))Warning
Waspadai pola eviction yang berulang pada pod yang sama. Jika pod yang sama terus dievakuasi oleh konsolidasi tetapi tidak pernah berpindah ke node yang lebih murah, kemungkinan ada masalah dengan PDB atau resource requests yang tidak realistis. Jangan buat alert yang hanya menghitung volume eviction tanpa melihat konteks berulangnya.
Observability mengubah Karpenter dari kotak hitam menjadi sistem yang bisa diprediksi dan dipertanggungjawabkan.
Inti yang harus dibawa pulang:
karpenter_pods_startup_time_seconds dan metrik scheduling menunjukkan latency nyata yang dirasakan pengguna, bukan sekadar status cluster.Metrik sudah siap dipantau, tapi ada satu aspek yang menentukan apakah cluster kalian aman untuk produksi: jaringan. Di episode 13 kita membahas Networking Integration — bagaimana Karpenter memilih subnet dan Availability Zone, peran security group, cara kerja ENI dan Pod ENI, VPC CNI, hingga EFA untuk workload HPC dan ML. Sampai jumpa!