Menyelami integrasi Karpenter dengan jaringan VPC: pemilihan subnet dan Availability Zone di NodeClass, security group, perilaku node baru dengan ENI dan Pod ENI, VPC CNI, serta EFA untuk workload HPC dan ML.

Di episode 12 kalian sudah bisa mengamati Karpenter lewat metrik Prometheus dan menyusun alerting yang tepat. Sekarang kita turun satu lapisan ke hal yang menentukan apakah node yang baru dibuat bisa benar-benar melayani traffic: jaringan. Node yang luncur sempurna tetapi jatuh ke subnet yang salah, atau menolak pod karena kuota ENI habis, akan membuat seluruh provisioning percuma.
Episode ini membahas networking integration. Kalian akan memahami bagaimana Karpenter memilih subnet dan Availability Zone lewat NodeClass, bagaimana security group diterapkan, perilaku node baru terkait ENI dan Pod ENI, cara kerja VPC CNI, hingga penggunaan EFA untuk workload HPC dan machine learning yang butuh latency antar node sangat rendah.
Semua keputusan jaringan level infrastruktur dikendalikan dari EC2NodeClass, bukan NodePool. NodePool memilih instance type dan scheduling, sedangkan NodeClass menentukan ke mana node itu diletakkan dan bagaimana ia tersambung. Pemetaan ini menjaga satu concern per resource: NodePool untuk keinginan workload, NodeClass untuk kenyataan VPC.
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
name: default
spec:
amiFamily: AL2
subnetSelectorTerms:
- tags:
karpenter.sh/discovery: my-cluster
securityGroupSelectorTerms:
- tags:
karpenter.sh/discovery: my-clusterPemilihan subnet dilakukan lewat tag, bukan nama atau ID. Dengan pola ini, subnet baru yang ditambahkan ke VPC otomatis dikenali Karpenter tanpa mengubah konfigurasi. Gunakan kubectl describe ec2nodeclass default untuk melihat daftar subnet dan AZ yang cocok dengan selector.
Karpenter memilih subnet berdasarkan label yang otomatis ditambahkan ke node, seperti topology.kubernetes.io/zone dan node.kubernetes.io/instance-type. Jika workload memerlukan AZ tertentu, misalnya untuk mengurangi biaya transfer data antar AZ, kalian bisa membatasinya lewat NodePool:
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: general
spec:
template:
spec:
requirements:
- key: topology.kubernetes.io/zone
operator: In
values: ["ap-southeast-1a", "ap-southeast-1b"]
disruption:
consolidationPolicy: WhenUnderutilizedImportant
NodePool dengan constraint subnet atau AZ yang terlalu sempit bisa membuat pod tetap Pending meskipun instance capacity di AWS tersedia. Selalu pastikan ada subnet di beberapa AZ untuk tiap NodePool kecuali ada alasan kuat seperti compliance atau regulatory.
Ketika Karpenter membuat node baru, urutan jaringan yang terjadi adalah: instance diluncurkan di subnet terpilih, security group diterapkan dari selector, lalu VPC CNI memasang ENI pada instance dan mengalokasikan IP ke pod. Kecepatan urutan ini memengaruhi karpenter_pods_startup_time_seconds yang sudah kalian pelajari di episode 12.
Security group yang dipilih Karpenter menjadi perimeter traffic node. Pemilihan dilakukan dengan securityGroupSelectorTerms, dan semua node dari satu NodeClass berbagi security group yang sama. Untuk cluster EKS, pastikan security group yang dipilih mengizinkan traffic antar node dan dari control plane.
| Aspek | Aturan Praktis |
|---|---|
| Seleksi | Gunakan tag karpenter.sh/discovery yang sama dengan subnet |
| Port 443 | Node butuh akses ke EKS API dan instance metadata |
| Komunikasi antar node | Buka port sesuai kebutuhan CNI dan workload |
| Node-to-node di AZ sama | Prioritaskan open dari security group peer, bukan dari CIDR luas |
Jangan mengandalkan kubelet --node-ip secara manual; Karpenter mengatur konektivitas lewat label dan security group. Untuk memverifikasi, cek node yang baru dibuat dengan kubectl get nodes -o wide dan pastikan INTERNAL-IP berada di CIDR subnet yang diharapkan.
Setiap instance EC2 memiliki kuota ENI dan IP berdasarkan tipe instance. VPC CNI memasang satu ENI utama dan menambahkan ENI tambahan seiring kebutuhan, atau memakai mode Pod ENI di mana setiap pod mendapatkan ENI dan IP VPC sendiri. Karpenter harus tahu kapasitas ini agar tidak menjadwalkan pod melebihi kuota.
/28 untuk memperbanyak jumlah pod per ENI.Warning
Pod ENI adalah fitur powerful, tetapi konsumsi IP VPC-nya besar dan menambah delay pembuatan pod. Aktifkan hanya untuk workload yang benar-benar butuh isolasi security group per pod, seperti data plane yang harus membatasi akses antar pod. Untuk workload biasa, biarkan VPC CNI bekerja dengan mode standar.
Beberapa tim memilih custom networking, di mana pod dialokasikan IP dari CIDR terpisah dari node. Ini mengurangi risiko kehabisan IP di subnet node, tetapi butuh subnet tambahan untuk pod. Jika custom networking aktif, pastikan subnet selector NodeClass memilih subnet yang tepat untuk node, dan subnet pod dikonfigurasi di VPC CNI.
# Lihat jumlah ENI dan IP yang dipakai pod
kubectl get nodes -o custom-columns=NAME:.metadata.name,MAX_PODS:.status.capacity.pods
# Periksa log VPC CNI pada salah satu node
kubectl logs -n kube-system -l app.kubernetes.io/name=aws-node --tail=50{:bash}Prefix delegation menaikkan jumlah pod per ENI dari 35 menjadi sekitar 110 untuk tipe tertentu. Manfaatnya adalah pod lebih banyak per node, mengurangi jumlah instance dan biaya. Kekurangannya, IP yang tersedia di subnet lebih cepat habis, jadi perhatikan limit CIDR.
Untuk workload HPC dan ML terdistribusi yang butuh latency sangat rendah dan throughput tinggi antar node, gunakan Elastic Fabric Adapter (EFA). EFA menyediakan akses langsung ke hardware jaringan dengan melewati kernel untuk sebagian path, menghasilkan latency yang konsisten untuk pattern komunikasi seperti MPI dan NCCL.
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
name: efa
spec:
amiFamily: Bottlerocket
subnetSelectorTerms:
- tags:
karpenter.sh/discovery: my-cluster
purpose: hpcCaution
EFA tidak tersedia di semua instance type dan tidak semua tipe mendukung jumlah interface yang sama. Saat memilih instance untuk EFA, pastikan tipe tersebut mendukung EFA dan subnet berada di placement group yang sesuai. Uji dulu dengan job MPI kecil sebelum dipakai produksi.
Untuk kasus lanjutan, kalian bisa menetapkan network interface spesifik melalui fitur custom network interfaces Karpenter, misalnya saat node harus menempel ke ENI tertentu atau memakai IP elastis. Kasus ini jarang diperlukan dan lebih cocok untuk integrasi dengan perangkat keamanan jaringan atau kebutuhan IP publik statis.
Jaringan adalah fondasi yang membuat node yang diluncurkan Karpenter benar-benar berguna bagi workload.
Inti yang harus dibawa pulang:
Jaringan sudah siap, tetapi node yang tersambung ke VPC belum tentu aman. Di episode 14 kita membahas Security & IAM — kebijakan minimal untuk controller, instance profile, IRSA dan Pod Identity, AMI hardened, kontrol SSH, userData, hingga isolasi antar NodePool dengan taints dan tolerations. Sampai jumpa!