Knative #
Dalam ekosistem orkestrasi kontainer modern, Google Kubernetes Engine (GKE) atau Kubernetes self-hosted telah menjadi standar de facto untuk menjalankan aplikasi mikro (microservices) dalam skala besar. Namun, mengoperasikan Kubernetes menuntut pemahaman teknis yang sangat kompleks bagi tim pengembang. Developer dipaksa menulis ratusan baris manifest YAML untuk mendefinisikan Pods, Deployments, Services, Ingress, Horizontal Pod Autoscalers (HPA), serta melakukan perencanaan kapasitas VM (capacity planning) secara manual. Overhead operasional ini sering kali memperlambat kecepatan rilis produk.
Knative hadir sebagai proyek open-source terkemuka yang melapiskan paradigma komputasi serverless secara langsung di atas Kubernetes. Dikembangkan pertama kali oleh Google bersama dengan IBM, Red Hat, dan VMware, Knative bertindak sebagai jembatan abstraksi tingkat tinggi. Knative membebaskan tim pengembang dari kerumitan manajemen objek Kubernetes dasar dengan menawarkan kemampuan autoscaling dari nol (scale-to-zero), manajemen revisi kontainer otomatis, serta orkestrasian event secara native. Dengan Knative, organisasi mendapatkan kebebasan runtime kontainer penuh tanpa vendor lock-in, dipadukan dengan kemudahan penggunaan ala serverless AWS Lambda.
Knative Serving: Manajemen Aplikasi dan Siklus Hidup Request #
Komponen pertama dari arsitektur Knative adalah Knative Serving. Serving bertanggung jawab mengelola penempatan kontainer, penanganan request HTTP, siklus hidup revisi, serta penskalaan otomatis dari beban kerja (workloads) berbasis HTTP.
Knative Serving menyederhanakan konfigurasi deployment dengan mendefinisikan empat objek model data kustom (Custom Resource Definitions/CRD) yang saling terhubung:
1. Service (service.serving.knative.dev)
#
Abstraksi tertinggi di Knative Serving yang bertindak sebagai pintu masuk tunggal aplikasi. Layanan Service ini secara otomatis mengendalikan dan memprovisikan objek Configuration dan Route di bawahnya. Ketika kita mendeploy Service baru, Knative akan langsung membuat subdomain URL HTTPS privat untuk layanan tersebut.
2. Configuration (configuration.serving.knative.dev)
#
Configuration mendefinisikan desired state dari aplikasi kita, mirip dengan Deployment pada Kubernetes tradisional. Di dalam Configuration, kita menuliskan container image yang akan digunakan, environment variables, spesifikasi hardware limit (CPU/RAM), serta batasan minimal dan maksimal autoscaling.
3. Revision (revision.serving.knative.dev)
#
Setiap kali kita mengubah isi file Configuration (misalnya mengganti versi image kontainer atau mengubah nilai variabel lingkungan), Knative secara otomatis membuat sebuah Revision baru. Revision bersifat immutable (tidak dapat diubah setelah dibuat) dan bertindak sebagai snapshot historis. Jika versi baru aplikasi mengalami kendala di produksi, kita dapat melakukan rollback instan dengan mengarahkan traffic kembali ke Revision lama yang stabil.
4. Route (route.serving.knative.dev)
#
Route bertindak sebagai traffic controller di tingkat load balancer (seperti Istio, Contour, atau Kourier). Route mengarahkan request masuk ke satu atau beberapa Revision aktif berdasarkan persentase bobot yang ditentukan. Hal ini sangat berguna untuk menerapkan strategi rilis modern seperti Blue-Green Deployment atau Canary Release (misalnya mengarahkan 90% traffic ke Revision lama dan 10% traffic ke Revision baru untuk pengujian aman).
Mekanisme Autoscaling KPA dan Peran Activator #
Mekanisme autoscaling pada Knative berbeda secara fundamental dengan penskalaan Kubernetes tradisional yang mengandalkan Horizontal Pod Autoscaler (HPA).
1. Knative Pod Autoscaler (KPA) vs. HPA #
Kubernetes HPA mengukur penggunaan metrik hardware sistem seperti utilisasi CPU atau memori untuk menentukan kapan harus menambah Pod. Opsi ini lambat bereaksi terhadap lonjakan request mendadak karena peningkatan beban CPU membutuhkan waktu jeda. KPA memecahkan masalah ini dengan mengukur metrik konkurensi request aktif secara real-time.
- Metrik Concurrency: KPA menghitung jumlah request HTTP aktif yang sedang diproses di dalam kontainer. Jika kita menetapkan batas target konkurensi sebesar 10 request per Pod, dan terdeteksi ada 100 request masuk bersamaan, KPA akan langsung memicu startup 10 Pod paralel dalam hitungan detik. KPA juga mendukung penskalaan ke nol (scale-to-zero) saat tidak ada lalu lintas kueri aktif.
2. Peran Krusial Komponen Activator #
Bagaimana request pertama dari pengguna diproses ketika jumlah Pod aktif bernilai nol? Di sinilah komponen Activator berperan:
flowchart TD
Request["Incoming HTTP Request"] --> Ingress["Knative Ingress Gateway (e.g. Istio, Kourier)"]
Ingress --> Router{"Active Pods > 0?"}
Router -- "Yes" --> Pod["Active Pod (Application Container)"]
Router -- "No" --> Activator["Knative Activator (Hold request & trigger KPA)"]
Activator --> KPA["Knative Pod Autoscaler (KPA)"]
KPA -->|"Spin up new Pods"| Pod
Activator -->|"Forward Request"| Pod
style Activator stroke:#0288d1,stroke-width:2px
style KPA stroke:#0288d1,stroke-width:2px
- Menahan Request (Buffering): Ketika status Pod adalah nol, Ingress Gateway akan merutekan request masuk ke node Activator. Activator akan menahan (buffer) request tersebut di memorinya sementara.
- Memicu KPA: Activator melaporkan lonjakan beban ke KPA, memerintahkan KPA untuk segera menyalakan minimal 1 Pod baru.
- Penyaluran Pesan (Forwarding): Activator memantau status kesiapan Pod baru (readiness check). Begitu Pod baru bangkit dan siap menerima request, Activator mengalirkan kembali request yang ditahannya ke Pod tersebut. Proses kebangkitan ini adalah sumber latensi cold start pertama, namun menjamin tidak ada request pengguna yang gagal atau ditolak.
Knative Eventing: Dekopling Asinkron Berbasis Event #
Selain memproses request HTTP sinkron, Knative menyediakan komponen Knative Eventing untuk membangun arsitektur event-driven yang tangguh lintas layanan kontainer.
Knative Eventing memisahkan produsen event dengan konsumen event menggunakan standar CloudEvents CNCF, memperkenalkan beberapa komponen perantara:
1. Event Sources (Sumber Event) #
Event Sources mendeteksi peristiwa di sistem luar (seperti file baru di Google Cloud Storage, pesan di Apache Kafka, atau push commit di GitHub), mengubah data peristiwa asli menjadi format standar CloudEvents, dan meneruskannya ke Broker atau Service target.
2. Brokers dan Triggers #
- Broker: Bertindak sebagai pusat lalu lintas event (event hub) terpusat. Broker menerima semua event masuk, melacak status pengantaran, dan mengelola persistence log event.
- Trigger: Bertindak sebagai penyaring (filter) event. Kita membuat objek Trigger yang mendefinisikan kriteria filter (misal: hanya mencari event dengan tipe
dev.github.push) dan mengarahkan event yang lolos filter ke target Sink (seperti layanan Knative Serving) secara otomatis.
Implementasi Kode: Manifest YAML Knative Service #
Berikut adalah contoh lengkap file manifest Kubernetes kustom (service.yaml) untuk mendeploy layanan backend mikro menggunakan spesifikasi Knative Serving, lengkap dengan anotasi tuning autoscaling KPA dan resource limit.
# ✓ BENAR: Menggunakan apiVersion serving resmi Knative
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: billing-api-service
namespace: serverless-apps
labels:
environment: production
team: billing-devs
spec:
template:
metadata:
annotations:
# Menentukan kelas autoscaler yang digunakan (KPA)
"autoscaling.knative.dev/class": "kpa.autoscaling.knative.dev"
# ✓ BENAR: Mengaktifkan scale-to-zero (minScale = 0)
"autoscaling.knative.dev/min-scale": "0"
# Membatasi batas atas penskalaan Pod untuk mengendalikan biaya infra
"autoscaling.knative.dev/max-scale": "15"
# Menetapkan target konkurensi optimal per Pod
"autoscaling.knative.dev/target": "20"
# Batas waktu inaktivitas sebelum Pod dimatikan (30 detik)
"autoscaling.knative.dev/scale-to-zero-pod-retention-period": "30s"
spec:
containerConcurrency: 50 # Batas maksimal konkurensi fisik yang diizinkan kontainer
containers:
- image: gcr.io/my-gcp-project/billing-service:v2.1.0
ports:
- containerPort: 8080 # Port HTTP aplikasi kita mendengarkan request
resources:
limits:
cpu: "1000m" # Batas maksimal 1 CPU Core
memory: "1024Mi" # Batas maksimal 1 GB RAM
requests:
cpu: "200m"
memory: "256Mi"
env:
- name: APP_ENV
value: "production"
- name: LOG_LEVEL
value: "info"
Perbandingan: Knative vs. Kubernetes Vanilla vs. AWS Lambda #
Tabel berikut merangkum perbedaan arsitektur Knative dengan Kubernetes standar dan layanan FaaS proprietary seperti AWS Lambda.
| Parameter Evaluasi | Knative Serving | Kubernetes Vanilla | AWS Lambda (FaaS) |
|---|---|---|---|
| Unit Eksekusi Utama | Kontainer OCI (Docker Image) | Pod / Deployment | Fungsi Tunggal (Code Snippet) |
| Kecepatan Startup | Cepat (Detik, cold start ada) | Lambat (Menit, VM provisioning) | Sangat Cepat (Milidetik) |
| Metrik Penskalaan | Konkurensi Request HTTP | CPU / RAM / Kustom Metrik | 1:1 Request-Instance Model |
| Scale-To-Zero | Ya (Didukung native) | Tidak (Minimal 1 replica HPA) | Ya |
| Vendor Lock-in | Nol (Dapat dideploy di cloud mana pun) | Nol | Sangat Tinggi (Terkunci ekosistem AWS) |
| Operational Overhead | Menengah (Perlu instalasi kluster K8s) | Sangat Tinggi (Manajemen manual) | Sangat Rendah (Zero Infrastructure) |
Best Practice Mengelola Platform Knative di Produksi #
Menjalankan beban kerja serverless di atas Kubernetes menggunakan Knative membutuhkan penerapan praktik terbaik untuk menjamin kestabilan dan performa:
1. Kelola Latensi Cold Start pada Endpoint Sensitif #
Jika endpoint backend aplikasi kita diakses langsung oleh pengguna frontend dan memiliki SLA latensi di bawah 200ms, membiarkan Pod mati hingga nol (scale-to-zero) adalah langkah yang berisiko karena request pertama akan tertahan di Activator selama proses booting Pod baru.
- BENAR: Setel anotasi
"autoscaling.knative.dev/min-scale": "1"khusus untuk layanan yang memerlukan latensi rendah secara instan. Gunakanmin-scale: 0hanya untuk worker asinkron, webhook handler, atau lingkungan development.
2. Optimalkan Ukuran Container Image #
Kecepatan startup Pod saat terjadi cold start sangat bergantung pada waktu pengunduhan container image dari registry ke node fisik Kubernetes.
- BENAR: Gunakan Dockerfile multi-stage build dan pasang binary aplikasi pada image dasar yang sangat minimal seperti
alpineataudistroless. Hindari menaruh dependensi pengembangan (dev dependencies) atau compiler di dalam runtime image akhir.
3. Konfigurasikan Dead Letter Sink pada Eventing #
Dalam arsitektur event-driven, kegagalan transmisi event dapat menyebabkan kehilangan data transaksi penting jika target konsumen mengalami crash.
- BENAR: Selalu konfigurasikan objek Dead Letter Sink pada manifest Broker atau Trigger Eventing kita. Jika Eventarc/Knative gagal mengirimkan CloudEvent setelah batas maksimal retry, event tersebut akan diselamatkan ke sink khusus (seperti Pub/Sub topic atau database log) untuk analisis forensik error.
Ringkasan #
- Knative adalah platform open-source serverless yang menyajikan kemudahan operasional FaaS langsung di atas kluster Kubernetes.
- Knative Serving mengelola siklus hidup HTTP menggunakan objek Service, Configuration, Revision, dan Route yang terstruktur.
- Knative Pod Autoscaler (KPA) memantau konkurensi request aktif untuk penskalaan instan, mendukung auto-scaling ke nol.
- Activator menahan request pertama secara aman saat Pod bernilai nol sambil memicu KPA menyalakan Pod baru guna mencegah request drop.
- Knative Eventing memfasilitasi integrasi asinkron decoupled menggunakan standar CloudEvents, Broker, dan Trigger.
- Gunakan min-scale: 1 di branch produksi utama pada endpoint latensi sensitif untuk mengeliminasi dampak latensi cold start bagi pengguna.