Node #
Node adalah mesin — fisik atau virtual — yang menjadi anggota sebuah cluster Kubernetes. Setiap node memiliki peran dan sekumpulan komponen yang berjalan di dalamnya. Memahami apa yang berjalan di dalam node membantu kamu memahami bagaimana Kubernetes benar-benar menjalankan aplikasi, dan apa yang terjadi ketika sebuah node bermasalah.
Dua Jenis Node #
Dalam cluster Kubernetes, setiap mesin memainkan satu dari dua peran:
Control Plane Node — menjalankan komponen-komponen yang mengelola cluster: API Server, Scheduler, Controller Manager, dan Etcd. Di cluster produksi, node ini biasanya tidak menjalankan workload aplikasi.
Worker Node — menjalankan Pod yang berisi container aplikasi. Ini adalah mesin yang benar-benar mengerjakan “pekerjaan” dalam cluster.
Komponen per jenis node:
Control Plane Node:
├── kube-apiserver ← menerima semua request ke cluster
├── kube-scheduler ← memutuskan Pod jalan di node mana
├── kube-controller-manager ← menjaga desired state
└── etcd ← menyimpan seluruh state cluster
Worker Node:
├── kubelet ← agen yang berkomunikasi dengan control plane
├── kube-proxy ← mengelola aturan networking di node
└── container runtime ← menjalankan container (containerd, CRI-O)
Komponen di Worker Node #
Tiga komponen ini selalu berjalan di setiap worker node:
kubelet adalah agen utama Kubernetes di setiap node. Kubelet terus berkomunikasi dengan API Server, menerima spesifikasi Pod yang perlu dijalankan, memastikan container-container di dalamnya berjalan sesuai spesifikasi, dan melaporkan kondisi node serta Pod kembali ke control plane.
Siklus kerja kubelet:
API Server: "Jalankan Pod 'api-v2' di node ini"
│
▼
Kubelet menerima PodSpec
│
├─ Instruksikan container runtime untuk pull image
├─ Jalankan container sesuai spesifikasi
├─ Monitor container — jalankan liveness probe
└─ Laporkan status ke API Server setiap beberapa detik
kube-proxy mengelola aturan networking di level node. Ketika ada Service Kubernetes yang membuat Pod-pod kamu bisa diakses melalui satu DNS name, kube-proxy yang menulis aturan iptables atau ipvs di node untuk meneruskan traffic ke Pod yang tepat.
Container runtime adalah software yang benar-benar menjalankan container. Kubernetes mendukung runtime yang mengikuti spesifikasi CRI (Container Runtime Interface): containerd (paling umum di produksi modern), CRI-O, dan beberapa lainnya. Docker tidak lagi digunakan secara langsung oleh Kubernetes sejak versi 1.24.
Status dan Kondisi Node #
Kubernetes secara aktif memantau kondisi setiap node. Kamu bisa melihat kondisi ini dengan:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master-1 Ready control-plane 30d v1.28.0
worker-1 Ready <none> 30d v1.28.0
worker-2 Ready <none> 30d v1.28.0
worker-3 NotReady <none> 30d v1.28.0 ← masalah!
Untuk melihat detail kondisi sebuah node:
kubectl describe node worker-3
Output describe node menampilkan beberapa condition yang Kubernetes pantau:
| Condition | Arti jika True | Arti jika False/Unknown |
|---|---|---|
| Ready | Node sehat dan siap menerima Pod | Node bermasalah, Pod tidak akan dijadwalkan |
| MemoryPressure | Memory hampir habis | Memory normal |
| DiskPressure | Disk hampir penuh | Disk normal |
| PIDPressure | Terlalu banyak proses berjalan | Proses dalam batas wajar |
Ketika sebuah node masuk kondisi NotReady, Kubernetes akan menghentikan penjadwalan Pod baru ke node tersebut. Setelah periode tertentu (default 5 menit), Kubernetes akan memindahkan Pod yang sebelumnya berjalan di node tersebut ke node lain yang sehat.
Resource Node #
Setiap node memiliki kapasitas resource yang terbatas: CPU dan memory. Kubernetes melacak ini dengan dua angka berbeda:
kubectl describe node worker-1 | grep -A 6 "Capacity\|Allocatable"
Capacity:
cpu: 4 ← total CPU yang dimiliki node
memory: 8Gi ← total memory yang dimiliki node
Allocatable:
cpu: 3800m ← CPU yang bisa dipakai Pod (setelah dikurangi sistem)
memory: 7.5Gi ← memory yang bisa dipakai Pod (setelah dikurangi sistem)
Capacity adalah total resource fisik node. Allocatable adalah porsi yang tersedia untuk Pod — sedikit dikurangi untuk komponen sistem Kubernetes itu sendiri (kubelet, kube-proxy, dll).
Kubernetes scheduler hanya akan menempatkan Pod di node jika resource yang diminta Pod muat di dalam allocatable yang tersisa.
Node Selector dan Affinity #
Terkadang kamu perlu memastikan Pod tertentu berjalan di node dengan karakteristik tertentu — misalnya node dengan GPU, atau node di availability zone tertentu. Kubernetes menyediakan beberapa mekanisme untuk ini:
# Node selector sederhana — Pod hanya jalan di node berlabel "disktype=ssd"
spec:
nodeSelector:
disktype: ssd
# Node affinity — lebih ekspresif, bisa "preferred" atau "required"
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- amd64
Label pada node bisa ditambahkan secara manual:
# Tambahkan label ke node
kubectl label node worker-2 disktype=ssd
# Lihat semua label node
kubectl get nodes --show-labels
Cordon dan Drain #
Dua operasi penting saat kamu perlu melakukan maintenance pada sebuah node:
Cordon — menandai node sebagai tidak schedulable. Pod yang sudah berjalan di node tidak terpengaruh, tapi Pod baru tidak akan ditempatkan di sini.
# Tandai node tidak schedulable
kubectl cordon worker-2
# Status berubah menjadi:
# worker-2 Ready,SchedulingDisabled <none> 30d v1.28.0
Drain — mengosongkan node dengan memindahkan semua Pod ke node lain, lalu menandai node sebagai tidak schedulable. Digunakan sebelum mematikan node untuk maintenance atau upgrade.
# Pindahkan semua Pod dari node dan tandai tidak schedulable
kubectl drain worker-2 --ignore-daemonsets --delete-emptydir-data
# Setelah maintenance selesai, kembalikan node ke kondisi normal
kubectl uncordon worker-2
kubectl drain akan menghapus Pod dari node tersebut. Pastikan aplikasimu memiliki lebih dari satu replica sebelum melakukan drain, supaya tidak ada downtime selama proses pemindahan Pod berlangsung.Ringkasan #
- Dua jenis node — control plane node mengelola cluster, worker node menjalankan aplikasi; keduanya punya komponen yang berbeda.
- Tiga komponen di worker node — kubelet (agen utama), kube-proxy (networking), dan container runtime (menjalankan container).
- Kubernetes memantau kondisi node — status Ready/NotReady, memory pressure, disk pressure; Pod tidak dijadwalkan ke node yang bermasalah.
- Capacity vs Allocatable — scheduler menggunakan angka Allocatable, bukan Capacity, saat memutuskan di mana Pod bisa ditempatkan.
- Node Selector dan Affinity — mekanisme untuk memastikan Pod berjalan di node dengan karakteristik tertentu (GPU, SSD, availability zone).
- Cordon untuk isolasi, Drain untuk maintenance — cordon menghentikan scheduling baru, drain mengosongkan node sepenuhnya sebelum maintenance.