全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Sesuaikan header permintaan dan header respons menggunakan EnvoyFilter CRD

更新时间:Jun 28, 2025

Anda dapat menyesuaikan header permintaan dan header respons menggunakan EnvoyFilter CustomResourceDefinition (CRD). EnvoyFilter CRD memungkinkan Anda untuk langsung memodifikasi konfigurasi proxy Istio (Envoy), termasuk menambahkan, menghapus, atau memodifikasi header saat permintaan atau respons melewati proxy.

Prasyarat

Aplikasi HTTPBin telah diterapkan. Untuk informasi lebih lanjut, lihat Terapkan Aplikasi HTTPBin.

Langkah 1: Tentukan template filter Envoy

ASM memungkinkan Anda membuat filter Envoy menggunakan template filter Envoy. Template yang sama dapat digunakan untuk membuat beberapa filter Envoy yang dapat diterapkan pada beban kerja dan namespace berbeda, meningkatkan efisiensi manajemen melalui penggunaan kembali konfigurasi.

Kode YAML berikut adalah contoh template filter Envoy. Untuk informasi lebih lanjut, lihat Envoy Filter.

Perluas untuk Melihat Kode YAML dari Template Filter Envoy

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: custom-header-filter
  namespace: my-namespace
spec:
  configPatches:
    - applyTo: HTTP_FILTER
      match:
        context: SIDECAR_INBOUND
        listener:
          filterChain:
            filter:
              name: envoy.filters.network.http_connection_manager
              subFilter:
                name: envoy.filters.http.router
        proxy:
          proxyVersion: ^1\.20.*
      patch:
        operation: INSERT_BEFORE
        value:
          name: envoy.lua
          typed_config:
            '@type': type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
            inlineCode: |
              function envoy_on_request(request_handle)
                -- Dapatkan kunci header dan nilai dari header permintaan.
                local header_key = "x-custom-request-header" -- Kunci header permintaan yang ingin Anda peroleh.
                local header_value = request_handle:headers():get(header_key)
                if header_value then
                  -- Tulis data ke Otel Baggage.
                  local baggage = header_key .. "=" .. header_value
                  request_handle:headers():add("baggage", baggage)
                  request_handle:streamInfo():dynamicMetadata():set("envoy.filters.http.lua", "otel.baggage", baggage)
                end
              end

              function envoy_on_response(response_handle)
                -- Dapatkan Otel Baggage dari metadata dinamis.
                local metadata = response_handle:streamInfo():dynamicMetadata():get("envoy.filters.http.lua") or {}
                local baggage = metadata["otel.baggage"]
                if baggage then
                  -- Tulis Otel Baggage ke header lainnya.
                  local new_header_key = "x-custom-response-header" -- Kunci header respons baru.
                  response_handle:headers():add(new_header_key, baggage)
                end
              end
  workloadSelector:
    labels:
      app: httpbin
      version: v1

  • Jika menggunakan Istio 1.9 atau versi lebih baru, ganti nilai bidang proxyVersion dengan versi Istio.

  • Jika menggunakan Istio 1.8 atau versi sebelumnya, ganti nilai bidang proxyVersion dengan versi Istio. Selain itu, ganti envoy.filters.network.http_connection_manager dengan envoy.http_connection_manager, envoy.filters.http.router dengan envoy.router, dan type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua dengan type.googleapis.com/envoy.config.filter.http.lua.v2.Lua dalam kode YAML di atas.

Langkah 2: Buat filter Envoy menggunakan template filter Envoy

Setelah membuat template filter Envoy, Anda perlu mengikatnya ke beban kerja atau namespace tertentu. Dengan cara ini, filter Envoy yang dibuat hanya berlaku untuk beban kerja atau namespace tersebut. ASM secara otomatis membuat filter Envoy berdasarkan template setelah pengikatan dilakukan.

Filter Envoy yang dibuat menambahkan header permintaan kustom ke permintaan masuk dan header respons kustom ke respons keluar. Contoh berikut membuat filter Envoy bernama custom-header-filter dan mengonfigurasi filter Lua untuk menambahkan header permintaan dan respons. Filter ini berlaku untuk semua beban kerja dengan label app: my-app.

Perluas untuk Melihat Kode YAML dari Filter Envoy

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: custom-header-filter
  namespace: my-namespace
spec:
  configPatches:
    - applyTo: HTTP_FILTER
      match:
        context: SIDECAR_INBOUND
        listener:
          filterChain:
            filter:
              name: envoy.filters.network.http_connection_manager
              subFilter:
                name: envoy.filters.http.router
        proxy:
          proxyVersion: ^1\.20.*
      patch:
        operation: INSERT_BEFORE
        value:
          name: envoy.lua
          typed_config:
            '@type': type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
            inlineCode: |
              function envoy_on_request(request_handle)
                -- Dapatkan kunci header dan nilai dari header permintaan.
                local header_key = "x-custom-request-header" -- Kunci header permintaan yang ingin Anda peroleh.
                local header_value = request_handle:headers():get(header_key)
                if header_value then
                  -- Tulis data ke Otel Baggage.
                  local baggage = header_key .. "=" .. header_value
                  request_handle:headers():add("baggage", baggage)
                  request_handle:streamInfo():dynamicMetadata():set("envoy.filters.http.lua", "otel.baggage", baggage)
                end
              end

              function envoy_on_response(response_handle)
                -- Dapatkan Otel Baggage dari metadata dinamis.
                local metadata = response_handle:streamInfo():dynamicMetadata():get("envoy.filters.http.lua") or {}
                local baggage = metadata["otel.baggage"]
                if baggage then
                  -- Tulis Otel Baggage ke header lainnya.
                  local new_header_key = "x-custom-response-header" -- Kunci header respons baru.
                  response_handle:headers():add(new_header_key, baggage)
                end
              end
  workloadSelector:
    labels:
      app: httpbin
      version: v1

Penting

EnvoyFilter adalah metode konfigurasi yang kuat tetapi kompleks karena langsung memodifikasi konfigurasi dasar Envoy. Oleh karena itu, gunakan dengan hati-hati dan pastikan pemahaman mendalam tentang model konfigurasi Envoy untuk menghindari kesalahan potensial. Selain itu, konfigurasi EnvoyFilter dapat berubah dengan peningkatan versi Istio, jadi perhatikan masalah kompatibilitas.

Langkah 3: Lihat header permintaan kustom dan header respons dalam log akses

ASM memungkinkan Anda menyesuaikan format log akses. Ekspresi kustom log akses dapat memperoleh nilai dari header permintaan, header respons, dan nilai bawaan Envoy. Untuk informasi lebih lanjut, lihat Sesuaikan Format Log Akses.

Tabel berikut mencantumkan tiga bidang baru yang digunakan untuk menampilkan konten dalam log akses.

Bidang

Tipe

Nilai

my-x-custom-request-header

Atribut permintaan

%REQ(x-custom-request-header)%

baggage-from-request

Atribut permintaan

%REQ(baggage)%

my-x-custom-response-header

Atribut respons

%RESP(x-custom-response-header)%

Periksa log akses pod HTTPBin, dan Anda akan melihat konten serupa dengan berikut ini:

{
    "bytes_received": "0",
    "bytes_sent": "490",
    "durasi": "1",
    "istio_policy_status": "-",
    "method": "GET",
    "path": "/headers",
    "protocol": "HTTP/1.1",
    "response_code": "200",
    "response_flags": "-",
    "my-x-custom-request-header": "xxx",
    "baggage-from-request": "x-custom-request-header=xxx",
    "my-x-custom-response-header": "x-custom-request-header=xxx",
}