為 Cloud Run 設定 Cloud Service Mesh

本頁說明如何設定 Cloud Service Mesh,在各種運算基礎架構上執行 Cloud Run 服務。

Cloud Service Mesh 可讓您啟用網格進階流量管理功能,例如加權流量分配和全域負載平衡,以及從一個 Cloud Run 服務到另一個服務的流量觀測和安全防護政策。此外,這項解決方案還提供全代管的資料層,可免除維護自有服務網格 Sidecar 的作業負擔。

事前準備

  1. 熟悉 Cloud Service Mesh

  2. 設定專案:

    gcloud config set core/project PROJECT_ID
  3. 在 Google Cloud 控制台中,為專案啟用下列 API:

    如果您使用無伺服器虛擬私有雲存取連接器,而非直接虛擬私有雲進行網路輸出。

  4. gcloud 元件更新至最新版本 (488.0.0 以上):

    gcloud components update

限制

使用 Cloud Service Mesh 的 Cloud Run 服務可能會發生冷啟動延遲時間增加的情形。如需縮短啟動時間的建議,請參閱 Cloud Run 說明文件的「一般開發提示」一節。

必要的角色

如要取得設定及部署 Cloud Run 服務所需的權限,請要求管理員授予下列 IAM 角色:

Cloud Run 用戶端的服務帳戶也必須具備下列角色:

如需與 Cloud Run 相關聯的 IAM 角色和權限清單,請參閱 Cloud Run IAM 角色Cloud Run IAM 權限。如果 Cloud Run 服務與Google Cloud API (例如 Cloud 用戶端程式庫) 介接,請參閱服務身分設定指南。 如要進一步瞭解如何授予角色,請參閱部署權限管理存取權

使用 Cloud Service Mesh 在 Cloud Run 服務之間進行呼叫

Cloud Run 使用 Cloud Service Mesh 服務路由 API。這些 API 可讓 Cloud Run 服務使用自訂網址 (而非提供的 run.app 網址) 呼叫其他 Cloud Run 服務。此外,Cloud Run 會自動向目的地 Cloud Run 服務進行驗證,因此您不必自行設定驗證,即可將要求憑證附加至其他 Cloud Run 服務。

如要使用 Cloud Service Mesh 從一個 Cloud Run 服務呼叫另一個服務,請按照下列步驟操作:

  1. 設定 Cloud Service Mesh
  2. 設定 Cloud DNS
  3. 建立目的地 Cloud Run 服務
  4. 建立無伺服器 NEG
  5. 建立用戶端 Cloud Run 服務
  6. 從網格用戶端呼叫服務

設定 Cloud Service Mesh

  1. 如要使用預設網址建立服務路徑,請將 Mesh 規格儲存到名為 mesh.yaml 的檔案:

    name: MESH_NAME

    MESH_NAME 替換為網格資源名稱。

  2. 執行下列指令,從規格匯入 Mesh 資源:

    gcloud network-services meshes import MESH_NAME \
      --source=mesh.yaml \
      --location=global

    MESH_NAME 替換為網格資源名稱。

設定 Cloud DNS

如果您使用 Private Service Connect 端點,並以完整的 run.app URL 位址做為主機名稱,則可以略過 Cloud DNS 設定,直接前往下一節,因為系統只會擷取私人 IP 位址。

網格用戶端呼叫目的地服務時,要求中使用的主機名稱必須可透過 DNS 解析。由於 Sidecar 會擷取這些 IP 位址範圍的所有 IP 流量,並適當重新導向,因此任何有效的 RFC 1918 IP 位址都可接受。

以下範例說明如何在 Cloud DNS 區域中建立萬用字元 * 項目,解析為單一 IP 位址。如不想使用專屬的 Cloud DNS 區域,請為要從網格可定址的 Cloud Run 服務,為每個主機名稱建立 Cloud DNS 項目

  • 如要在專屬區域中建立 Cloud DNS 記錄,請執行下列指令:

    1. 在 Cloud DNS 中為服務網格建立私有代管 DNS 區域。

      gcloud dns managed-zones create MESH_NAME \
      --description="Domain for DOMAIN_NAME service mesh routes" \
      --dns-name=DOMAIN_NAME. \
      --networks=VPC_NETWORK_NAME \
      --visibility=private
    2. 在新建的不公開代管區域中建立 DNS 記錄。確認 IP 位址 10.0.0.1 未使用。

      gcloud dns record-sets create "*.DOMAIN_NAME." \
      --type=A \
      --zone="MESH_NAME" \
      --rrdatas=10.0.0.1 \
      --ttl=3600

      更改下列內容:

      • DOMAIN_NAME:DNS 網域的名稱。
      • MESH_NAME:網格資源名稱。
      • VPC_NETWORK_NAME:虛擬私有雲網路的名稱,例如「default」。

透過 Cloud Service Mesh 存取內部服務

Cloud Run 可讓您將傳入網路流量限制為「內部」。如果服務已啟用這項輸入限制,當您啟用 Cloud Run 的存取路徑時,從網格透過虛擬私有雲網路傳輸的流量可以設為「內部」。

如要透過 Cloud Service Mesh 存取內部服務,請使用下列其中一種方法:

建立目的地 Cloud Run 服務

請注意,Cloud Run 目的地無法停用預設網址

  1. 部署新的或現有的 Cloud Run 服務:

    gcloud run deploy DESTINATION_SERVICE_NAME \
    --no-allow-unauthenticated \
    --region=REGION \
    --image=IMAGE_URL 

    更改下列內容:

    • DESTINATION_SERVICE_NAME:目的地 Cloud Run 服務的名稱。
    • REGION:區域名稱。
    • IMAGE_URL:容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest

建立無伺服器網路端點群組 (NEG)

  1. 執行下列指令,建立目的地 NEG:

    gcloud compute network-endpoint-groups create DESTINATION_SERVICE_NAME-neg \
    --region=REGION \
    --network-endpoint-type=serverless \
    --cloud-run-service=DESTINATION_SERVICE_NAME

    更改下列內容:

    • REGION:區域名稱。
    • DESTINATION_SERVICE_NAME:目的地 Cloud Run 服務的名稱。
  2. 建立參照無伺服器 NEG 的內部自行管理後端服務。

    1. 建立後端服務:

      gcloud compute backend-services create DESTINATION_SERVICE_NAME-REGION \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED

      DESTINATION_SERVICE_NAME 改為目的地服務名稱,並將 REGION 改為區域名稱。

    2. 將無伺服器後端新增至後端服務:

      gcloud compute backend-services add-backend DESTINATION_SERVICE_NAME-REGION \
      --global \
      --network-endpoint-group=DESTINATION_SERVICE_NAME-neg \
      --network-endpoint-group-region=REGION

      DESTINATION_SERVICE_NAME 改為目的地服務名稱,並將 REGION 改為區域名稱。

  3. 建立參照後端服務的 HTTP 路由。

    已設定 Mesh 資源和服務。使用 HTTPRoute 資源將主機名稱與後端服務建立關聯。

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

      name: "DESTINATION_SERVICE_NAME-route"
      hostnames:
      - "DESTINATION_SERVICE_NAME.DOMAIN_NAME"
      meshes:
      - "projects/PROJECT_ID/locations/global/meshes/MESH_NAME"
      rules:
      - action:
         destinations:
         - serviceName: "projects/PROJECT_ID/locations/global/backendServices/DESTINATION_SERVICE_NAME-REGION"
      

      將主機名稱設為您要用來存取服務的名稱。不論呼叫端的區域和專案為何,同一服務網格中的所有用戶端都可以使用 http://<HOSTNAME> 網址呼叫這項服務。如果您已設定 Cloud DNS 使用私有 IP 位址,路徑主機名稱也可以是完整的 run.app URL 位址,在這種情況下,您可以略過 Cloud DNS 設定步驟。

      更改下列內容:

      • DESTINATION_SERVICE_NAME:目的地 Cloud Run 服務的名稱。
      • DOMAIN_NAME:DNS 網域的名稱。
      • PROJECT_ID:專案的 ID。
      • MESH_NAME:網格名稱。
      • REGION:區域名稱。
    2. 使用 http_route.yaml 檔案中的規格建立 HTTPRoute 資源:

      gcloud network-services http-routes import DESTINATION_SERVICE_NAME-route \
      --source=http_route.yaml \
      --location=global
      
    3. 執行下列指令,在 Cloud Run 目的地服務上授予 Cloud Run 叫用者角色 (roles/iam.invoker):

      gcloud run services add-iam-policy-binding DESTINATION_SERVICE_NAME \
      --region REGION \
      --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --role=roles/run.invoker

      更改下列內容:

      • DESTINATION_SERVICE_NAME:目的地 Cloud Run 服務的名稱。
      • REGION:區域名稱。
      • PROJECT_NUMBER:專案編號。

建立用戶端 Cloud Run 服務

建立用戶端 Cloud Run 服務時,會建立 Envoy Sidecar,其資源與 QPS 和總設定大小相關。在大多數情況下,CPU 用量會低於 vCPU 的 1%,記憶體用量則低於 50 MB。

您必須具備虛擬私有雲網路的網路輸出存取權。

  • 如要建立用戶端服務以進行測試,請在 Cloud Run 中部署 Fortio 應用程式,允許將流量轉送至 HTTP 路由:

    gcloud beta run deploy CLIENT_SERVICE_NAME \
    --region=REGION \
    --image=fortio/fortio \
    --network=VPC_NETWORK_NAME \
    --subnet=SUBNET_NAME \
    --mesh="projects/PROJECT_ID/locations/global/meshes/MESH_NAME"

    更改下列內容:

    • CLIENT_SERVICE_NAME:用戶端 Cloud Run 服務的名稱。
    • REGION:區域名稱。
    • VPC_NETWORK_NAME:虛擬私有雲網路的名稱,例如「default」。
    • SUBNET_NAME:子網路名稱,例如「default」。
    • PROJECT_ID:您的專案 ID。
    • MESH_NAME網格資源名稱。

從網格用戶端呼叫服務

如要使用上一個「建立用戶端服務」一節中的 fortio 測試應用程式,將要求轉送至目的地路徑,請按照下列步驟操作:

  1. 執行下列指令,擷取您建立的 Cloud Run 用戶端服務網址:

    TEST_SERVICE_URL=$(gcloud run services describe CLIENT_SERVICE_NAME \
    --region=REGION --format="value(status.url)" \
    --project=PROJECT_ID)

    更改下列內容:

    • CLIENT_SERVICE_NAME:用戶端 Cloud Run 服務的名稱。
    • REGION:區域名稱。
    • PROJECT_ID:您的專案 ID。
  2. 使用 curl 指令,將要求傳送至上一步中 fortio 端點的目的地路徑:

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" "$TEST_SERVICE_URL/fortio/fetch/DESTINATION_SERVICE_NAME.DOMAIN_NAME"

    更改下列內容:

    • DESTINATION_SERVICE_NAME:目的地 Cloud Run 服務的名稱。
    • DOMAIN_NAME:DNS 網域的名稱。

從 Cloud Run 呼叫 Compute Engine 後端

如要使用代管執行個體群組做為後端,部署 Compute Engine 和 Cloud Service Mesh 服務路徑,請在 Cloud Service Mesh 中設定以 Compute Engine 為基礎的 HTTP 伺服器。這樣一來,Cloud Run 用戶端就能使用這個後端服務路徑,直接將要求傳送至 Compute Engine 執行個體。

後續步驟