Ringkasan info Cloud Load Balancing

Service Extensions memungkinkan Anda menginstruksikan Load Balancer Aplikasi yang didukung untuk mengirimkan callout dari jalur data load balancing ke layanan callout yang dikelola pengguna atau layanan Google.

Alur data info

Load balancer berkomunikasi dengan callout menggunakan salah satu protokol gRPC Envoy berikut:

  • Protokol Pemrosesan Eksternal atau ext_proc.

    Protokol ini didukung untuk ekstensi rute, traffic, dan otorisasi dan digunakan secara default.

    Protokol ext_proc memungkinkan layanan ekstensi merespons peristiwa dalam siklus proses permintaan HTTP dengan memeriksa dan mengubah header atau isi permintaan.

  • Protokol Otorisasi Eksternal atau ext_authz.

    Protokol ini hanya didukung untuk ekstensi otorisasi. Dukungan untuk ext_authz berada dalam Pratinjau.

    Protokol ext_authz mendelegasikan keputusan otorisasi untuk permintaan masuk ke layanan eksternal yang independen. API ini memungkinkan layanan ekstensi merespons peristiwa dalam siklus proses permintaan HTTP untuk keputusan otorisasi yang kompleks dengan memeriksa header atau metadata permintaan.

    Anda dapat menentukan protokol ini dengan opsi wireFormat saat Anda mengonfigurasi ekstensi otorisasi.

Anda dapat men-deploy layanan ekstensi ini di instance virtual machine (VM) atau di GKE dan mengonfigurasi grup instance atau grup endpoint jaringan (NEG) untuk merepresentasikan endpoint layanan ini.

Diagram berikut menunjukkan cara men-deploy layanan backend info singkat dengan server gRPC pada resource komputasi yang dikelola pengguna, seperti instance VM atau cluster Google Kubernetes Engine (GKE), dan merepresentasikannya ke load balancer sebagai layanan backend reguler.

Load Balancer Aplikasi menggunakan panggilan untuk menyertakan logika kustom dari layanan backend panggilan.
Load Balancer Aplikasi mengirimkan panggilan Service Extensions ke layanan backend panggilan (klik untuk memperbesar).

Cara kerja info dengan ext_proc

Versi singkat gRPC API ext_proc adalah sebagai berikut.

// The gRPC API to be implemented by the external processing server
service ExternalProcessor {
  rpc Process(stream ProcessingRequest) returns (stream ProcessingResponse) {
  }
}

// Envoy sets one of these fields depending on the processing stage.
message ProcessingRequest {
  oneof request {
    HttpHeaders request_headers = 2;
    HttpHeaders response_headers = 3;
    HttpBody request_body = 4;
    HttpBody response_body = 5;
  }
}

message ProcessingResponse {
  oneof response {
    HeadersResponse request_headers = 1;
    HeadersResponse response_headers = 2;
    BodyResponse request_body = 3;
    BodyResponse response_body = 4;

    ImmediateResponse immediate_response = 7;
  }
}

Setelah menerima header untuk permintaan HTTP, load balancer akan mengirim pesan ProcessingRequest ke layanan ekstensi dengan kolom request_headers yang ditetapkan ke header HTTP dari klien.

Layanan ekstensi harus merespons pesan ProcessingRequest dengan pesan ProcessingResponse yang sesuai yang berisi perubahan yang dikonfigurasi pada header atau isi pesan ProcessingRequest. Atau, layanan dapat menetapkan kolom immediate_response untuk membuat load balancer mengakhiri pemrosesan permintaan dan mengirimkan respons yang ditentukan kembali ke klien.

Untuk peristiwa REQUEST_HEADER dan RESPONSE_HEADER, layanan ekstensi dapat memanipulasi header HTTP dalam permintaan atau respons. Layanan dapat menambahkan, mengubah, atau menghapus header dengan menyetel kolom request_headers atau response_headers dalam pesan ProcessingResponse dengan tepat. Gunakan kolom raw_value untuk header.

Ekstensi traffic memungkinkan perubahan header dan isi permintaan serta respons. Server ekstensi dapat mengganti mode pemrosesan secara dinamis dan memungkinkannya mengaktifkan atau menonaktifkan ekstensi untuk fase pemrosesan permintaan berikutnya. Load balancer tidak mengevaluasi ulang aturan rute setelah memanggil ekstensi traffic.

Ekstensi edge, otorisasi, dan rute hanya mendukung header HTTP. Ekstensi ini tidak dapat memeriksa atau mengubah isi HTTP.

Cara kerja info dengan ext_authz

API ext_authz hanya mendukung ekstensi info otorisasi.

Versi singkat API adalah sebagai berikut.

// A generic interface for performing authorization checks on incoming
// requests to a networked service.
service Authorization {
  // Performs an authorization check based on the attributes associated with
  // the incoming request and return status.
  rpc Check(CheckRequest) returns (CheckResponse) {
  }
}

message CheckRequest {
  // The request attributes.
  AttributeContext attributes = 1;
}

message CheckResponse {
  google.rpc.Status status = 1;
  oneof http_response {
    DeniedHttpResponse denied_response = 2;
    OkHttpResponse ok_response = 3;
  }
  google.protobuf.Struct dynamic_metadata = 4;
}

Setelah menerima header untuk permintaan HTTP, load balancer akan mengirim pesan CheckRequest ke layanan ekstensi.

Layanan ekstensi harus merespons pesan CheckRequest dengan pesan CheckResponse yang sesuai yang berisi informasi berikut:

  • status: menunjukkan status. OK menunjukkan bahwa permintaan diizinkan. Status lainnya menunjukkan bahwa permintaan ditolak.

  • denied_response atau ok_response: menunjukkan apakah respons diizinkan atau ditolak. Kolom ini disertai dengan atribut respons HTTP terkait untuk pemeriksaan otorisasi.

    • Kolom ok_response digunakan saat layanan otorisasi mengizinkan permintaan. Layanan ini dapat mengubah, menambahkan, atau menghapus header permintaan asli dan memperbarui header respons HTTP yang dikirim ke klien. Gunakan kolom raw_value untuk header.

    • Kolom denied_response digunakan saat layanan otorisasi menolak permintaan. Layanan ini dapat memperbarui header respons HTTP yang dikirim ke klien.

    Jika layanan ekstensi menampilkan nama atau nilai header yang tidak diizinkan melalui pesan CheckResponse, permintaan akan ditolak dengan kode status 500 Internal Error. Untuk mengetahui informasi tentang header yang tidak diizinkan, lihat Batasan dengan manipulasi header.

  • dynamic_metadata: mencakup metadata opsional untuk digunakan oleh ekstensi apa pun yang dipanggil setelah ekstensi otorisasi, seperti ekstensi traffic.

Mode pemrosesan tubuh

Untuk ekstensi yang mendukung pemrosesan isi, Anda dapat mengonfigurasi salah satu dari dua mode pengiriman berikut untuk pemrosesan isi permintaan dan respons dengan menetapkan nilai kolom request_body_send_mode atau response_body_send_mode.

Mode default adalah STREAMED, yang direkomendasikan untuk sebagian besar kasus penggunaan.

Mode Deskripsi Peristiwa yang didukung diperlukan Ekstensi yang didukung
STREAMED

Panggilan dieksekusi dalam mode streaming. Setelan default ini juga digunakan jika mode tidak ditetapkan.

Proxy mengirimkan potongan isi ke layanan ekstensi dan mengharapkan satu respons per potongan. Ekstensi dapat mengirim kembali potongan yang diubah, mengonfirmasi potongan tanpa perubahan, atau menghapus potongan.

Proxy hanya mengirimkan sejumlah kecil data dalam satu waktu. Jadi, layanan ekstensi harus mengonfirmasi potongan secepat mungkin.

Meskipun mode isi tidak dapat diubah secara dinamis, server ekstensi lanjutan dapat memilih peristiwa HTTP mendatang yang akan diterima secara dinamis. Dengan menampilkan opsi ext_proc mode_override selama permintaan header, server info singkat dapat mengaktifkan atau menonaktifkan peristiwa header, isi, atau trailer di masa mendatang.

Harus menyertakan REQUEST_BODY untuk permintaan atau RESPONSE_BODY untuk respons. Ekstensi traffic (untuk permintaan dan respons).
FULL_DUPLEX_STREAMED

Panggilan dieksekusi dalam mode full duplex.

Proxy mengirimkan potongan saat tiba dan tidak melakukan buffering. Karena tidak ada buffering, proxy kurang sensitif terhadap latensi ekstensi.

Proxy dapat menerima sebanyak mungkin potongan respons yang diperlukan. Potongan balasan tidak terhubung dengan potongan yang dikirim proxy. Chunk berikutnya dikirim untuk diproses saat tiba di proxy, tanpa menunggu chunk dan peristiwa sebelumnya diproses sepenuhnya.

Ekstensi dapat secara bebas melakukan buffering, mengubah, dan mengelompokkan ulang konten isi. Jika ekstensi tidak mengirimkan kembali konten isi, ekstensi berikutnya dalam rantai akan menerima isi kosong.

Opsi ext_proc mode_override tidak berlaku, dan mode tidak dapat diubah secara dinamis.

Harus menyertakan REQUEST_BODY dan REQUEST_TRAILERS untuk permintaan atau RESPONSE_BODY dan RESPONSE_TRAILERS untuk respons. Ekstensi traffic (untuk permintaan dan respons).

Ekstensi rute (untuk permintaan).

Backend yang didukung untuk layanan backend info bantuan yang dikelola pengguna

Anda dapat menghosting ekstensi info pengguna yang dikelola pengguna di layanan backend yang menggunakan salah satu jenis backend berikut yang menjalankan layanan gRPC Envoy:

Pengoptimalan yang direkomendasikan untuk info

Mengintegrasikan ekstensi ke jalur pemrosesan load balancing akan menimbulkan latensi tambahan untuk permintaan dan respons. Setiap jenis data yang diproses oleh layanan ekstensi—termasuk header permintaan, isi permintaan, header respons, dan isi respons, sebagaimana berlaku—menambah latensi.

Pertimbangkan pengoptimalan berikut untuk meminimalkan latensi:

  • Deploy info di zona yang sama dengan layanan backend tujuan reguler untuk load balancer. Saat menggunakan Load Balancer Aplikasi internal lintas region, tempatkan backend layanan ekstensi di region yang sama dengan subnet khusus proxy load balancer.
  • Saat menggunakan Load Balancer Aplikasi eksternal global, tempatkan backend layanan panggilan di wilayah geografis tempat VM tujuan, workload GKE, dan fungsi Cloud Run load balancer reguler berada.
  • Jika memungkinkan, konfigurasi ekstensi untuk memproses hanya data yang Anda perlukan. Misalnya, untuk mengubah hanya header permintaan untuk ekstensi rute dan traffic, tetapkan kolom supported_events di ekstensi ke REQUEST_HEADERS.

Batasan

Bagian ini mencantumkan beberapa batasan dengan keterangan.

Batasan manipulasi header

Anda tidak dapat mengubah beberapa header. Berikut adalah batasan manipulasi header:

  • Manipulasi header tidak didukung untuk header berikut:

    • X-user-IP
    • CDN-Loop
    • Header yang dimulai dengan X-Forwarded, X-Google, X-GFE, atau X-Amz-
    • connection
    • keep-alive
    • transfer-encoding, te
    • upgrade
    • proxy-connection, proxy-authenticate, proxy-authorization
    • trailers

    Untuk ekstensi traffic dan otorisasi, manipulasi header juga tidak didukung untuk header berikut: :method, :authority, :scheme, atau header host.

  • Saat server gRPC menentukan nilai header di HeaderMutation, load balancer akan mengabaikan kolom value.

Batasan pemrosesan isi pesan

Berikut adalah batasan klien dan backend HTTP/1.1 terkait isi pesan, yang berlaku untuk ext_proc, tetapi tidak untuk ext_authz.

  • 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 di-chunk.

  • Saat melakukan streaming isi pesan ke server ext_proc, di akhir, load balancer mungkin mengirim pesan ProcessingRequest yang mengikuti dengan isi kosong dan end_stream disetel ke true untuk menunjukkan bahwa streaming telah berakhir.

Batasan lainnya

Berikut adalah batasan pada pesan respons gRPC:

  • Ukuran maksimum pesan respons adalah 128 kB. Jika pesan yang diterima melebihi batas ini, aliran akan ditutup dengan error RESOURCE_EXHAUSTED.

  • Layanan backend panggilan tidak dapat menggunakan kebijakan Cloud Armor, IAP, atau Cloud CDN.

  • Layanan backend info harus menggunakan HTTP/2 sebagai protokol.

  • Untuk ekstensi otorisasi, load balancer tidak meneruskan isi permintaan apa pun ke layanan backend callout.

  • Untuk ekstensi rute, layanan backend info tidak dapat mengganti mode pemrosesan aliran ext_proc.

Langkah berikutnya