設定與 Service Directory 的整合

本指南假設您已部署 Cloud Service Mesh,且至少向 Service Directory 註冊了一項服務。無論您使用 Envoy 或無 Proxy gRPC,都適用這些設定說明。

如要使用 Service Directory 和 Cloud Service Mesh,第一步是將服務發布至 Service Directory。如要瞭解一般總覽資訊,請參閱將服務發布至 Service Directory 的相關資訊,或 Service Directory 說明文件

向 Service Directory 註冊服務後,您可以使用 Cloud Service Mesh 的 API 資源建立服務繫結。您建立專用於與服務目錄整合的後端服務,因為參照服務繫結的後端服務不得有後端或相關聯的健康狀態檢查。

使用負載平衡 API 時,Cloud Service Mesh 轉送規則和主機規則的規定

為搭配 Service Directory 使用設定 Cloud Service Mesh 時,如果使用舊版負載平衡 API,請遵循下列準則:

  1. 確認 Cloud Service Mesh 轉送規則使用0.0.0.0虛擬 IP 位址 (VIP)。
  2. 如果您有私人區域,請確認網址對應中的主機規則與 Service Directory 在 Cloud DNS 私人區域中設定的 DNS 名稱相符。

如果違反這些規範,應用程式發出的外送要求可能會失敗。

設定 network-services API 端點

建立及使用後端服務前,請務必設定 network-services API 端點,確保 network-services 資源下的服務繫結資源參照正確無誤。使用下列指令設定 network-services API 端點。

export CLOUDSDK_API_ENDPOINT_OVERRIDES_NETWORKSERVICES="https://networkservices.googleapis.com/"

角色和權限規定

建立 Cloud Service Mesh 部署作業前,請確認您具備下列權限和角色。

服務繫結權限和角色

本節不會討論專案層級的擁有者、編輯者和檢視者權限。內容包括建立、讀取、更新及刪除資源所需的權限和角色。

動作 權限 角色
建立服務繫結。 networkservices.serviceBindings.create 網路管理員
取得服務繫結。 networkservices.serviceBindings.get 網路管理員、網路檢視者
列出專案中的服務繫結。 Google Cloud networkservices.serviceBindings.list 網路管理員、網路檢視者
更新服務繫結。 networkservices.serviceBindings.update 網路管理員
刪除服務繫結。 networkservices.serviceBindings.delete 網路管理員

Service Directory 服務權限

服務目錄管理員必須將 servicedirectory.services.bind 權限授予嘗試將服務繫結附加至服務目錄服務的服務帳戶。這樣一來,服務帳戶就能使用 Service Directory 服務,也就是說,帳戶可以在服務繫結中參照 Service Directory 服務。

權限強制執行

設定 Cloud Service Mesh 時,系統會執行 IAM 權限檢查。您必須具備建立服務繫結的必要權限,以及將服務繫結與特定 Service Directory 服務建立關聯的權限。如果具備正確的權限,您可以設定網格用戶端,瞭解 Service Directory 服務並將流量傳送至該服務。

由於這些檢查是在設定時進行,因此移除現有 Service Directory 服務的繫結權限,不會中斷流量。建立服務繫結後,移除權限不會影響網格用戶端是否能瞭解服務目錄服務,以及是否能將流量傳送至該服務。

如要停止網格用戶端與 Service Directory 服務通訊,可以使用其他機制:

  1. 限制 Service Directory 服務的存取權。例如,您可以使用防火牆規則。
  2. 刪除 Service Directory 服務。
  3. 更新 Cloud Service Mesh 設定,例如從後端服務移除服務繫結。

最佳做法

  • 雖然 Service Directory 允許使用 Service Directory API 註冊端點,但我們建議使用整合功能,在可用時自動註冊至 Service Directory。如要進一步瞭解這些整合功能,請參閱「GKE 適用的 Service Directory 總覽」和「Service Directory 和 Cloud Load Balancing 總覽」。
  • 建議您為特定邏輯服務使用相同的命名空間和服務,即使該服務部署在不同區域也一樣。

使用 Service Directory 探索服務

下圖概述這項設定程序的最終狀態,包括設定、不同系統的互動方式,以及如何將要求解析為服務的端點。這個範例假設您已向 Service Directory 註冊服務。

使用 Service Directory 探索服務的設定詳細資料。
使用 Service Directory 探索服務的設定詳細資料 (按一下即可放大)

如要讓 Cloud Service Mesh 使用 Service Directory 服務,請完成下列步驟。

  1. 在 Cloud Service Mesh 中建立新的後端服務,但不要為後端服務建立後端。
  2. 為 Service Directory 服務建立全域服務繫結。
  3. 將服務目錄服務繫結至這個後端服務。 (選用) 在後端服務中設定其他欄位和政策。

  4. 建立新的轉送設定或更新現有設定,以便將用戶端要求轉送至新的後端服務。

您無法在參照服務綁定的後端服務上設定健康狀態檢查。後端服務也不能有後端。

建立整合

請按照下列操作說明,將 Cloud Service Mesh 與 Service Directory 整合。

建立後端服務

請按照下列操作說明,在 Cloud Service Mesh 部署作業中建立後端服務。

  1. 建立後端服務,以便搭配 Service Directory 服務使用。

    gcloud compute backend-services create td-sd-demo-service \
     --global \
     --load-balancing-scheme=INTERNAL_SELF_MANAGED
    
  2. 建立參照 Service Directory 服務的服務繫結。

    gcloud beta network-services service-bindings create my-sd-binding \
     --location global \
     --service-directory-region us-east1 \
     --service-directory-namespace my-namespace \
     --service-directory-service my-service
    
  3. 將服務繫結至後端服務。

    gcloud beta compute backend-services update td-sd-demo-service \
     --global \
     --service-bindings my-sd-binding
    

建立後端服務並繫結一或多個服務目錄服務後,Cloud Service Mesh 就會開始追蹤與服務目錄服務相關聯的端點。端點是不同的 IP:通訊埠組合。如要讓這項服務可轉送,請設定轉送。

設定轉送

請按照下列操作說明更新路由設定。

服務路徑 API

以下範例假設您有名為 sidecar- meshMesh 資源。您要建立 HTTPRoute 資源,並將主機名稱設為 myservice.example.com,目的地則設為您在上一節建立的後端服務 td-sd-demo-service

  1. 建立 HTTPRoute 規格,並儲存至名為 httproute.yaml 的檔案。

    name: td-sd-demo-route
    hostnames:
    ‐ myservice.example.com
    meshes:
    ‐ projects/PROJECT_NUMBER/locations/global/meshes/sidecar-mesh
    rules:
    ‐ action:
      destinations:
      ‐ serviceName: "projects/PROJECT_NUMBER/locations/global/backendServices/td-sd-demo-service"
    
  2. 匯入 HTTPRoute 規格。

    gcloud network-services httproutes import td-sd-demo-route \
      --source=httproute.yaml \
      --location=global
    

負載平衡 API

以下範例假設您已具備基本路由設定,包括名為 my-url-map 的網址對應。

  • 首先,您要為這個網址對應建立路徑比對器。路徑比對器並不複雜。使用時,這個別名會解析為您在上一個步驟中建立的 td-sd-demo-service
  • 接著,您會在網址對應中新增主機規則。如果要求指定主機名稱 myservice.example.com,這項主機規則會導致使用路徑比對器。
  1. 建立指向後端服務的簡單路徑比對器。

    gcloud compute url-maps add-path-matcher my-url-map \
     --global \
     --default-service td-sd-demo-service \
     --path-matcher-name my-path-matcher
    
  2. 將後端服務對應至現有網址對應中的新主機規則。

    gcloud compute url-maps add-host-rule my-url-map \
     --global \
     --path-matcher-name=my-path-matcher \
     --hosts=myservice.example.com
    

從多個區域附加相同服務

Cloud Service Mesh 可讓您將多個 Service Directory 服務繫結至同一個後端服務。舉例來說,您可能有兩個 Service Directory 服務,兩者完全相同,但端點位於不同 Google Cloud 區域或可用區。換句話說,單一全域後端服務可以有兩個全域服務繫結,一個指向 us-east1 中的服務,另一個指向 us-west1 中的服務。

  1. 為匯入的 Service Directory 服務建立後端服務。

    gcloud compute backend-services create td-sd-demo-service \
     --global \
     --load-balancing-scheme=INTERNAL_SELF_MANAGED
    
  2. us-east1 中建立 Service Directory 服務的服務繫結。

    gcloud beta network-services service-bindings create us-east1-binding \
     --location global \
     --service-directory-region us-east1 \
     --service-directory-namespace my-namespace \
     --service-directory-service my-service \
    
  3. us-west1 中建立 Service Directory 服務的服務繫結。

    gcloud beta network-services service-bindings create us-west1-binding \
     --location global
     --service-directory-region us-west1 \
     --service-directory-namespace my-namespace \
     --service-directory-service my-service \
    
  4. us-east1us-west1 服務繫結至後端服務。

    gcloud compute backend-services update td-sd-demo-service \
      --global \
      --service-bindings us-east1-binding,us-west1-binding
    

套用進階流量管理政策

在上一節中,您已使用 Cloud Service Mesh,針對現有的 Service Directory 服務設定路由政策。您可以將這個模式套用至更進階的流量管理情境。

請參考以下情境。您現有的測試服務位於 Cloud Service Mesh 網格外部。測試服務是內部應用程式負載平衡器的後端。您想將 Cloud Service Mesh 網格中產生的部分正式版流量,重新傳送至這項外部服務。Cloud Service Mesh 可使用 RequestMirrorPolicy 執行這項操作,在處理要求時將流量傳送至其他後端服務。這個程序也稱為「要求側錄」,可讓您檢查流量,而不會影響正式服務。

您可以手動在 Cloud Service Mesh 網格中新增或移除測試服務端點,讓 Envoy 用戶端將流量複製到測試服務。不過,如果使用服務目錄整合功能,這個程序會比較簡單。

使用 Service Directory 探索服務並進行鏡像處理。
使用 Service Directory 進行服務探索(按一下即可放大)

在這個範例中,您會先將後端服務指向付款測試服務的 Service Directory 註冊。接著,在 Cloud Service Mesh 中為服務新增要求鏡像政策。

  1. 為要求鏡像政策建立後端服務。

    gcloud compute backend-services create payments-test-bes \
     --global \
     --load-balancing-scheme=INTERNAL_SELF_MANAGED
    
  2. 建立參照 Service Directory 服務的服務繫結。

    gcloud beta network-services service-bindings create my-sd-binding \
     --location global \
     --service-directory-region us-east1 \
     --service-directory-namespace my-namespace \
     --service-directory-service my-service \
    
  3. 將服務目錄服務繫結至測試後端服務。

    gcloud beta compute backend-services update payments-test-bes \
     --global \
     --service-bindings my-sd-binding
    
  4. 編輯網址對應,將要求鏡像至測試服務。

    gcloud compute url-maps edit my-url-map \
      --region=global
    
  5. 將網址對應設定載入編輯器後,請新增要求鏡射政策,將要求鏡射至現有的 Service Directory 服務。

    defaultService: my-project/global/default-service
       hostRules:
        - hosts:
          - '*'
          pathMatcher: path-matcher-one
       pathMatchers:
        - defaultService: my-project/global/default-service
         name: path-matcher-one
         pathRules:
          - paths:
            - /payments/
            service: my-project/global/default-service
            requestMirrorPolicy:
              backendService: myproject/global/payments-test-bes
    

從後端服務移除服務繫結

如要從後端服務移除服務繫結,請將新的服務繫結清單傳遞至 gcloud compute backend-services update 指令。新清單不得包含要刪除的服務繫結:

  • 如要移除所有服務繫結,請設定 --no-service-bindings 標記。
  • 如要移除一或多個服務繫結,請將新的服務繫結清單傳遞至 --service-bindings 旗標,並省略要移除的服務繫結。

新增或移除服務繫結

bind-service 指令會將服務繫結新增至後端服務上現有的服務繫結集。

gcloud compute backend-services bind-service BACKEND_SERVICE_NAME \
  --service-binding-name SERVICE_BINDING_URL \
  --global

unbind-service 指令會從後端服務的現有服務繫結集中移除服務繫結。

gcloud compute backend-services unbind-service BACKEND_SERVICE_NAME \
  --service-binding-name SERVICE_BINDING_URL \
  --global

bind-serviceunbind-service 指令是 Google Cloud CLI 建構項目。這些並非 API 層級的建構體。

後續步驟