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_procmemungkinkan 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_authzberada dalam Pratinjau.Protokol
ext_authzmendelegasikan 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
wireFormatsaat 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.
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.OKmenunjukkan bahwa permintaan diizinkan. Status lainnya menunjukkan bahwa permintaan ditolak.denied_responseatauok_response: menunjukkan apakah respons diizinkan atau ditolak. Kolom ini disertai dengan atribut respons HTTP terkait untuk pemeriksaan otorisasi.Kolom
ok_responsedigunakan 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 kolomraw_valueuntuk header.Kolom
denied_responsedigunakan 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 status500 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 |
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 |
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:
- Semua backend grup instance terkelola dan tidak terkelola
- Semua NEG zona
- Semua NEG dengan konektivitas hybrid
- NEG Private Service Connect yang mengarah ke layanan VPC
- NEG serverless yang mengarah ke layanan Cloud Run
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_eventsdi ekstensi keREQUEST_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-IPCDN-Loop- Header yang dimulai dengan
X-Forwarded,X-Google,X-GFE, atauX-Amz- connectionkeep-alivetransfer-encoding,teupgradeproxy-connection,proxy-authenticate,proxy-authorizationtrailers
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 kolomvalue.
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_BODYatauRESPONSE_BODYuntuk ekstensi, jika load balancer menerima permintaan yang cocok, load balancer akan menghapus headerContent-Lengthdari respons dan beralih ke encoding isi yang di-chunk.Saat melakukan streaming isi pesan ke server
ext_proc, di akhir, load balancer mungkin mengirim pesanProcessingRequestyang mengikuti dengan isi kosong danend_streamdisetel ketrueuntuk 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
Mengonfigurasi layanan backend teks promosi yang dikelola pengguna
Layanan backend anotasi adalah prasyarat untuk mengonfigurasi rute, otorisasi, dan ekstensi traffic yang dikelola pengguna menggunakan anotasi.