Saatnya menulis konfigurasi pertama. Episode ini membahas cara mengunduh Envoy via Docker, menyusun konfigurasi minimum untuk HTTP proxying sederhana, menjalankannya, dan memverifikasi traffic melewati Envoy.

Episode 3 adalah momen "hello world" kalian dengan Envoy. Setelah memahami arsitektur di episode 2, sekarang kita menulis konfigurasi nyata: mengunduh image Envoy, menyusun bootstrap minimal untuk mem-proxy HTTP, menjalankannya, dan membuktikan bahwa traffic benar-benar melewati Envoy.
Kalian akan melihat pola yang akan diulang terus sepanjang series: listener di port 10000, HTTP connection manager sebagai filter, satu virtual host, dan satu cluster backend. Konfigurasi ini memang sengaja dibuat sesederhana mungkin — variabel dan fitur tambahan akan ditambahkan di episode 4 sampai 8.
Cara paling praktis adalah memakai image resmi dari Docker Hub:
docker pull envoyproxy/envoy:v1.31.0Ada beberapa varian yang perlu kalian kenal:
envoyproxy/envoy:latest — rilis terbaru, nyaman untuk lab tapi berubah cepat.envoyproxy/envoy:v1.31.0 — versi spesifik, stabil untuk dipakai berulang.envoyproxy/envoy:distroless — varian minimal tanpa shell, untuk production.Untuk series ini kita konsisten memakai envoyproxy/envoy:v1.31.0 agar output di semua episode bisa direproduksi.
Image default berisi config bawaan yang menjalankan admin dan listener sederhana. Untuk memakai config sendiri, kita mount file YAML:
docker run -d --name envoy-hello \
-v ~/envoy-lab/configs:/etc/envoy \
-p 10000:10000 -p 9901:9901 \
envoyproxy/envoy:v1.31.0Direktori ~/envoy-lab/configs akan kita isi dengan file hello.yaml. Perintah docker run ini memasukkan direktori config ke dalam kontainer dan mengekspos port 10000 serta 9901.
Buat file configs/hello.yaml dengan isi berikut:
admin:
address:
socket_address:
address: 0.0.0.0
port_value: 9901
static_resources:
listeners:
- name: listener_0
address:
socket_address:
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains:
- "*"
routes:
- match:
prefix: "/"
route:
cluster: service_backend
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
clusters:
- name: service_backend
connect_timeout: 0.25s
type: STRICT_DNS
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: service_backend
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 10.0.0.1
port_value: 8080Mari bedah bagian pentingnya: filter_chains berisi satu filter http_connection_manager yang membungkus route_config dan daftar http_filters. Route memetakan semua prefix / ke cluster service_backend yang berisi satu endpoint di 10.0.0.1:8080.
Karena 10.0.0.1:8080 belum tentu ada, jalankan backend dummy dulu agar hello world ini lengkap:
python3 -m http.server 8080 &
curl -s http://localhost:8080/Perintah python3 -m http.server 8080 menjalankan server file statis di port 8080 — cukup sebagai target untuk melihat apakah Envoy meneruskan request dengan benar.
Sekarang arahkan curl ke port Envoy, bukan langsung ke backend:
curl -s -H "Host: localhost" http://localhost:10000/Perhatikan perbedaan: port 10000 adalah listener Envoy, sedangkan port 8080 adalah backend. Jika Envoy bekerja, kalian akan melihat direktori listing yang sama seperti saat memanggil backend langsung. Header Host dipakai untuk memilih virtual host.
Untuk bukti lebih kuat bahwa traffic melewati Envoy, lihat counter di admin interface:
curl -s localhost:9901/stats | grep "http.ingress_http"
curl -s localhost:9901/clustersOutput stats akan menunjukkan ingress_http request yang bertambah, dan clusters menampilkan status endpoint. Statistik ingress_http ini adalah bahasa observability Envoy yang akan kalian baca terus sampai episode 21.
Sebelum produksi, biasakan memvalidasi YAML terlebih dahulu:
docker run --rm -v ~/envoy-lab/configs:/etc/envoy \
envoyproxy/envoy:v1.31.0 envoy --mode validate -c /etc/envoy/hello.yamlPerintah envoy --mode validate -c hello.yaml memeriksa config tanpa memulai proxy. Output OK berarti YAML valid dan semua resource dikenal Envoy. Kebiasaan ini akan sangat menolong di episode 20 saat kita integrasikan ke CI/CD.
Error paling umum di episode ini adalah koneksi gagal karena backend tidak ada. Pastikan python3 -m http.server 8080 benar-benar berjalan, lalu cek:
curl -v -H "Host: localhost" http://localhost:10000/Bagian curl -v menampilkan detail handshake dan response code. Jika muncul 502, periksa log Envoy dengan docker logs envoy-hello dan pastikan alamat backend di config sudah benar.
Indentasi yang salah menghasilkan error saat startup. Gunakan penanda YAML dan perhatikan dua spasi per level. Jika Envoy menolak config, jalankan envoy --mode validate untuk menemukan baris bermasalah.
Episode 3 membawa kalian dari nol ke proxy yang berfungsi: menarik image, menulis bootstrap minimal, menjalankan backend uji, dan membuktikan traffic melewati Envoy lewat statistik admin.
Inti yang harus dibawa pulang:
envoyproxy/envoy:v1.31.0 cukup untuk seluruh series.http_connection_manager mengubah TCP menjadi request HTTP yang bisa di-route.envoy --mode validate sebelum produksi.python3 -m http.server adalah backend uji praktis untuk belajar.Di episode 4 selanjutnya kita akan membahas listener, filter chain, dan route configuration — virtual hosts, path matching, header manipulation, redirect, dan rewrite, sehingga routing kalian tidak lagi sekadar meneruskan semua prefix ke satu cluster.