Saat mengarahkan lalu lintas melalui service mesh, Anda sering perlu menyisipkan tracing ID, menerapkan kebijakan keamanan, atau meneruskan metadata antar layanan. Service Mesh (ASM) mendukung manipulasi Header HTTP pada tingkat rute melalui bidang headers dari CustomResourceDefinition (CRD) VirtualService. Anda dapat menambahkan, menimpa, atau menghapus header baik pada permintaan maupun respons tanpa mengubah kode aplikasi.
Prasyarat
Sebelum memulai, pastikan Anda telah:
-
Aplikasi HTTPBin dideploy di instans ASM Anda. Untuk petunjuknya, lihat Deploy aplikasi HTTPBin.
Referensi operasi header
VirtualService menyediakan tiga operasi untuk memanipulasi header:
|
Operasi |
Bidang YAML |
Perilaku |
Jenis nilai |
|
|
|
Menambahkan header yang ditentukan dengan nilai yang diberikan. Jika header tersebut tidak ada, header akan dibuat. |
|
|
|
|
Menimpa nilai header. Membuat header jika belum ada. |
|
|
|
|
Menghapus header sepenuhnya. |
|
Nilai header statis dan dinamis
Nilai header dapat berupa string statis atau operator perintah Envoy dinamis yang diapit oleh simbol %. Misalnya, %UPSTREAM_CLUSTER% menunjukkan nama penyedia layanan. Semua operator perintah HTTP yang digunakan untuk log akses dapat ditentukan dalam header permintaan atau respons kustom.
|
Variabel |
Deskripsi |
|
|
Timestamp saat permintaan dimulai |
|
|
Nama kluster layanan upstream |
Untuk daftar lengkap variabel yang tersedia, lihat Command operators dalam dokumentasi Envoy.
Konfigurasi manipulasi header
Konfigurasi VirtualService berikut menunjukkan ketiga operasi tersebut pada header permintaan maupun respons:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: httpbin-vs
spec:
gateways:
- httpbin
hosts:
- '*'
http:
- route:
- destination:
host: httpbin
port:
number: 8000
weight: 100
headers:
request:
add:
x-custom-request-header: "custom-value" # Tambahkan nilai statis
x-dynamic-request-header: "%START_TIME%" # Tambahkan nilai dinamis
set:
x-another-request-header: "another-value" # Timpa atau buat
remove:
- x-unwanted-header # Hapus sepenuhnya
response:
add:
x-custom-response-header: "custom-response-value"
set:
x-another-response-header: "another-response-value"
remove:
- x-unwanted-response-header
Konfigurasi ini menerapkan perubahan berikut:
Header permintaan
-
Menambahkan
x-custom-request-headerdengan nilai statiscustom-value. -
Menambahkan
x-dynamic-request-headerdengan timestamp awal permintaan, yang diselesaikan saat waktu proses dari%START_TIME%. -
Menimpa
x-another-request-headerdengan nilaianother-value. Jika header ini tidak ada, header akan dibuat. -
Menghapus
x-unwanted-header.
Header respons
-
Menambahkan
x-custom-response-headerdengan nilaicustom-response-value. -
Menimpa
x-another-response-headerdengan nilaianother-response-value. Jika header ini tidak ada, header akan dibuat. -
Menghapus
x-unwanted-response-header.
CRD VirtualService dapat digunakan untuk mengatur dan memodifikasi Header HTTP. Namun, log akses Envoy tidak mencatat perubahan ini jika Envoy mempertahankan konfigurasi default log akses. Jika Anda ingin mencatat header kustom dalam log akses Envoy, Anda harus mengubah format log Envoy.
Verifikasi header kustom dalam log akses
ASM memungkinkan Anda menyesuaikan format log. Ekspresi kustom log akses dapat memperoleh nilai dari header permintaan, header respons, dan nilai bawaan Envoy. Untuk petunjuknya, lihat Sesuaikan format log akses.
Tambahkan bidang berikut ke format log akses Anda:
|
Nama bidang |
Jenis |
Ekspresi format log |
|
|
Atribut permintaan |
|
|
|
Atribut permintaan |
|
|
|
Atribut respons |
|
Header respons yang dimodifikasi oleh VirtualService mungkin tidak muncul dalam log akses jika Envoy menerapkan modifikasi tersebut setelah langkah pencatatan log dalam rantai filter-nya. Ini merupakan perilaku yang diharapkan, bukan kesalahan konfigurasi. Lihat contoh Pod HTTPBin di bawah ini.
Setelah Anda memperbarui format log, periksa log akses baik pada Pod gerbang maupun Pod HTTPBin.
Log akses Pod gerbang
Pod gerbang menangkap modifikasi header permintaan maupun respons:
{
"bytes_received": "9",
"bytes_sent": "33",
"response_code": "200",
"my-x-custom-request-header": "custom-value",
"my-x-dynamic-request-header": "2024-01-16T14:49:21.187Z",
"my-x-custom-response-header": "custom-response-value"
}
Log akses Pod HTTPBin
Sidecar HTTPBin tidak menangkap header respons yang ditambahkan oleh VirtualService karena modifikasi terjadi setelah titik pencatatan log sidecar. Bidang my-x-custom-response-header menampilkan -:
{
"bytes_received": "9",
"bytes_sent": "33",
"response_code": "200",
"my-x-custom-request-header": "custom-value",
"my-x-dynamic-request-header": "2024-01-16T14:49:21.187Z",
"my-x-custom-response-header": "-"
}