Episode 15 melampaui CRD bawaan: kapan memakai EnvoyFilter dengan aman, membangun filter Proxy-WASM untuk logika kustom, cara mendaftarkannya lewat extension provider dan Telemetry API, serta contoh header enricher dan telemetry exporter.

Istio sudah punya banyak CRD, tetapi dunia nyata selalu punya kebutuhan khusus: menambah header khusus, memanggil service otorisasi kustom, atau mengekspor metrik bisnis. Episode 15 ini membahas dua cara memperluas mesh: EnvoyFilter untuk patch langsung dan Proxy-WASM untuk filter kustom yang dijalankan di sandbox.
Pesan utama episode ini: dengan kekuatan besar datang tanggung jawab besar. Kedua alat ini harus dipakai dengan disiplin.
EnvoyFilter adalah patch langsung ke konfigurasi Envoy. Pertimbangkan memakainya hanya jika semua opsi berikut gagal:
EnvoyFilter rawan rusak saat upgrade Envoy karena nama filter, struktur config, dan API berubah antar versi. Aturan pengamanannya:
istio-system agar terlihat sebagai konfigurasi mesh.match yang se-spesifik mungkin.istioctl proxy-config listener productpage-abc123
istioctl proxy-config cluster productpage-abc123istioctl proxy-config listener memperlihatkan struktur listener nyata. Kembangkan EnvoyFilter dari struktur ini, bukan dari ingatan.
Filter Envoy asli harus ditulis dalam C++ dan dikompilasi ke binary Envoy itu sendiri — tidak praktis. Proxy-WASM (WASM) memungkinkan filter ditulis dalam bahasa lain (Rust, Go, C++, AssemblyScript), dikompilasi ke WebAssembly, dan dimuat oleh Envoy saat runtime di dalam sandbox yang aman. Istio mendukungnya lewat API WasmPlugin.
Contoh paling sederhana: filter Rust yang menambah header pada request. Setelah dikompilasi menjadi filter.wasm, daftarkan:
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
name: header-enricher
namespace: istio-system
spec:
selector:
matchLabels:
app: productpage
url: oci://registry.example.com/mesh/header-enricher:v1
phase: AUTHN
pluginConfig:
headerName: x-tenant
headerValue: tenant-aWasmPlugin mendaftarkan modul WASM dan menerapkannya pada workload yang cocok dengan selector. url: oci:// memuat modul dari registry OCI — pola yang direkomendasikan karena bisa di-versioning seperti image.
Selain WasmPlugin, ekstensi bisa dipasang lewat Telemetry API dengan metrics kustom:
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: custom-metrics
namespace: istio-system
spec:
metrics:
- providers:
- name: prometheus
overrides:
- match:
metric: REQUEST_COUNT
tagOverrides:
tenant:
value: "istio_attributize(request.headers['x-tenant'])"tagOverrides menambah dimensi tenant ke metrik request count dari header. Hasilnya: kalian bisa mengukur traffic per tenant langsung di Prometheus — contoh praktis telemetry exporter tanpa menulis filter baru.
Saat modul WASM banyak, daftarkan provider lewat MeshConfig extensionProviders agar bisa dipakai secara konsisten:
spec:
meshConfig:
extensionProviders:
- name: tenant-ext
wasm:
url: oci://registry.example.com/mesh/tenant-ext:v1
imagePullPolicy: IfNotPresentProvider ini lalu bisa direferensikan dari beberapa WasmPlugin. Kelola versi di sini, bukan di masing-masing plugin — lebih mudah di-upgrade dan diaudit.
Warning
WASM tetap harus diuji terhadap versi Envoy yang dipakai Istio. Modul yang dikompilasi untuk ABI proxy-wasm yang berbeda bisa gagal dimuat secara diam-diam. Periksa log istio-proxy saat first load.
Episode 15 membuka pintu ekstensibilitas: memakai EnvoyFilter dengan kriteria dan pengamanan yang ketat, membangun filter Proxy-WASM yang di-sandbox dan di-versioning via OCI, serta mengintegrasikannya lewat WasmPlugin, extension providers, dan Telemetry API.
Inti yang harus dibawa pulang:
proxy-config, bukan dari ingatan.oci:// URL memungkinkan versioning modul seperti image.Di episode 16 selanjutnya kita akan menyatukan banyak cluster: multi-cluster dan mesh federation — topologi primary-remote dan replicated control plane, east-west gateway, ekspor service lintas cluster, serta pembentukan trust domain antar mesh.