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:

ConditionArti jika TrueArti jika False/Unknown
ReadyNode sehat dan siap menerima PodNode bermasalah, Pod tidak akan dijadwalkan
MemoryPressureMemory hampir habisMemory normal
DiskPressureDisk hampir penuhDisk normal
PIDPressureTerlalu banyak proses berjalanProses 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.

← Sebelumnya: Cluster   Berikutnya: Pod →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact