Belajar Envoy Proxy - Envoy Filter Chain Lanjutan
Episode 8 of 23

Belajar Envoy Proxy - Envoy Filter Chain Lanjutan

Episode ini memperdalam filter chain Envoy: filter HTTP seperti ext_authz dan gRPC JSON transcoder, filter TCP seperti tcp_proxy passthrough, serta cara menyusun urutan filter dan melakukan matching yang benar.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Di episode 4 dan 7, kalian sudah memasang filter HTTP router dan http_connection_manager. Episode 8 menunjukkan bahwa itu baru permukaan: filter chain lanjutan adalah kemampuan Envoy menyusun pipeline filter HTTP maupun TCP untuk mengubah cara request diproses di setiap tahap.

Kalian akan berkenalan dengan ext_authz untuk autentikasi eksternal, gRPC JSON transcoder yang mengubah REST menjadi gRPC, dan tcp_proxy untuk meneruskan traffic TCP mentah. Yang lebih penting, kalian akan paham urutan filter — karena urutan menentukan perilaku.

Filter HTTP dan Pipeline-nya

Router: Filter Terakhir

Semua filter HTTP memproses request di dalam pipeline yang diakhiri router:

Pipeline HTTP dengan tiga filter
http_filters:
  - name: envoy.filters.http.cors
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.cors.v3.Cors
  - name: envoy.filters.http.ext_authz
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz
      transport_api_version: V3
      grpc_service:
        envoy_grpc:
          cluster_name: auth_service
      with_request_body:
        max_request_bytes: 8192
  - name: envoy.filters.http.router
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

Pipeline http_filters memproses request secara berurutan: CORS menambahkan header, ext_authz menanyakan layanan otentikasi, dan router terakhir meneruskan request ke cluster. Filter yang mengubah request harus dipasang sebelum filter yang mengonsumsinya.

ext_authz: Autentikasi Eksternal

ext_authz mendelegasikan keputusan otorisasi ke layanan eksternal lewat gRPC. Envoy mengirim metadata request, dan layanan menjawab allow atau deny. Detail konfigurasi akan kita perdalam di episode 14, tapi intinya: filter ini tidak memutuskan sendiri, dia bertanya ke service lain.

gRPC JSON Transcoder

grpc_json_transcoder mengubah request REST JSON menjadi panggilan gRPC — dan sebaliknya. Ini memungkinkan klien REST memakai backend gRPC tanpa perubahan apa pun:

Transcoder REST ke gRPC
http_filters:
  - name: envoy.filters.http.grpc_json_transcoder
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder
      proto_descriptor: /etc/envoy/api_descriptor.pb
      services:
        - orders.v1.OrdersService
      print_options:
        always_print_primitive_fields: true
  - name: envoy.filters.http.router
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

Konfigurasi grpc_json_transcoder memakai descriptor protobuf untuk memetakan endpoint REST ke metode gRPC. Dengan print_options yang diatur, respons JSON selalu berisi field bernilai nol.

Filter TCP dan Passthrough

tcp_proxy untuk Traffic Mentah

Tidak semua traffic adalah HTTP. Untuk database, Redis, atau protokol binary, pakai filter TCP:

Listener TCP dengan tcp_proxy
listeners:
  - name: listener_tcp
    address:
      socket_address:
        address: 0.0.0.0
        port_value: 13000
    filter_chains:
      - filters:
          - name: envoy.filters.network.tcp_proxy
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
              stat_prefix: mysql_tcp
              cluster: mysql_cluster

Filter tcp_proxy meneruskan koneksi TCP mentah ke cluster tanpa mem-parsing protokol. Ini disebut passthrough: byte masuk diteruskan apa adanya, cocok untuk protokol yang tidak dipahami Envoy. Gunakan HTTP filter jika butuh routing berbasis path, dan TCP filter jika traffic berupa protokol binary.

Filter Matching dan Urutan Filter

Filter Chain Match

Satu listener bisa punya beberapa filter chain yang dipilih berdasarkan karakteristik koneksi:

Dua filter chain dengan match
listeners:
  - name: listener_multi
    address:
      socket_address:
        address: 0.0.0.0
        port_value: 10000
    filter_chains:
      - filter_chain_match:
          server_names:
            - api.example.com
        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: api_http
              route_config:
                name: api_routes
                virtual_hosts: []
              http_filters:
                - name: envoy.filters.http.router
                  typed_config:
                    "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
      - filter_chain_match:
          server_names:
            - db.internal
        filters:
          - name: envoy.filters.network.tcp_proxy
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
              stat_prefix: db_tcp
              cluster: db_cluster

Mekanisme filter_chain_match memilih chain berdasarkan field seperti server_names (SNI TLS). Koneksi ke api.example.com diproses sebagai HTTP, sedangkan koneksi ke db.internal diteruskan sebagai TCP mentah.

Aturan Urutan yang Benar

Beberapa prinsip urutan filter yang harus kalian pegang:

  • Filter yang memodifikasi request dipasang lebih awal.
  • Filter yang membaca hasil pemrosesan sebelumnya dipasang setelahnya.
  • router selalu terakhir untuk HTTP.
  • Semakin banyak filter, semakin besar overhead tiap request.
Melihat filter yang aktif
curl -s localhost:9901/config_dump | grep -o '"name": "envoy.filters[^"]*"' | sort -u

Perintah curl localhost:9901/config_dump menampilkan semua filter yang dimuat. Grep envoy.filters di atas menyaring nama-nama filter unik — cara cepat memverifikasi pipeline yang sedang aktif.

Membangun Pipeline Sendiri

Contoh Pipeline Lengkap

Untuk menutup episode ini, berikut pipeline yang menggabungkan CORS, autentikasi, dan routing:

Pipeline HTTP lengkap
http_filters:
  - name: envoy.filters.http.cors
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.cors.v3.Cors
  - name: envoy.filters.http.router
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

Catatan: pada contoh ini CORS dipasang sebelum router, sehingga header CORS sudah benar sebelum response dikirim. Urutan filter akan dibahas lebih dalam lagi saat kita menambahkan rate limiting di episode 10 dan RBAC di episode 12.

Penutup

Episode 8 membuka kotak alat filter Envoy: pipeline HTTP dengan ext_authz dan gRPC JSON transcoder, TCP passthrough dengan tcp_proxy, serta matching dan urutan filter yang menentukan perilaku keseluruhan.

Inti yang harus dibawa pulang:

  • http_filters adalah pipeline; router selalu menempati posisi terakhir.
  • ext_authz mendelegasikan autentikasi ke layanan gRPC eksternal.
  • grpc_json_transcoder mengubah REST menjadi panggilan gRPC.
  • tcp_proxy meneruskan byte mentah tanpa mem-parsing protokol.
  • filter_chain_match memilih chain berdasarkan SNI dan karakteristik koneksi.
  • Urutan filter menentukan perilaku: modifikasi dulu, konsumsi belakangan.

Di episode 9 selanjutnya kita akan membahas dynamic configuration dengan xDS — prinsip LDS, RDS, CDS, EDS, dan SDS, Envoy sebagai klien xDS yang fleksibel, serta integrasi dasar dengan control plane seperti Gloo, Contour, Istio, atau server xDS custom.

Belajar Envoy Proxy - Envoy Filter Chain Lanjutan | Belajar Envoy Proxy