Service Extensions 可讓支援的應用程式負載平衡器使用外掛程式,或向後端服務傳送呼叫,在處理路徑中插入自訂處理程序。負載平衡器收到要求標頭時,路徑擴充功能會在要求處理路徑中執行,並在評估網址對應之前執行。本頁說明如何設定路徑擴充功能。
如要瞭解應用程式負載平衡器擴充功能,請參閱「Cloud Load Balancing 擴充功能總覽」。
應用程式負載平衡器的路由擴充功能會指向下列資源:
- 要附加的轉送規則
- 外掛程式或呼叫後端服務,後者後端會執行
ext_procgRPC API
路線擴充功能會將相關的擴充服務分組為鏈結。您可以在同一個擴充功能鏈結中設定外掛程式和摘要。擴充功能鏈會使用一般運算語言 (CEL) 比對條件,選取要執行的流量。負載平衡器會依序評估要求是否符合鏈結的相符條件。如果要求符合鏈結定義的條件,鏈結中的所有擴充功能都會對要求採取行動。只有一個鏈結符合特定要求。
擴充功能會參照要附加的負載平衡器 轉送規則。設定資源後,負載平衡器就會開始將相符要求傳送至擴充功能服務。
如要瞭解應用程式負載平衡器擴充功能相關限制,請參閱「配額與限制」頁面。
使用外掛程式設定
本節將以範例說明如何使用外掛程式設定路徑擴充功能,在路徑符合 /extensions 時,將 :host 要求標頭重新編寫為 service-extensions.com。先前的主機和新設定的主機對應至不同區域的後端服務,這會顯示轉送行為。
參照特定外掛程式的所有擴充功能資源都必須屬於相同類型。 擴充功能也必須採用相同的負載平衡配置。您無法使用 Media CDN 擴充功能中已使用的外掛程式,設定 Cloud Load Balancing 擴充功能。
事前準備
建立及設定支援路徑擴充功能外掛程式的應用程式負載平衡器。
按照「設定具備 VM 執行個體群組後端的跨區域內部應用程式負載平衡器」頁面的指示完成所有步驟,但下列步驟除外:
- 將後端服務命名為
service-one。 - 將
service-one指向A區域中的虛擬機器 (VM) 執行個體。 - 預設會指向
gl7-gilb-url-map。service-one
- 將後端服務命名為
設定額外的後端服務
service-two,並將其指向B區域中的 VM。在網址對應中,新增指向
service-two的路徑比對器。使用gcloud compute url-maps add-path-matcher指令,並搭配下列範例值:gcloud compute url-maps add-path-matcher gl7-gilb-url-map \ --path-matcher-name=rewrite-host \ --default-service=service-two \ --new-hosts=service-extensions.com \ --location=global設定將測試要求傳送至服務的方式 (例如執行 curl)。如果您使用內部負載平衡器,請建立用戶端 VM 以進行測試。
使用外掛程式設定路徑擴充功能
設定擴充功能前,請先檢查行為。
確認沒有明確路徑的要求會前往
A區域:curl FORWARDING_RULE_IP
將
FORWARDING_RULE_IP替換為轉送規則的 IP 位址。如要找出 IP 位址,請使用gcloud compute forwarding-rules describe指令。輸出內容會與下列內容類似,並指出網頁是從
region A中的 VM 提供服務:Page served from region-A-vm確認網址對應中沒有
/extensions的相符項目:curl FORWARDING_RULE_IP/extensions
將
FORWARDING_RULE_IP替換為轉送規則的 IP 位址。如要找出 IP 位址,請使用gcloud compute forwarding-rules describe指令。輸出內容表示網址對應中沒有與
/extensions相符的項目。輸出結果會與下列內容相似:<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>404 Not Found</title> </head><body> ...
設定路徑擴充功能。
控制台
前往 Google Cloud 控制台的「Service Extensions」頁面。
按一下「建立擴充功能」。
系統會開啟精靈,引導您完成一些初始步驟。
選取「負載平衡」產品。然後按一下「繼續」。
系統會顯示支援的應用程式負載平衡器清單。
負載平衡器類型請選取跨區域內部應用程式負載平衡器。 然後按一下「繼續」。
在「擴充功能類型」中選取「路線擴充功能」,然後按一下「繼續」。
如要開啟「建立擴充功能」表單,請按一下「繼續」。
在「建立擴充功能」表單中,請注意頁面頂端顯示的先前選取項目無法編輯。
在「Basics」(基本) 部分,執行下列操作:
為擴充功能指定不重複的名稱。
名稱開頭須為小寫英文字母,後方最多可接 62 個小寫英文字母、數字或連字號,但結尾不得為連字號。
選用:輸入擴充功能的簡短說明,最多 1,024 個字元。
選用:在「標籤」部分中,按一下「新增標籤」。接著,在顯示的資料列中執行下列操作:
- 在「Key」中輸入金鑰名稱。
- 在「值」中輸入索引鍵的值。
如要新增更多鍵/值組合,請按一下「新增標籤」。最多可新增 64 個鍵/值組合。
如要進一步瞭解標籤,請參閱「建立及更新專案標籤」。
在「Forwarding rules」(轉送規則),選取要與擴充功能建立關聯的一或多個轉送規則,例如
cr-ilb-forwarding-rule。無法選取已與其他擴充功能建立關聯的轉送規則,且這類規則會顯示為已停用。
如果是擴充功能鏈結,請新增一或多個擴充功能鏈結,以執行相符要求。
如要新增擴充功能鏈,請按照下列步驟操作,然後按一下「完成」:
為「新的擴充功能鏈結」指定專屬名稱。
名稱必須符合 RFC-1034 規定,只能使用小寫英文字母、數字和連字號,且長度上限為 63 個字元。此外,第一個字元必須是英文字母,最後一個字元則須為英文字母或數字。
如要比對執行擴充功能鏈結的要求,請在「比對條件」中指定一般運算語言 (CEL) 運算式,例如
request.path.startsWith("/extensions")。如要進一步瞭解 CEL 運算式,請按一下「取得語法說明」,或參閱 CEL 比對工具語言參考資料。
新增要為相符要求執行的擴充功能。路線擴充功能只能指定一個擴充功能。
在「擴充功能」下方執行下列操作,然後按一下「完成」:
在「Programmability type」(可程式化類型) 中,選取「Plugins」(外掛程式)。
在「擴充功能名稱」部分指定專屬名稱。
名稱必須符合 RFC-1034 規定,只能使用小寫英文字母、數字和連字號,且長度上限為 63 個字元。此外,第一個字元必須是英文字母,最後一個字元則須為英文字母或數字。
在「外掛程式」部分,選取使用服務擴充功能建立的外掛程式,且產品和擴充功能類型相同。
在「Forward headers」(轉送標頭) 部分,按一下「Add header」(新增標頭),然後新增要轉送至擴充功能的 HTTP 標頭 (來自用戶端或後端)。如果未指定標頭,系統會傳送所有標頭。
選用:如果擴充功能逾時或失敗,但您希望繼續處理要求或回覆,請選取「啟用」,啟用「失敗時開啟」。
根據預設,系統不會選取「Fail open」(失敗時開放) 選項。在本例中,發生錯誤時,要求或回應處理作業會停止。如果回應標頭尚未傳送至下游用戶端,系統會傳回通用的 HTTP
500狀態碼給用戶端。如果已傳送回應標頭,系統會重設用戶端的 HTTP 串流。如果安全或完整性是首要考量,建議保留預設選項,也就是取消選取「Fail open」。啟用「Fail open」(特別是針對非重要作業) 有助於優先考量可用性。
按一下「建立擴充功能」。
gcloud
在 YAML 檔案中定義外掛程式,並將其與全域轉送規則建立關聯,例如
cr-ilb-forwarding-rule。cat >route-plugin.yaml <<EOF name: route-ext forwardingRules: - https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/forwardingRules/cr-ilb-forwarding-rule loadBalancingScheme: INTERNAL_MANAGED extensionChains: - name: "chain1" matchCondition: celExpression: 'request.path.startsWith("/extensions")' extensions: - name: 'ext1' service: projects/PROJECT_ID/locations/LOCATION/wasmPlugins/WASM_PLUGIN failOpen: false supportedEvents: - REQUEST_HEADERS EOF更改下列內容:
PROJECT_ID:專案 ID。REGION:轉送規則的區域。這個值必須與外掛程式位置指定的值相符。LOCATION:外掛程式的位置,可為global或區域。WASM_PLUGIN:外掛程式的 ID 或完整名稱。
匯入路徑擴充功能。使用
gcloud service-extensions lb-route-extensions import指令和下列範例值。gcloud service-extensions lb-route-extensions import route-ext \ --source=route-plugin.yaml \ --location=global
建立路線擴充功能後,新外掛程式需要一段時間才能發布至所有地點。外掛程式不會同時傳送至所有地點,因此時間可能因地點而異。
如要確認路徑擴充功能是否正常運作,請使用相同的
curl指令:curl FORWARDING_RULE_IP/extensions
輸出內容會與下列內容類似,並指出網頁是從
region B中的 VM 提供服務:Page served from region-B-vm如要確認外掛程式只會針對具有
/extension路徑前置字串的要求執行,請重複執行curl指令,但不要指定路徑。curl FORWARDING_RULE_IP
輸出結果會與下列內容相似:
Page served from region-A-vm
使用摘要設定
本節說明如何使用標註設定路徑擴充功能。
事前準備
請按照「設定外呼後端服務」一文中的說明,建立必要資源。
使用摘要設定路線擴充功能
以下範例說明如何設定路徑擴充功能,在路徑符合 /extensions 時呼叫。callout-vm 中的路徑標註伺服器會將 Host 標頭變更為 service-extensions.com,將路徑設為 /,然後將指令傳送至負載平衡器,重新計算路徑。流量會流向 l7-ilb-backend-service2,而不是 l7-ilb-backend-service。
檢查網址對應中是否有
/extensions的相符項目。在用戶端 VM 中,對轉送規則執行下列
curl指令:curl FORWARDING_RULE_IP/extensions
將
FORWARDING_RULE_IP替換為轉送規則的 IP 位址。如要找出 IP 位址,請使用gcloud compute forwarding-rules describe指令。輸出內容表示網址對應中沒有與
/extensions相符的項目。輸出結果會與下列內容相似:<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>404 Not Found</title> </head><body> ...
設定路徑擴充功能。
控制台
前往 Google Cloud 控制台的「Service Extensions」頁面。
按一下「建立擴充功能」。
系統會開啟精靈,引導您完成一些初始步驟。
選取「負載平衡」產品。然後按一下「繼續」。
系統會顯示支援的應用程式負載平衡器清單。
選取負載平衡器類型。如果是區域性負載平衡器,請一併指定區域。按一下「繼續」。
在「擴充功能類型」中選取「路線擴充功能」,然後按一下「繼續」。
如要開啟「建立擴充功能」表單,請按一下「繼續」。
在「建立擴充功能」表單中,請注意頁面頂端顯示的先前選取項目無法編輯。
在「Basics」(基本) 部分,執行下列操作:
為擴充功能指定不重複的名稱。
名稱開頭須為小寫英文字母,後方最多可接 62 個小寫英文字母、數字或連字號,但結尾不得為連字號。
選用:輸入擴充功能的簡短說明,最多 1,024 個字元。
選用:在「標籤」部分中,按一下「新增標籤」。接著,在顯示的資料列中執行下列操作:
- 在「Key」中輸入金鑰名稱。
- 在「值」中輸入索引鍵的值。
如要新增更多鍵/值組合,請按一下「新增標籤」。最多可新增 64 個鍵/值組合。
如要進一步瞭解標籤,請參閱「建立及更新專案標籤」。
在「Forwarding rules」(轉送規則),選取要與擴充功能建立關聯的一或多個轉送規則,例如
l7-ilb-forwarding-rule。無法選取已與其他擴充功能建立關聯的轉送規則,且這類規則會顯示為已停用。
如果是擴充功能鏈結,請新增一或多個擴充功能鏈結,以執行相符要求。
如要新增擴充鏈,請按照下列步驟操作,然後按一下「完成」。
為「新的擴充功能鏈結」指定專屬名稱。
名稱必須符合 RFC-1034 規定,只能使用小寫英文字母、數字和連字號,且長度上限為 63 個字元。此外,第一個字元必須是英文字母,最後一個字元則須為英文字母或數字。
如要比對執行擴充功能鏈結的要求,請在「比對條件」中指定一般運算語言 (CEL) 運算式,例如
request.path.startsWith("/extensions")。如要進一步瞭解 CEL 運算式,請按一下「取得語法說明」,或參閱 CEL 比對工具語言參考資料。
新增要為相符要求執行的擴充功能。路線擴充功能只能指定一個擴充功能。
在「擴充功能」下方執行下列操作,然後按一下「完成」:
在「Programmability type」(可程式化類型) 部分,選取「Callouts」(註解)。
在「擴充功能名稱」部分指定專屬名稱。
名稱必須符合 RFC-1034 規定,只能使用小寫英文字母、數字和連字號,且長度上限為 63 個字元。此外,第一個字元必須是英文字母,最後一個字元則須為英文字母或數字。
在「Authority」中,輸入從負載平衡器傳送至擴充功能服務的 gRPC 要求中的
authority標頭。在「後端服務」中,選取按照「設定呼叫外送後端服務」一文中的操作說明建立的後端服務。
「逾時」值須介於 10 到 1000 毫秒之間,如果負載平衡器仍在等待
ext_proc服務的回應,串流上的訊息就會逾時。在「Forward headers」(轉送標頭) 部分,按一下「Add header」(新增標頭),然後新增要轉送至擴充功能的 HTTP 標頭 (來自用戶端或後端)。如果未指定標頭,系統會傳送所有標頭。
選用:如果擴充功能逾時或失敗,但您希望繼續處理要求或回覆,請選取「啟用」,啟用「失敗時開啟」。鏈結中的後續擴充功能也會執行。
根據預設,系統不會選取「Fail open」(失敗時開放) 選項。在本例中,發生錯誤時,要求或回應處理作業會停止。如果回應標頭尚未傳送至下游用戶端,系統會傳回通用的 HTTP
500狀態碼給用戶端。如果已傳送回應標頭,系統會重設用戶端的 HTTP 串流。如果安全或完整性是首要考量,建議保留預設選項,也就是取消選取「Fail open」。啟用「Fail open」(特別是針對非重要作業) 有助於優先考量可用性。
在「中繼資料」部分,點選「新增中繼資料」,並按照建議指定範例值。將「Key」(索引鍵) 指定為
key,並將「Value」(值) 指定為value。按一下「新增中繼資料」,新增其他鍵/值組合。將「Key」(索引鍵) 指定為
fr,並將「Value」(值) 指定為forwarding_rule_id。您可以使用「中繼資料」欄位,將任何額外資訊從負載平衡器傳遞至擴充功能伺服器。中繼資料會以
ProcessingRequest訊息傳送,並編碼為protobuf.Struct。中繼資料中與指定轉送規則 ID 相符的任何文字,都會替換為與用戶端要求相關聯的轉送規則完整資源網址。中繼資料總大小不得超過 1 KiB。 中繼資料中的鍵總數不得超過 16 個。 每個鍵的長度不得超過 64 個字元。每個值的長度不得超過 1024 個字元。所有值都必須是字串。
按一下「建立擴充功能」。
gcloud
在 YAML 檔案中定義附註,並將其與轉送規則建立關聯。使用提供的樣本值。
cat >route.yaml <<EOF name: route-ext forwardingRules: - https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules/l7-ilb-forwarding-rule loadBalancingScheme: INTERNAL_MANAGED extensionChains: - name: "chain1" matchCondition: celExpression: 'request.path.startsWith("/extensions")' extensions: - name: 'ext11' authority: ext11.com service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/l7-ilb-callout-service failOpen: false timeout: 0.1s metadata: "key": "value" "fr": "forwarding_rule_id" EOF將
PROJECT_ID替換為專案 ID。擴充功能設定中的
metadata欄位可讓您將任何額外資訊從負載平衡器傳遞至擴充功能伺服器。中繼資料會以ProcessingRequest訊息傳送,並編碼為protobuf.Struct。中繼資料中與指定轉送規則 ID 相符的任何文字,都會替換為與用戶端要求相關聯的轉送規則完整資源網址。metadata的總大小必須小於 1 KiB。 中繼資料中的鍵總數不得超過 16 個。 每個鍵的長度不得超過 64 個字元。每個值的長度不得超過 1024 個字元。所有值都必須是字串。匯入路徑擴充功能。使用
gcloud service-extensions lb-route-extensions import指令,並搭配下列範例值。gcloud service-extensions lb-route-extensions import route-ext \ --source=route.yaml \ --location=us-west1
確認路線擴充功能是否正常運作。使用相同的
curl指令:curl FORWARDING_RULE_IP/extensions
輸出內容指出,即使原始要求不符,流量仍與虛擬主機
service-extensions.com相符,並抵達l7-ilb-backend-service2服務。輸出結果會與下列內容相似:Page served from second backend service如要驗證呼叫僅指定具有
/extension前置字串的要求,請重複執行curl指令,但不要加上path前置字串。curl FORWARDING_RULE_IP
輸出結果會與下列內容相似:
Page served from: l7-ilb-backend-example-1c7t
路線擴充功能的限制
- 路由擴充功能不支援 HTTP 主體處理。
- 路由擴充功能不支援從擴充功能直接回應用戶端。如果路徑擴充功能伺服器對處理要求的回應包含直接回應,負載平衡器會忽略該處理要求。
如要瞭解所有擴充功能的適用限制,請參閱「擴充功能限制」。
後續步驟
- 前往 Service Extensions 的 GitHub 外掛程式存放區,查看 Rust、Go 和 C++ 外掛程式範例和測試工具。
- 前往 Service Extensions 的 GitHub 存放區 (適用於註解),查看
ext_proc伺服器的 Python 和 Go 範例。 - 設定流量擴充功能
- 管理擴充功能
- 管理外掛程式