Strategi berpindah dari Cluster Autoscaler ke Karpenter: kapan harus mengganti, migrasi bertahap dengan coexistence, konversi nodegroup menjadi NodePool, perbedaan perilaku scheduling, dan pengelolaan downtime selama rollout.

Di episode 15 kalian sudah menyusun best practice kapasitas dan FinOps untuk Karpenter. Namun mungkin kalian bertanya: bagaimana kalau cluster masih memakai Cluster Autoscaler (CA)? Mengganti autoscaler node di cluster produksi terasa menakutkan — CA sudah berjalan lama, workload sudah menyesuaikan perilakunya, dan satu kesalahan bisa membuat seluruh cluster stuck tanpa node baru.
Episode ini membahas migrasi dari Cluster Autoscaler ke Karpenter secara sistematis. Kalian akan belajar kapan harus mengganti CA, menjalankan keduanya berdampingan, mengonversi nodegroup menjadi NodePool, memahami perbedaan perilaku scheduling, hingga mengelola downtime selama rollout.
Cluster Autoscaler berbasis node group: ia hanya menambah atau mengurangi jumlah instance dalam grup yang sudah ditentukan. Karpenter bekerja di level instance langsung, sehingga lebih fleksibel. Pertimbangkan migrasi ketika:
Important
Jangan bermigrasi hanya karena tren. Jika cluster kalian kecil, workload seragam, dan tidak sensitif terhadap latency scale-up, CA mungkin sudah cukup. Migrasi membawa nilai ketika kecepatan, biaya, atau fleksibilitas instance menjadi masalah nyata.
Karpenter dan Cluster Autoscaler dapat hidup berdampingan di cluster yang sama selama satu kondisi terpenuhi: mereka tidak boleh mengelola node group yang sama. CA hanya memindahkan jumlah instance dalam node group tertentu, sementara Karpenter membuat node sendiri. Jika keduanya menyentuh node group yang sama, akan terjadi perang skala: CA menaikkan, Karpenter menurunkan.
kubectl scale deployment cluster-autoscaler \
-n kube-system \
--replicas=0Strategi bertahap yang aman:
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: migration
spec:
template:
spec:
taints:
- key: karpenter.sh/migrated
effect: NoSchedule
disruption:
consolidationPolicy: WhenUnderutilizedPod yang dipindahkan menambahkan toleration karpenter.sh/migrated sehingga mereka dijadwalkan ke node Karpenter, sementara workload lain tetap berjalan di node group lama tanpa gangguan.
Node group eksisting tidak otomatis dikelola Karpenter. Kalian harus merepresentasikan keinginan yang sama dalam bentuk NodePool dan NodeClass. Peta konversinya sederhana: keinginan instance type di node group menjadi requirements, dan launch template menjadi NodeClass.
| Konsep Cluster Autoscaler | Konsep Karpenter |
|---|---|
| Node group | NodePool |
| Launch template / launch config | EC2NodeClass |
| Instance type list | requirements di NodePool |
| Max size | Batas sumber daya di spec atau praktik budget |
| Taints node group | taints di NodePool template |
| Tags node | tags di NodeClass |
Perhatikan bahwa Karpenter tidak mengenal konsep max size per NodePool secara eksplisit. Batas kapasitas ditegakkan lewat kombinasi limits pada resources, budget diskontinuitas, atau kebijakan tagging. Sesuaikan ekspektasi tim: perilaku ini lebih fleksibel tetapi butuh kontrol yang disiplin.
Karpenter dan CA berbeda secara fundamental dalam cara mereka melihat kapasitas. CA bertanya "apakah ada pod yang tidak bisa dijadwalkan, dan apakah node group bisa bertambah?", sedangkan Karpenter melakukan simulasi binpacking terhadap instance type sebelum memutuskan membuat node.
# Node dengan label managed oleh Karpenter
kubectl get nodes -l karpenter.sh/nodepool
# Node yang berasal dari node group eksisting
kubectl get nodes -l eks.amazonaws.com/nodegroupPerbedaan ini berdampak nyata: Karpenter mengemas pod lebih rapat sehingga lebih sedikit node, memilih instance sesuai kebutuhan persis pod, dan tidak menunggu ketersediaan node group. Akibatnya, aplikasi yang mengandalkan penempatan deterministic harus diverifikasi ulang.
Workload yang ditulis untuk CA sering membawa annotation cluster-autoscaler.kubernetes.io/safe-to-evict: "false" untuk mencegah eviction saat scale-down. Karpenter tidak membaca annotation ini. Sebagai gantinya, gunakan Pod Disruption Budget untuk mengatur pod yang tidak boleh diganggu saat konsolidasi.
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: api-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: apiWarning
Setelah migrasi, audit semua annotation cluster-autoscaler.kubernetes.io/safe-to-evict. Pod yang sebelumnya kebal scale-down kini akan ikut dievakuasi konsolidasi. Konversi perlindungan itu menjadi PDB, atau pod kritis bisa mati di tengah daur konsolidasi pertama.
Migrasi yang direncanakan dengan baik tidak membutuhkan downtime. Kunci utamanya adalah ketersediaan node baru sebelum menghapus yang lama: pastikan NodePool Karpenter sudah aktif dan workload baru siap, baru kemudian matikan CA dan mengecilkan node group.
Titik paling rawan adalah perbedaan terminationGracePeriodSeconds dan perilaku drain. CA dan Karpenter sama-sama melakukan drain, tetapi urutan dan prioritasnya berbeda. Uji di environment staging dengan beban yang mirip produksi, dan siapkan rollback dengan menyimpan konfigurasi CA asli.
Tip
Untuk rollback cepat, jangan langsung menghapus node group setelah migrasi. Tahan node group dalam ukuran kecil selama satu hingga dua siklus rilis. Jika Karpenter bermasalah, kalian tinggal menaikkan CA kembali dan mengembalikan deployment tanpa harus membangun infrastruktur dari nol.
Migrasi dari Cluster Autoscaler adalah proyek yang bisa berjalan mulus jika dilakukan bertahap dan dengan perlindungan yang tepat.
Inti yang harus dibawa pulang:
cluster-autoscaler.kubernetes.io/safe-to-evict tidak dibaca Karpenter, jadi audit dan konversi sebelum konsolidasi aktif.Migrasi selesai, dan Karpenter kini mengelola kapasitas utama. Tapi ada banyak fitur lanjutan yang belum dijelajahi. Di episode 17 kita membahas Fitur Lanjutan — static capacity dan node khusus seperti bare metal dan on-prem via NodeClass, lalu Karpenter di platform lain seperti AKS, EKS Anywhere, dan provider komunitas. Sampai jumpa!