Ringkasan plugin

Halaman ini memberikan informasi ringkasan tentang integrasi plugin dengan Load Balancer Aplikasi Cloud Load Balancing dan Media CDN.

Fitur ini berada dalam Pratinjau untuk Media CDN.

Plugin dibuat menggunakan format WebAssembly (Wasm) dan menggunakan Proxy-Wasm API.

  • Wasm adalah format instruksi biner terbuka dan standar yang memungkinkan host memuat dan menjalankan modul Wasm dengan kode yang disediakan pelanggan. Wasm memiliki sejumlah manfaat untuk menjalankan kode pelanggan, termasuk sandboxing untuk keamanan, dukungan untuk beberapa bahasa, portabilitas, dukungan yang luas dan terus berkembang dalam industri, serta peningkatan performa dibandingkan opsi berbasis VM lainnya seperti JavaScript.

  • Proxy-Wasm adalah project open source yang dimulai oleh Google. Project ini menentukan API yang memungkinkan Anda menyesuaikan perilaku proxy jaringan dengan menerapkan callback yang akan dieksekusi selama pemrosesan permintaan dan respons HTTP.

Cara kerja plugin

Anda dapat menggunakan Service Extensions dengan Load Balancer Aplikasi dan Media CDN sebagai berikut:

  1. Siapkan kode plugin sebagai berikut:

    1. Buat kode kustom menggunakan salah satu Proxy-Wasm SDK:

    2. Kompilasi kode Anda ke dalam modul Wasm.

    3. Upload kode plugin yang dikompilasi ke repositori Artifact Registry.

  2. Buat plugin yang berisi kode plugin yang diupload.

  3. Konfigurasi plugin di ekstensi Cloud Load Balancing atau ekstensi Media CDN.

Resource plugin

Service Extensions membantu Anda membuat resource utama berikut yang membantu Anda menambahkan kode kustom di jalur pemrosesan:

  • Plugin, yang berisi kode kustom yang ingin Anda deploy.

  • Versi plugin, yang merupakan versi modul Wasm Anda. Anda dapat menunjukkan versi modul Wasm yang akan digunakan plugin sebagai versi utama (aktif).

Mengakses atribut di plugin

Plugin Wasm dapat mengakses atribut yang diteruskan menggunakan panggilan proxy_get_property ABI, yang merupakan bagian dari Proxy-Wasm ABI. Nama properti yang dapat Anda ambil sesuai dengan nama atribut.

Anda dapat mengakses properti sebagai representasi jalur nama atribut. Misalnya, untuk mengambil request.host, Anda dapat menggunakan representasi jalur seperti {"request", "host"}.

Contoh Rust konseptual berikut menunjukkan cara mengakses atribut yang diteruskan dalam implementasi HttpContext:

use proxy_wasm::traits::{HttpContext, RootContext};
use proxy_wasm::types::Action;

// ... inside your HttpContext implementation ...

fn on_request_headers(&mut self, _num_headers: usize, _end_of_stream: bool) -> Action {
    if let Some(host) = self.get_property(vec!["request", "host"]) {
        // host is a Vec, convert to string
        let host_str = String::from_utf8(host).unwrap_or_default();
        log::info!("Request host: {}", host_str);
    }

    if let Some(region) = self.get_property(vec!["source", "client_region"]) {
        let region_str = String::from_utf8(region).unwrap_or_default();
        log::info!("Client region: {}", region_str);
    }

    Action::Continue
}

Batasan

Bagian ini mencantumkan beberapa batasan terkait plugin.

Batasan pada resource

Plugin dibatasi secara ketat dalam jumlah resource yang dapat digunakan:

  • Plugin dapat menggunakan hingga 1 md vCPU yang dinormalisasi untuk setiap pemanggilan. Milidetik CPU bergantung pada platform, tetapi platform yang dinormalisasi kira-kira sama dengan prosesor dengan kecepatan clock 4 GHz. Pemanggilan adalah fase eksekusi yang ditagih secara terpisah, yang dapat berupa header permintaan, isi permintaan, header respons, atau isi respons.

  • Plugin dapat menggunakan memori hingga 16 MiB untuk setiap instance VM. Instance harus dapat menayangkan hingga 1.000 permintaan serentak, yang berarti plugin dapat menyimpan memori hingga 16 KiB untuk setiap aliran. Perlu diingat bahwa total penggunaan memori mencakup alokasi stack dan status global.

Gunakan penguji plugin untuk mengukur karakteristik CPU dan memori plugin.

Batasan pada API

  • Plugin dapat menggunakan subset Proxy-Wasm ABI. Plugin tidak mendukung timer, metrik kustom, data yang dibagikan, antrean bersama, atau panggilan jaringan keluar.

  • Peristiwa trailer HTTP tidak didukung.

Batasan dengan manipulasi header

  • Ukuran maksimum mutasi (header atau bagian isi) adalah 128 KiB.

  • Plugin tidak dapat mengganti mode pemrosesan aliran ext_proc.

  • Manipulasi header melalui plugin tidak didukung untuk beberapa header. Prosesor mengabaikan modifikasi apa pun di header ini, dan terus memproses permintaan.

    Untuk plugin Media CDN, hal berikut tidak didukung:

    • Header: CDN-Loop, connection, keep-alive, proxy-authenticate, proxy-authorization, proxy-connection, te, trailers, transfer-encoding, upgrade, atau X-user-IP.
    • Header yang dimulai dengan: x-forwarded, x-goog-,x-google, x-gfe, atau x-amz-.

    Untuk plugin Cloud Load Balancing, hal berikut tidak didukung:

    • Header: connection, keep-alive, proxy-authenticate, proxy-authorization, proxy-connection, sec-user-ip, te, trailer, transfer-encoding, upgrade, x-dont-count-ads, x-dont-show-ads, x-gr, x-proxyuser-ip, atau x-user-ip.

      Selain itu, untuk LbTrafficExtension, header ini juga tidak didukung: header method, authority, scheme, atau host.

    • Header yang dimulai dengan: sec-gfe-, sec-google-, x-amz-, x-forwarded-, x-gfe-, x-goog-, x-google-, atau x-gproxy-.

Batasan dengan klien dan backend HTTP/1.1

Saat Anda mengonfigurasi REQUEST_BODY atau RESPONSE_BODY untuk ekstensi, jika load balancer menerima permintaan yang cocok, load balancer akan menghapus header Content-Length dari respons dan beralih ke encoding isi yang dipecah.

Langkah berikutnya