為 Cloud Run 設定 Cloud Service Mesh
本頁說明如何設定 Cloud Service Mesh,在各種運算基礎架構上執行 Cloud Run 服務。
Cloud Service Mesh 可讓您啟用網格進階流量管理功能,例如加權流量分配和全域負載平衡,以及從一個 Cloud Run 服務到另一個服務的流量觀測和安全防護政策。此外,這項解決方案還提供全代管的資料層,可免除維護自有服務網格 Sidecar 的作業負擔。
事前準備
設定專案:
gcloud config set core/project
PROJECT_ID
在 Google Cloud 控制台中,為專案啟用下列 API:
如果您使用無伺服器虛擬私有雲存取連接器,而非直接虛擬私有雲進行網路輸出。
將
gcloud
元件更新至最新版本 (488.0.0 以上):gcloud components update
限制
使用 Cloud Service Mesh 的 Cloud Run 服務可能會發生冷啟動延遲時間增加的情形。如需縮短啟動時間的建議,請參閱 Cloud Run 說明文件的「一般開發提示」一節。
必要的角色
如要取得設定及部署 Cloud Run 服務所需的權限,請要求管理員授予下列 IAM 角色:
- Cloud Run 開發人員
(
roles/run.developer
) Cloud Run 服務 - 服務身分上的服務帳戶使用者 (
roles/iam.serviceAccountUser
)
Cloud Run 用戶端的服務帳戶也必須具備下列角色:
- Traffic Director 用戶端
(
roles/trafficdirector.client
) 存取服務路由 API - Cloud Trace 代理程式 (
roles/cloudtrace.agent
) 來啟用追蹤功能
如需與 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 服務呼叫另一個服務,請按照下列步驟操作:
設定 Cloud Service Mesh
如要使用預設網址建立服務路徑,請將
Mesh
規格儲存到名為mesh.yaml
的檔案:name:
MESH_NAME
將
MESH_NAME
替換為網格資源名稱。執行下列指令,從規格匯入
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 記錄,請執行下列指令:
在 Cloud DNS 中為服務網格建立私有代管 DNS 區域。
gcloud dns managed-zones create
MESH_NAME
\ --description="Domain forDOMAIN_NAME
service mesh routes" \ --dns-name=DOMAIN_NAME
. \ --networks=VPC_NETWORK_NAME
\ --visibility=private在新建的不公開代管區域中建立 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 存取內部服務,請使用下列其中一種方法:
- 為虛擬私有雲網路設定私人 Google 存取權。 您不需要設定自訂 DNS 記錄。
- 將 Private Service Connect 端點附加至 Cloud Service Mesh。
這需要為預設
*.run.app
網址設定自訂 DNS 記錄,才能使用 Private Service Connect 端點位址。
建立目的地 Cloud Run 服務
請注意,Cloud Run 目的地無法停用預設網址。
部署新的或現有的 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)
執行下列指令,建立目的地 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 服務的名稱。
建立參照無伺服器 NEG 的內部自行管理後端服務。
建立後端服務:
gcloud compute backend-services create
DESTINATION_SERVICE_NAME
-REGION
\ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED將
DESTINATION_SERVICE_NAME
改為目的地服務名稱,並將REGION
改為區域名稱。將無伺服器後端新增至後端服務:
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
改為區域名稱。
建立參照後端服務的 HTTP 路由。
已設定
Mesh
資源和服務。使用HTTPRoute
資源將主機名稱與後端服務建立關聯。建立
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
:區域名稱。
使用
http_route.yaml
檔案中的規格建立HTTPRoute
資源:gcloud network-services http-routes import
DESTINATION_SERVICE_NAME
-route \ --source=http_route.yaml \ --location=global執行下列指令,在 Cloud Run 目的地服務上授予 Cloud Run 叫用者角色 (
roles/iam.invoker
):gcloud run services add-iam-policy-binding
DESTINATION_SERVICE_NAME
\ --regionREGION
\ --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 測試應用程式,將要求轉送至目的地路徑,請按照下列步驟操作:
執行下列指令,擷取您建立的 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。
使用
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 執行個體。
後續步驟
- 探索常見的 Cloud Run 網路設定,瞭解如何設定公有和私有網路
- 設定 Cloud Run 的私有網路
- 使用 HTTP 服務設定 Envoy Proxy
- 將 Cloud Run 服務的流量,導向 GKE 上的 Cloud Service Mesh 工作負載
- 將 Cloud Service Mesh 工作負載的流量轉送至 Cloud Run 服務