設定流量擴充功能

Service Extensions 可讓支援的應用程式負載平衡器使用外掛程式,或向後端服務傳送呼叫,在處理路徑中插入自訂處理程序。流量擴充功能會在要求處理路徑中最後執行,並在回應處理路徑中率先執行,以修改標頭和酬載,但不影響後端服務的選擇。本頁說明如何設定流量擴充功能。

如要瞭解應用程式負載平衡器擴充功能,請參閱「Cloud Load Balancing 擴充功能總覽」。

應用程式負載平衡器的流量擴充功能會指向下列資源:

  • 要附加的轉送規則
  • 外掛程式或呼叫後端服務,後者後端會執行 ext_proc gRPC API

流量擴展功能會將相關擴展服務歸入一或多個鏈結。您可以在同一個擴充功能鏈中設定外掛程式和標註。每個擴充功能鏈結都會使用一般運算語言 (CEL) 比對條件,選取要執行的流量。負載平衡器會依序評估要求是否符合每個鏈結的相符條件。如果要求符合鏈結定義的條件,鏈結中的所有擴充功能都會對要求採取行動。只有一個鏈結符合特定要求。

鏈結中的每個擴充功能都可以有自己的一組支援事件。擴充功能對要求和回應內容所做的修改,會顯示在鏈結中的其餘擴充功能。如果擴充功能已設定為支援回應事件,回應路徑上的擴充功能順序會反轉。

流量擴充功能會參照要附加的負載平衡器轉送規則。設定資源後,負載平衡器就會開始將相符要求傳送至擴充功能服務。

如要瞭解擴充功能相關限制,請參閱「配額與限制」頁面。

使用外掛程式設定

本節說明如何使用外掛程式設定流量擴充功能。

參照特定外掛程式的所有擴充功能資源都必須屬於相同類型。 擴充功能也必須採用相同的負載平衡配置。您無法使用 Media CDN 擴充功能中已使用的外掛程式,設定 Cloud Load Balancing 擴充功能。

事前準備

  1. 建立外掛程式,其中包含自訂程式碼

  2. 建立及設定支援流量擴充外掛程式的應用程式負載平衡器

    舉例來說,您可以設定具備 VM 執行個體群組後端的全域外部應用程式負載平衡器

  3. 設定將測試要求傳送至服務的方式,例如執行 curl。如果您使用內部負載平衡器,請建立用戶端 VM 以進行測試

使用外掛程式設定流量擴充功能

以下範例說明如何使用外掛程式設定流量擴充功能,在主機符合 example.com 時新增回應標頭 hello: service-extensions

  1. 檢查網址對應中是否有 example.com 的相符項目。

    1. 在用戶端 VM 中,對轉送規則執行下列 curl 指令:

      curl -D - -H "host: example.com" FORWARDING_RULE_IP
      

      FORWARDING_RULE_IP 替換為轉送規則的 IP 位址。如要找出 IP 位址,請使用 gcloud compute forwarding-rules describe 指令

      輸出結果會與下列內容相似:

      HTTP/1.1 200 OK
      ...
      content-length: 46
      content-type: text/html
      via: 1.1 google
      
  2. 設定車流量擴充功能。

    控制台

    1. 前往 Google Cloud 控制台的「Service Extensions」頁面。

      前往 Service Extensions

    2. 按一下「建立擴充功能」

      系統會開啟精靈,引導您完成一些初始步驟。

    3. 選取「負載平衡」產品。然後按一下「繼續」

      系統會顯示支援的應用程式負載平衡器清單。

    4. 負載平衡器類型請選取全域外部應用程式負載平衡器或跨區域內部應用程式負載平衡器。然後按一下「繼續」

    5. 在「擴充功能類型」中選取「流量擴充功能」,然後按一下「繼續」

    6. 如要開啟「建立擴充功能」表單,請按一下「繼續」

      在「建立擴充功能」表單中,請注意頁面頂端顯示的先前選取項目無法編輯。

    7. 在「Basics」(基本) 部分,執行下列操作:

      1. 為擴充功能指定不重複的名稱。

        名稱開頭須為小寫英文字母,後方最多可接 62 個小寫英文字母、數字或連字號,但結尾不得為連字號。

      2. 選用:輸入擴充功能的簡短說明,最多 1,024 個字元。

      3. 選用:在「標籤」部分中,按一下「新增標籤」。接著,在顯示的資料列中執行下列操作:

        • 在「Key」中輸入金鑰名稱。
        • 在「值」中輸入索引鍵的值。

        如要新增更多鍵/值組合,請按一下「新增標籤」。最多可新增 64 個鍵/值組合。

        如要進一步瞭解標籤,請參閱「建立及更新專案標籤」。

    8. 在「Forwarding rules」(轉送規則),選取要與擴充功能建立關聯的一或多個轉送規則,例如 http-content-rule

      無法選取已與其他擴充功能建立關聯的轉送規則,且系統會顯示這些規則無法使用。

    9. 如果是擴充功能鏈結,請新增一或多個擴充功能鏈結,以執行相符要求。

      如要新增擴充功能鏈,請按照下列步驟操作,然後按一下「完成」

      • 為「新的擴充功能鏈結」指定專屬名稱。

        名稱必須符合 RFC-1034 規定,只能使用小寫英文字母、數字和連字號,且長度上限為 63 個字元。此外,第一個字元必須是英文字母,最後一個字元必須是英文字母或數字。

      • 如要比對執行擴充功能鏈結的要求,請在「比對條件」中指定一般運算語言 (CEL) 運算式,例如 request.host == "example.com"

        如要進一步瞭解 CEL 運算式,請按一下「取得語法說明」,或參閱 CEL 比對工具語言參考資料

      • 新增一或多個擴充功能,以執行相符的要求。

        針對每個擴充功能,在「擴充功能」下方執行下列操作,然後按一下「完成」

        • 在「Programmability type」(可程式化類型) 中,選取「Plugins」(外掛程式)

        • 在「擴充功能名稱」部分指定專屬名稱。

          名稱必須符合 RFC-1034 規定,只能使用小寫英文字母、數字和連字號,且長度上限為 63 個字元。此外,第一個字元必須是英文字母,最後一個字元則須為英文字母或數字。

        • 在「外掛程式」部分,選取使用服務擴充功能建立的外掛程式,且產品和擴充功能類型相同。

        • 在「事件」部分,選取一或多個會呼叫擴充功能的 HTTP 事件類型。

        • 在「Forward headers」(轉送標頭) 部分,按一下「Add header」(新增標頭),然後新增要轉送至擴充功能的 HTTP 標頭 (來自用戶端或後端)。如果未指定標頭,系統會傳送所有標頭。

        • 選用:如果擴充功能逾時或失敗,但您希望繼續處理要求或回覆,請選取「啟用」,啟用「失敗時開啟」。鏈結中的後續擴充功能也會執行。

          根據預設,系統不會選取「Fail open」(失敗時開放) 選項。在本例中,發生錯誤時,要求或回應處理作業會停止。如果回應標頭尚未傳送至下游用戶端,系統會傳回通用的 HTTP 500 狀態碼給用戶端。如果已傳送回應標頭,系統會重設用戶端的 HTTP 串流。

          如果安全或完整性是首要考量,建議保留預設選項,也就是取消選取「Fail open」。啟用「Fail open」(特別是針對非重要作業) 有助於優先考量可用性。

    10. 按一下「建立擴充功能」

    gcloud

    1. 在 YAML 檔案中定義外掛程式,並將其與轉送規則建立關聯,例如 http-content-rule

      cat >traffic-plugin.yaml <<EOF
          name: traffic-ext
          forwardingRules:
          - https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/forwardingRules/http-content-rule
          loadBalancingScheme: EXTERNAL_MANAGED
          extensionChains:
          - name: "chain1"
            matchCondition:
              celExpression: 'request.host == "example.com"'
            extensions:
            - name: 'ext1'
              service: projects/PROJECT_ID/locations/LOCATION/wasmPlugins/WASM_PLUGIN
              failOpen: false
              supportedEvents:
              - RESPONSE_HEADERS
      EOF
      

      更改下列內容:

      • PROJECT_ID專案 ID
      • REGION:轉送規則的區域。這個值必須與外掛程式位置指定的值相符。
      • LOCATION:外掛程式的位置,可為 global 或區域。
      • WASM_PLUGIN:外掛程式的 ID 或完整名稱。
    2. 匯入流量擴充功能。使用 gcloud service-extensions lb-traffic-extensions import 指令和下列範例值。

      gcloud service-extensions lb-traffic-extensions import traffic-ext \
          --source=traffic-plugin.yaml \
          --location=global
      

    建立流量擴充功能後,新外掛程式需要一段時間才能發布到所有地點。外掛程式不會同時傳送至所有地點,因此時間可能因地點而異。

  3. 如要確認流量擴充功能是否正常運作,請使用相同的 curl 指令:

    curl -D - -H "host: example.com" FORWARDING_RULE_IP
    

    輸出內容包含 hello: service-extensions 回應標頭。

    HTTP/1.1 200 OK
    ...
    content-length: 46
    content-type: text/
    hello: service-extensions
    via: 1.1 google
    

    如要驗證擴充功能是否只指定 example.com 流量,請重複執行 curl 指令,但不要加入 host 標頭。

    curl -D - FORWARDING_RULE_IP
    

    輸出結果會與下列內容相似:

    HTTP/1.1 200 OK
    ...
    content-length: 46
    content-type: text/html
    via: 1.1 google
    

使用附註,為使用者代管服務設定流量擴充功能

本節說明如何使用呼叫,將流量擴充功能設定為使用者管理的呼叫後端服務。

事前準備

請按照「設定外呼後端服務」一文中的說明,建立必要資源。

使用摘要設定流量擴充功能

以下範例有助於設定流量擴充功能,方法是使用附註,在主機符合 example.com 時呼叫。callout-vm 中的流量擴充功能伺服器會將回應標頭 hello: service-extensions 新增至相符要求。

  1. 檢查網址對應中是否有 example.com 的相符項目。

    1. 在用戶端 VM 中,對轉送規則執行下列 curl 指令:

      curl -D - -H "host: example.com" FORWARDING_RULE_IP
      

      FORWARDING_RULE_IP 替換為轉送規則的 IP 位址。如要找出 IP 位址,請使用 gcloud compute forwarding-rules describe 指令

      輸出結果會與下列內容相似:

      HTTP/1.1 200 OK
      ...
      content-length: 46
      content-type: text/html
      via: 1.1 google
      
      Page served from: l7-ilb-backend-example-1c7t
      
  2. 設定車流量擴充功能。

    控制台

    1. 前往 Google Cloud 控制台的「Service Extensions」頁面。

      前往 Service Extensions

    2. 按一下「建立擴充功能」

      系統會開啟精靈,引導您完成一些初始步驟。

    3. 選取「負載平衡」產品。然後按一下「繼續」

      系統會顯示支援的應用程式負載平衡器清單。

    4. 選取負載平衡器類型。如果是區域性負載平衡器,請一併指定區域。按一下「繼續」

    5. 在「擴充功能類型」中選取「流量擴充功能」,然後按一下「繼續」

    6. 如要開啟「建立擴充功能」表單,請按一下「繼續」

      在「建立擴充功能」表單中,請注意頁面頂端顯示的先前選取項目無法編輯。

    7. 在「Basics」(基本) 部分,執行下列操作:

      1. 為擴充功能指定不重複的名稱。

        名稱開頭須為小寫英文字母,後方最多可接 62 個小寫英文字母、數字或連字號,但結尾不得為連字號。

      2. 選用:輸入擴充功能的簡短說明,最多 1,024 個字元。

      3. 選用:在「標籤」部分中,按一下「新增標籤」。接著,在顯示的資料列中執行下列操作:

        • 在「Key」中輸入金鑰名稱。
        • 在「值」中輸入索引鍵的值。

        如要新增更多鍵/值組合,請按一下「新增標籤」。最多可新增 64 個鍵/值組合。

        如要進一步瞭解標籤,請參閱「建立及更新專案標籤」。

    8. 在「Forwarding rules」(轉送規則),選取要與擴充功能建立關聯的一或多個轉送規則,例如 l7-ilb-forwarding-rule

      無法選取已與其他擴充功能建立關聯的轉送規則,且系統會顯示這些規則無法使用。

    9. 如果是擴充功能鏈結,請新增一或多個擴充功能鏈結,以執行相符要求。

      如要新增擴充功能鏈,請按照下列步驟操作,然後按一下「完成」

      • 在「Programmability type」(可程式化類型) 部分,選取「Callouts」(註解)

      • 在「New extension chain name」中指定專屬名稱。

        名稱必須符合 RFC-1034 規定,只能使用小寫英文字母、數字和連字號,且長度上限為 63 個字元。此外,第一個字元必須是英文字母,最後一個字元則須為英文字母或數字。

      • 如要比對執行擴充功能鏈結的要求,請在「比對條件」中指定一般運算語言 (CEL) 運算式,例如 request.host == "example.com"

        如要進一步瞭解 CEL 運算式,請按一下「取得語法說明」,或參閱 CEL 比對工具語言參考資料

      • 新增一或多個擴充功能,以執行相符的要求。

        針對每個擴充功能,在「擴充功能」下方執行下列操作,然後按一下「完成」

        • 在「擴充功能名稱」部分指定專屬名稱。

          名稱必須符合 RFC-1034 規定,只能使用小寫英文字母、數字和連字號,且長度上限為 63 個字元。此外,第一個字元必須是英文字母,最後一個字元則須為英文字母或數字。

        • 在「Authority」中,輸入從負載平衡器傳送至擴充功能服務的 gRPC 要求中的 authority 標頭。

        • 在「後端服務」中,選取按照「設定呼叫外送後端服務」一文中的操作說明建立的後端服務。

        • 「逾時」:指定介於 10 到 1000 毫秒之間的值,超過這個時間後,系統會將串流中的訊息設為逾時。

        • 在「事件」部分,選取一或多個會呼叫擴充功能的 HTTP 事件類型。

        • 在「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。 中繼資料中的鍵總數不得超過 20 個。 每個鍵的長度不得超過 64 個字元。每個值的長度不得超過 1,024 個字元。所有值都必須是字串。

    10. 按一下「建立擴充功能」

    gcloud

    1. 在 YAML 檔案中定義附註,並將其與轉送規則建立關聯。使用提供的樣本值。

      cat >traffic.yaml <<EOF
          name: traffic-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.host == "example.com"'
            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"
              supportedEvents:
              - RESPONSE_HEADERS
      EOF
      

      PROJECT_ID 替換為專案 ID

      擴充功能設定中的 metadata 欄位可讓您將任何額外資訊從負載平衡器傳遞至擴充功能伺服器。中繼資料會以 ProcessingRequest 訊息傳送,並編碼為 protobuf.Struct。中繼資料中與指定轉送規則 ID 相符的任何文字,都會替換為與用戶端要求相關聯的轉送規則完整資源網址。

      metadata 的總大小必須小於 1 KiB。 中繼資料中的鍵總數不得超過 16 個。 每個鍵的長度不得超過 64 個字元。每個值的長度不得超過 1,024 個字元。所有值都必須是字串。

    2. 匯入流量擴充功能。使用 gcloud service-extensions lb-traffic-extensions import 指令,並搭配下列範例值。

      gcloud service-extensions lb-traffic-extensions import traffic-ext \
          --source=traffic.yaml \
          --location=us-west1
      
  3. 確認流量擴充功能是否正常運作。使用相同的 curl 指令:

    curl -D - -H "host: example.com" FORWARDING_RULE_IP
    

    輸出內容包含 hello: service-extensions 回應標頭。

    HTTP/1.1 200 OK
    ...
    content-length: 46
    content-type: text/
    hello: service-extensions
    via: 1.1 google
    
    Page served from: l7-ilb-backend-example-1c7t
    

    如要驗證擴充功能是否只指定 example.com 流量,請重複執行 curl 指令,但不要加入 host 標頭。

    curl -D - FORWARDING_RULE_IP
    

    輸出結果會與下列內容相似:

    HTTP/1.1 200 OK
    ...
    content-length: 46
    content-type: text/html
    via: 1.1 google
    
    Page served from: l7-ilb-backend-example-1c7t
    

後續步驟