Materi ini adalah slide tambahan (“extra”) pada IF4031 Arsitektur Aplikasi Terdistribusi, membahas Kubernetes sebagai container orchestrator. Materi Docker/container/VM/serverless dasar sudah dibahas di catatan Computing Platform & Deployment — di sini container deployment hanya disinggung sebagai pengantar bahwa Kubernetes adalah lapisan orkestrasi di atas container runtime. Catatan ini paling relevan untuk capaian belajar terkait deployment & platform komputasi modern (VM, container, serverless, Kubernetes).

Motivasi: Kenapa Kubernetes?

Slide membuka dengan Goal yang ingin dicapai Kubernetes:

  • Velocity: software update bisa cepat masuk ke production, didukung oleh:
    • Immutability — komponen (container image) tidak diubah setelah dibuat, melainkan diganti dengan versi baru
    • Declarative configuration — state yang diinginkan dideklarasikan, bukan langkah-langkah imperatif
    • Online self-healing — sistem otomatis memulihkan diri saat terjadi kegagalan, tanpa downtime
  • Scaling — kemampuan menambah/mengurangi kapasitas, didukung oleh Decoupling (komponen aplikasi tidak saling terikat erat)
  • Abstracting Infrastructure — aplikasi tidak perlu tahu detail infrastruktur di baliknya
  • Efficiency — pemanfaatan resource yang lebih optimal

Tren yang mendasari kebutuhan ini adalah pergeseran ke container deployment:

  • Memudahkan pengaturan alokasi resource ke aplikasi/komponen aplikasi
  • Memudahkan pengelolaan banyak resources
  • Mendukung continuous development, integration, dan deployment

Perbandingan tiga era deployment (Traditional → Virtualized → Container) diperlihatkan pada diagram berikut: pada Traditional Deployment, semua App berjalan langsung di atas OS dan Hardware fisik tanpa isolasi; pada Virtualized Deployment, Hypervisor memungkinkan beberapa OS (VM) berjalan di satu hardware, masing-masing dengan App dan Bin/Library sendiri; pada Container Deployment, satu Container Runtime menjalankan banyak App yang masing-masing membawa Bin/Library sendiri tapi berbagi satu OS/kernel — jauh lebih ringan dibanding VM.

Peran Kubernetes

Kubernetes berperan sebagai orchestrator dengan cakupan tugas:

  • Orkestrasi: pengaturan alokasi storage, keterhubungan antar-modul
  • Service discovery & load balancing: pengaturan pemetaan service ke layanan, pengaturan trafik
  • Automated rollout dan rollback: update aplikasi dilakukan bertahap dan bisa dikembalikan (rollback) bila gagal
  • Konfigurasi & secret: pengaturan konfigurasi aplikasi (termasuk data sensitif)
  • Self healing: mendeteksi dan memperbaiki komponen yang gagal secara otomatis
  • Alokasi dan penjadwalan resource: menentukan container berjalan di node mana
  • Horizontal scaling: menambah/mengurangi jumlah replika sesuai kebutuhan beban

Prinsip Dasar Kubernetes

Dua prinsip fundamental yang mendasari cara kerja Kubernetes:

  • Deklaratif — pengguna mendeklarasikan desired state (state yang diinginkan), bukan menuliskan urutan perintah untuk mencapainya
  • Controller — komponen yang terus-menerus memantau (watch) state aktual dan berusaha menyamakannya dengan desired state (control loop)

Contoh alur kerja controller: aktor menjalankan kubectl scale rc my-app --replicas=5 (2), permintaan ini disimpan di etcd melalui API server. Controller terus mem-watch Replication-Controller (1), mendeteksi ada perubahan desired state, lalu memerintahkan API server untuk membuat Pod baru hingga jumlah replika sesuai (3). Alur ini adalah pola dasar reconciliation loop yang dipakai di hampir semua controller Kubernetes.

Kubernetes Object

Kubernetes object adalah persistent entities pada sistem Kubernetes yang merepresentasikan state dari cluster:

  • Aplikasi yang sedang berjalan
  • Resource yang tersedia
  • Policy yang mengatur perilaku aplikasi

Object merupakan record of intent — dengan membuat object, kita mendefinisikan desired state dari cluster. Object dibuat, diubah, dan dihapus melalui Kubernetes API (langsung via REST, atau via CLI seperti kubectl).

Hampir setiap object terdiri atas dua bagian:

  • spec — menyatakan desired state (apa yang diinginkan)
  • status — menyatakan current state (kondisi aktual saat ini, terus diperbarui oleh Kubernetes)

Saat membuat object, deskripsi diberikan ke API server dalam format JSON (atau YAML yang kemudian dikonversi ke JSON oleh kubectl).

Contoh manifest YAML untuk sebuah Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

Manifest ini mendeklarasikan: buatkan Deployment bernama nginx-deployment, jalankan 2 Pod yang cocok dengan label app: nginx, setiap Pod berisi 1 container nginx image versi 1.14.2 yang membuka port 80. Kubernetes (lewat controller & scheduler) yang akan mewujudkan desired state ini secara otomatis.

Konsep Dasar

  • Cluster: sekumpulan node yang menyediakan resource CPU, memory, storage, dan networking
  • Nodes: sebuah host, bisa berupa mesin fisik maupun virtual
  • Deployment: object untuk deklaratif update terhadap Pod dan ReplicaSet
  • Pod: unit kerja terkecil di Kubernetes; dapat terdiri atas 1 atau lebih container yang berbagi namespace (network, IPC) yang sama
  • ReplicaSet: mengelola stable set dari replika Pod (memastikan jumlah Pod yang berjalan sesuai target)

Anatomi Pod

Sebuah Pod membungkus satu atau lebih container dalam satu IPC Linux namespace dan satu Network namespace yang sama, sehingga semua container di dalamnya berbagi alamat IP dan bisa saling berkomunikasi lewat localhost. Contoh pada diagram: container nginx (aplikasi utama) dan container envoy (sidecar proxy) berjalan dalam CGroup dan PID terpisah, tetapi berada dalam Network namespace yang sama, dijembatani oleh Pause container (container “penahan” namespace jaringan Pod). Kubelet-lah yang mengelola siklus hidup Pod ini di level node.

Arsitektur Kubernetes

Sebuah Kubernetes cluster terdiri atas dua kelompok komponen besar: Control Plane (otak cluster) dan sekumpulan Node (tempat aplikasi benar-benar berjalan).

Pada diagram di atas terlihat bagaimana API server menjadi hub komunikasi: menerima perintah dari luar, disinkronkan ke etcd, dipantau oleh scheduler (sched) dan controller-manager (c-m), serta terhubung ke setiap Node yang menjalankan kubelet dan kube-proxy. Cloud controller manager (c-c-m) bersifat opsional dan hanya menyambungkan cluster ke Cloud provider API bila cluster berjalan di lingkungan cloud.

Control Plane

Control plane adalah layer orkestrasi yang menyediakan API dan interface untuk mendefinisikan serta mengelola siklus hidup container.

KomponenFungsi
kube-apiserverKomponen control plane yang menyediakan/mengekspose Kubernetes API; titik masuk semua request (dari kubectl, controller, kubelet, dll)
etcdKey-value store terdistribusi untuk menyimpan seluruh data/state cluster secara persisten
kube-schedulerMemonitor Pod yang belum punya alokasi node, lalu mengalokasikan (menjadwalkan) Pod tersebut ke node yang sesuai
kube-controller-managerMenjalankan semua proses controller: node controller, job controller, endpointslice controller, serviceaccount controller, dll
cloud-controller-manager (opsional)Mengelola logic yang spesifik terhadap cloud provider; hanya dipakai bila cluster berjalan di cloud

kube-controller-manager secara logic menjalankan beberapa controller terpisah, namun secara realitas berjalan sebagai satu proses tunggal:

  • Node controller — memonitor dan menangani node
  • Job controller — memonitor dan menangani job, serta membuat Pod untuk menjalankan job tersebut
  • Endpoints controller — mengisi object Endpoint (menggabungkan Service dan Pod)
  • Service account & token controllers — membuat default account dan API access untuk namespace yang baru dibuat

cloud-controller-manager menyambungkan Kubernetes cluster dengan cloud provider API, mencakup:

  • Node controller
  • Route controller — setup route pada infrastruktur cloud
  • Service controller — pengelolaan load balancer cloud

Node Component (Worker Node)

KomponenFungsi
kubeletAgent yang berjalan di setiap node; memastikan container benar-benar menjalankan Pod sesuai spesifikasi
kube-proxyNetwork proxy yang mengelola network rules pada node; mengimplementasikan sebagian dari Service object
container runtimePengelola container pada node, misal containerd, cri-o (implementasi apa pun yang mendukung Kubernetes CRI)

Node sendiri adalah sebuah server dengan komponen berikut terinstal: OS, systemd, kubelet, container runtime, kube-proxy, dan CNI provider (plugin jaringan). Sebuah node bergabung ke cluster dengan registrasi ke kube-apiserver, baik secara self register oleh kubelet maupun manual addition oleh admin.

Kubelet secara khusus:

  • Menjalankan control loop yang mengawasi Pod mana yang dijadwalkan pada node tersebut, memastikan pod itu benar-benar berjalan
  • Secara berkala memberi tahu API server bahwa kubelet pada node tersebut sehat (healthy)
  • Melakukan garbage collection untuk resource Pod yang sudah tidak dipakai, termasuk ephemeral storage dan network device
  • Memanfaatkan CNI (Container Network Interface) dan CRI (Container Runtime Interface)

Addons Cluster

Selain komponen inti, cluster Kubernetes umumnya dilengkapi addons:

  • Cluster DNS — menyediakan layanan DNS untuk cluster
  • Dashboard — web-based UI untuk mengelola cluster
  • Container Resource Monitoring
  • Cluster-level logging
  • Network plugins

Kubernetes API

API adalah antarmuka yang disediakan sistem untuk query dan manipulasi state object pada cluster (Pods, Namespace, ConfigMaps, Events, dll). API bisa diakses melalui:

  • CLI tool seperti kubectl, kubeadm
  • Client libraries
  • Langsung melalui REST API

Beberapa catatan penting soal API:

  • Discovery API menyediakan informasi tentang API Kubernetes: nama, resource, versi, dan operasi yang didukung
  • Saat ini (menurut slide) terdapat sekitar 70 API types
  • Spesifikasi API dapat diakses via OpenAPI melalui endpoint /openapi/v2
  • Kubernetes juga mendukung format serialisasi protobuf

Pengelompokan API

API Kubernetes dapat dikelompokkan menjadi:

  • API groups, misalnya autoscaling/v1, autoscaling/v2beta2
  • Resource category:
    • Workloads — object untuk manage dan menjalankan container
    • Discovery & load balancing — object untuk mengekspose workload ke luar dan load balancing
    • Config and storage — object untuk inisialisasi, konfigurasi, dan persist data
    • Cluster — object untuk mendefinisikan konfigurasi cluster
    • Metadata — object untuk mengkonfigurasi behaviour resource pada cluster

Versioning dilakukan pada level API (bukan pada resource atau field individual), dan API resource dibedakan berdasarkan kombinasi API group, resource type, namespace, dan nama.

Kubernetes API juga dapat diperluas (API extension) melalui dua mekanisme: Custom Resources (mendefinisikan jenis object baru) dan mengimplementasikan aggregation layer.

Objek-Objek Utama Kubernetes

Berikut daftar object per kategori sebagaimana pada slide, dilanjutkan tabel fungsi dan use case untuk objek-objek yang paling sering dipakai sehari-hari.

Workloads: Container, CronJob, ControllerRevision, DaemonSet, Deployment, HorizontalPodAutoscaler, Job, Pod, PodTemplate, PriorityClass, ReplicaSet, ReplicationController, StatefulSet

Discovery: Endpoints, EndpointSlice, Ingress, IngressClass, Service

Config and Storage: ConfigMap, CSIDriver, CSINode, CSIStorageCapacity, Secret, PersistentVolumeClaim, StorageClass, Volume, VolumeAttachment

Cluster: Namespace, Node, PersistentVolume, ResourceQuota, Role, RoleBinding, ClusterRole, ClusterRoleBinding, NetworkPolicy

ObjekFungsiContoh Use Case
PodUnit kerja terkecil; membungkus 1+ container yang berbagi network & IPC namespaceMenjalankan 1 instance aplikasi web beserta sidecar proxy-nya
DeploymentDeklaratif update untuk Pod & ReplicaSet; mengatur rollout/rollback versi aplikasiMengelola versi aplikasi stateless (web server) dengan kemampuan update tanpa downtime
ReplicaSetMenjaga jumlah replika Pod tetap sesuai target (dibuat otomatis oleh Deployment)Memastikan selalu ada 3 Pod backend API yang hidup
StatefulSetSeperti Deployment tapi untuk aplikasi stateful, menjaga identitas & urutan PodBasis data terdistribusi yang butuh identitas node tetap (mis. cluster database)
DaemonSetMemastikan 1 salinan Pod berjalan di setiap (atau sebagian) nodeAgent logging/monitoring yang harus ada di semua node
Job / CronJobMenjalankan Pod hingga tugas selesai (Job), atau terjadwal berkala (CronJob)Job batch processing sekali jalan, atau backup terjadwal tiap malam
HorizontalPodAutoscalerMenyesuaikan jumlah replika Pod secara otomatis berdasarkan metrik (mis. CPU)Menambah replika Pod saat beban trafik naik, mengurangi saat sepi
ServiceMengekspose sekelompok Pod sebagai satu titik akses stabil, sekaligus load balancingMenyediakan satu alamat/DNS tetap untuk backend yang Pod-nya berganti-ganti IP
IngressMengatur akses HTTP/HTTPS dari luar cluster ke Service di dalamnya (routing berbasis host/path)Mengarahkan api.contoh.com dan web.contoh.com ke Service yang berbeda dalam satu cluster
NamespaceMenyediakan scope/isolasi nama untuk resource dalam satu clusterMemisahkan environment dev, staging, production dalam satu cluster
ConfigMapMenyimpan data konfigurasi non-rahasia dan menyuntikkannya ke PodMenyimpan konfigurasi environment variable atau file config aplikasi
SecretMenyimpan data sensitif (password, token, key) untuk dipakai PodMenyimpan kredensial database yang dipakai backend
PersistentVolume / PersistentVolumeClaimMenyediakan & meminta storage yang persisten, lepas dari siklus hidup PodMenyimpan data database agar tidak hilang saat Pod di-restart

Persistence

State seluruh cluster (semua object, konfigurasi, status) disimpan secara persisten oleh etcd — inilah “sumber kebenaran” (source of truth) yang dirujuk oleh API server, scheduler, dan seluruh controller.

Manajemen Object

Kubernetes object dapat dikelola dengan 3 cara:

  1. Imperative command — perintah langsung, misal kubectl scale …
  2. Imperative object configuration — mengacu ke file manifest tapi dieksekusi secara imperatif, misal kubectl create -f nginx.yaml
  3. Declarative object configuration — mendeklarasikan desired state dari kumpulan file dan membiarkan Kubernetes menyamakan state, misal kubectl apply -f configs/

Pendekatan declarative inilah yang selaras dengan prinsip dasar Kubernetes (deklaratif + controller reconciliation) dan menjadi cara yang direkomendasikan untuk pengelolaan production.

Identitas, Namespace, dan Metadata Object

  • Object name & ID: setiap object memiliki Name yang unik untuk jenis resource tersebut, dan UID yang unik dalam satu cluster.
  • Namespace: menyediakan scope untuk name (namespace tidak bisa nested). Tidak semua object berada dalam namespace — misalnya Node dan PersistentVolume bersifat cluster-wide, tidak terikat namespace. Sejak v1.21, label kubernetes.io/metadata.name otomatis berisi nama namespace tersebut.
  • Namespace & DNS: saat sebuah Service dibuat, Kubernetes otomatis membuat entri DNS berformat <service-name>.<namespace-name>.svc.cluster.local. Entri ini akan resolve ke Service yang berada di namespace yang sama; untuk mengakses Service lintas namespace, klien harus menggunakan FQDN lengkap tersebut.
  • Label & Selector: label adalah pasangan key-value yang ditempel ke object, berguna untuk mencari/menampilkan/menyeleksi object atau resource yang diinginkan (misalnya Selector pada Deployment/Service menentukan Pod mana yang menjadi target).
  • Annotation: metadata tambahan pada object (di luar label) yang biasanya dipakai untuk menyimpan informasi non-identifikasi seperti deskripsi, informasi tooling, atau konfigurasi addon — slide memberikannya sebagai pertanyaan diskusi kelas (“kapan annotation digunakan?”) tanpa elaborasi lebih lanjut.
  • Field Selector: digunakan untuk mencari resource berdasarkan nilai field tertentu (bukan label), misalnya mencari Pod berdasarkan field status.phase.
  • Finalizers: keys yang memberi tahu Kubernetes untuk menunggu kondisi tertentu terpenuhi sebelum sebuah resource benar-benar dihapus; dipakai untuk mengendalikan proses garbage collection resource secara terkontrol.

Referensi Slide

  • Vyas, Jay, and Chris Love. Core Kubernetes. Simon and Schuster, 2022.
  • Ibryam, Bilgin, and Roland Huß. Kubernetes Patterns. O’Reilly Media, Inc., 2022.
  • Miriyala Kannaiah, Govardhana. Kubernetes Anti-Patterns: Overcome common pitfalls to achieve optimal deployments and a flawless Kubernetes ecosystem. 2024.

Flashcard

flashcards Apa fungsi utama Kubernetes sebagai orchestrator container? :: Mengatur orkestrasi (storage & konektivitas antar-modul), service discovery & load balancing, automated rollout/rollback, konfigurasi & secret, self healing, alokasi/penjadwalan resource, dan horizontal scaling. Apa dua prinsip dasar yang membuat Kubernetes bekerja secara self-healing? :: Deklaratif (mendefinisikan desired state) dan Controller (control loop yang terus menyamakan current state dengan desired state di etcd/API server). Apa itu Pod dan mengapa ia disebut unit kerja terkecil di Kubernetes? :: Pod adalah unit kerja terkecil yang dapat berisi 1 atau lebih container yang berbagi network namespace & IPC namespace yang sama (jadi bisa saling komunikasi lewat localhost). Apa perbedaan spec dan status pada Kubernetes object? :: spec menyatakan desired state (apa yang diinginkan pengguna), sedangkan status menyatakan current state (kondisi aktual yang terus diperbarui Kubernetes). Sebutkan 5 komponen utama Control Plane Kubernetes. :: kube-apiserver, etcd, kube-scheduler, kube-controller-manager, dan cloud-controller-manager (opsional, khusus cluster di cloud). Apa fungsi kubelet dan kube-proxy pada Worker Node? :: kubelet adalah agent yang memastikan container di node benar-benar menjalankan Pod sesuai spesifikasi; kube-proxy adalah network proxy yang mengelola network rules dan mengimplementasikan sebagian dari Service object. Apa perbedaan Deployment dan ReplicaSet? :: Deployment mengatur deklaratif update (termasuk rollout/rollback versi) terhadap Pod dan ReplicaSet, sedangkan ReplicaSet hanya menjaga agar jumlah replika Pod tetap sesuai target — ReplicaSet biasanya dibuat otomatis oleh Deployment. Apa 3 cara mengelola Kubernetes object? :: Imperative command (mis. kubectl scale), Imperative object configuration (kubectl create -f file.yaml), dan Declarative object configuration (kubectl apply -f folder/). Apa yang menyimpan seluruh state cluster Kubernetes secara persisten? :: etcd, sebuah key-value store terdistribusi yang menjadi sumber kebenaran (source of truth) bagi API server, scheduler, dan semua controller.