本教學課程說明如何以 Google Kubernetes Engine (GKE) 的可擴充服務 Proxy V2 (ESPv2) 部署一個簡易的 gRPC 服務範例。本教學課程使用 Python 版本的 bookstore-grpc 範例。如需其他語言的 gRPC 範例,請參閱後續步驟一節。
本教學課程使用範例程式碼與 ESPv2 預先建構的容器映像檔,這些映像檔儲存在 Artifact Registry 中。如果您對於容器不熟悉,請參閱以下詳細資訊:
如需 Cloud Endpoints 的總覽,請參閱關於 Endpoints 和 Endpoints 架構。
目標
請根據以下的主要工作清單,逐步進行本教學課程的各個步驟。您必須完成所有工作才能成功傳送要求至 API。
- 設定 Google Cloud 專案,並下載必要軟體。請參閱「事前準備」。
- 從 bookstore-grpc範例複製並設定檔案。詳情請參閱設定 Endpoints 一節。
- 部署 Endpoints 設定以建立 Endpoints 服務。請參閱部署 Endpoints 設定一節。
- 建立後端來提供及部署 API。請參閱部署 API 後端一節。
- 取得服務的外部 IP 位址。詳情請參閱取得服務的外部 IP 位址一節。
- 傳送要求至 API。請參閱傳送要求至 API 一節。
- 避免系統向您的 Google Cloud 帳戶收取相關費用。 請參閱「清除所用資源」。
費用
在本文件中,您會使用下列 Google Cloud的計費元件:
 
 
 
如要根據預測用量估算費用,請使用 Pricing Calculator。
完成本文所述工作後,您可以刪除已建立的資源,避免繼續計費。詳情請參閱清除所用資源一節。
事前準備
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- 
    
    
      In the Google Cloud console, on the project selector page, select or create a Google Cloud project. Roles required to select or create a project - Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
- 
      Create a project: To create a project, you need the Project Creator
      (roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
 
- 
  
    Verify that billing is enabled for your Google Cloud project. 
- 
    
    
      In the Google Cloud console, on the project selector page, select or create a Google Cloud project. Roles required to select or create a project - Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
- 
      Create a project: To create a project, you need the Project Creator
      (roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
 
- 
  
    Verify that billing is enabled for your Google Cloud project. 
- 記下 Google Cloud 專案 ID,後續步驟將會用到。
- 安裝並初始化 Google Cloud CLI。
- 更新 gcloud CLI 並安裝 Endpoints 元件。
    gcloud components update 
- 確認 Google Cloud CLI (gcloud) 已取得授權,可存取您在 Google Cloud上的資料與服務:gcloud auth login 
- 將預設專案設為您的專案 ID。gcloud config set project YOUR_PROJECT_ID 將 YOUR_PROJECT_ID 替換為您的專案 ID。 如果您有其他 Google Cloud 專案,並想使用 gcloud加以管理,請參閱管理 gcloud CLI 設定。
- 安裝 kubectl:gcloud components install kubectl 
- 取得新的使用者憑證以做為應用程式預設憑證使用。您需要使用者憑證才能對 kubectl進行授權。gcloud auth application-default login 
- 按照 gRPC Python 快速入門導覽課程中的步驟安裝 gRPC 和 gRPC 工具。
設定 Endpoints
bookstore-grpc 範例包含了需要在本機複製及設定的檔案。
- 從您的服務 .proto檔案中建立獨立的 protobuf 描述元檔案:- 儲存範例存放區中的 
bookstore.proto副本,這個檔案定義了 Bookstore 服務的 API。
- 建立以下目錄:mkdir generated_pb2
- 使用 protoc通訊協定緩衝區編譯器建立描述元檔案api_descriptor.pb。在儲存bookstore.proto的目錄中執行下列指令:python -m grpc_tools.protoc \ --include_imports \ --include_source_info \ --proto_path=. \ --descriptor_set_out=api_descriptor.pb \ --python_out=generated_pb2 \ --grpc_python_out=generated_pb2 \ bookstore.proto 在上述指令中, --proto_path會設為目前的工作目錄。在您的 gRPC 建構環境中,如果您為.proto輸入檔案使用不同的目錄,請變更--proto_path以讓編譯器能夠搜尋您儲存bookstore.proto的目錄。
 
- 儲存範例存放區中的 
- 建立 gRPC API 設定 YAML 檔案:
- 請儲存 
api_config.yaml檔案的副本。這個檔案定義了 Bookstore 服務的 gRPC API 設定。
- 將 api_config.yaml檔案中的 MY_PROJECT_ID 替換為您的 Google Cloud 專案 ID。例如:# # Name of the service configuration. # name: bookstore.endpoints.example-project-12345.cloud.goog 請注意,這個檔案中的 apis.name欄位值必須與.proto檔案中的完整 API 名稱完全相同,否則無法部署。Bookstore 服務會在套件endpoints.examples.bookstore內的bookstore.proto中定義。其完整的 API 名稱為endpoints.examples.bookstore.Bookstore,就像api_config.yaml檔案中的名稱一樣。apis: - name: endpoints.examples.bookstore.Bookstore 
 
- 請儲存 
詳情請參閱設定 Endpoints。
部署 Endpoints 設定
如要部署 Endpoints 設定,請使用 gcloud endpoints services deploy 指令。這個指令使用 Service Management 建立代管服務。
- 確認您所在的目錄有 api_descriptor.pb和api_config.yaml檔案。
- 確認 gcloud指令列工具目前使用的預設專案,就是您要部署 Endpoints 設定的 Google Cloud 專案。請利用下列指令傳回的專案 ID 進行驗證,以確保系統沒有將服務建立在錯誤的專案中。gcloud config list project 如要變更預設的專案,請執行下列指令: gcloud config set project YOUR_PROJECT_ID 
- 使用 Google Cloud CLI 部署 proto descriptor檔案和設定檔:gcloud endpoints services deploy api_descriptor.pb api_config.yaml Service Management 在建立並設定服務時,會把資訊輸出到終端機。部署完成後,您將看到類似以下的訊息: Service Configuration [CONFIG_ID] uploaded for service [bookstore.endpoints.example-project.cloud.goog] CONFIG_ID 是部署作業建立的 Endpoints 服務設定 ID。例如: Service Configuration [2017-02-13r0] uploaded for service [bookstore.endpoints.example-project.cloud.goog] 在上方範例中, 2017-02-13r0是服務設定 ID,bookstore.endpoints.example-project.cloud.goog則是服務名稱。服務設定 ID 是由一個日期戳記和一個修訂版本編號所組成。如果您在同一天再次部署 Endpoints 設定,服務設定 ID 中的修訂編號將會增加。
檢查必要服務
Endpoints 和 ESP 至少需要啟用下列 Google 服務:| 名稱 | 標題 | 
|---|---|
| servicemanagement.googleapis.com | Service Management API | 
| servicecontrol.googleapis.com | Service Control API | 
在大多數情況下,gcloud endpoints services deploy 指令會啟用這些必要服務。不過在以下情況中,即便您成功執行 gcloud 指令,還是無法啟用必要服務:
- 您使用 Terraform 之類的第三方應用程式,而其中未包含這些服務。 
- 您已將 Endpoints 設定部署至現有Google Cloud 專案,但在專案中已明確停用這些服務。 
請使用下列指令確認必要服務已啟用:
gcloud services list
如果必要的服務並未列出,請執行下列指令加以啟用:
gcloud services enable servicemanagement.googleapis.com
gcloud services enable servicecontrol.googleapis.com同時啟用 Endpoints 服務:
gcloud services enable ENDPOINTS_SERVICE_NAME
如要判斷 ENDPOINTS_SERVICE_NAME,您可以採取下列任一做法:
- 部署 Endpoints 設定後,請前往 Cloud 控制台的「Endpoints」頁面。「服務名稱」欄下方會顯示可能的 ENDPOINTS_SERVICE_NAME 清單。 
- 如果是 OpenAPI,ENDPOINTS_SERVICE_NAME 是您在 OpenAPI 規格的 - host欄位中指定的內容。如果是 gRPC,ENDPOINTS_SERVICE_NAME 是您在 gRPC Endpoints 設定的- name欄位中指定的內容。
如要進一步瞭解 gcloud 指令,請參閱 gcloud 服務。
如果您收到錯誤訊息,請參閱排解 Endpoints 設定部署問題一文。
詳情請參閱部署 Endpoints 設定一文。
部署 API 後端
到目前為止,您已將服務設定部署到 Service Management,但尚未部署為 API 後端提供服務的程式碼。本節將指導您建立一個 GKE 叢集以託管 API 後端與部署 API。
建立容器叢集
叢集需要別名 IP,才能使用容器原生負載平衡。如要為此範例建立具有 IP 別名的容器叢集:
gcloud container clusters create espv2-demo-cluster \
    --enable-ip-alias \
    --create-subnetwork="" \
    --network=default \
    --zone=us-central1-a
上述指令會建立一個名為 espv2-demo-cluster 的叢集,而 us-central1-a 區域含有一個自動佈建的子網路。
將 kubectl 驗證至容器叢集
如要使用 kubectl 來建立並管理叢集資源,您必須取得叢集憑證以供 kubectl 使用。如要進行這項操作,請執行下列指令,將 NAME 替換為您的新叢集名稱,並將 ZONE 替換為其叢集區域。
gcloud container clusters get-credentials NAME --zone ZONE
檢查必要權限
ESP 和 ESPv2 會呼叫 Google 服務,這些服務使用 IAM 驗證呼叫身分是否具備足夠的權限,可存取使用的 IAM 資源。呼叫身分是部署 ESP 和 ESPv2 的附加服務帳戶。
部署在 GKE Pod 中時,附加的服務帳戶是節點服務帳戶。通常是 Compute Engine 預設服務帳戶。請按照這份 權限建議 選擇適當的節點服務帳戶。
如果使用 Workload Identity,可以透過節點服務帳戶以外的服務帳戶與 Google 服務通訊。您可以為 Pod 建立 Kubernetes 服務帳戶,以便執行 ESP 和 ESPv2,並建立 Google 服務帳戶,然後將 Kubernetes 服務帳戶與 Google 服務帳戶建立關聯。
請按照這些 步驟,將 Kubernetes 服務帳戶與 Google 服務帳戶建立關聯。這個 Google 服務帳戶就是附加的服務帳戶。
如果附加的服務帳戶是專案的 Compute Engine 預設服務帳戶,且端點服務設定部署在同一個專案中,服務帳戶應有足夠的權限存取 IAM 資源,因此可以略過 IAM 角色設定步驟。否則,應將下列 IAM 角色新增至附加的服務帳戶。
新增必要的 IAM 角色:
本節說明 ESP 和 ESPv2 使用的 IAM 資源,以及附加服務帳戶存取這些資源時所需的 IAM 角色。
端點服務設定
ESP 和 ESPv2 會呼叫 Service Control,後者會使用端點服務設定。端點服務設定是 IAM 資源,ESP 和 ESPv2 需要服務控制器角色才能存取。
IAM 角色位於端點服務設定中,而非專案。 一個專案可能有多個端點服務設定。
使用下列 gcloud 指令,將角色新增至端點服務設定的附加服務帳戶。
gcloud endpoints services add-iam-policy-binding SERVICE_NAME \ --member serviceAccount:SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.com \ --role roles/servicemanagement.serviceController
其中
* SERVICE_NAME 是端點服務名稱
* SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.com
是附加的服務帳戶。
Cloud Trace
ESP 和 ESPv2 會呼叫 
Cloud Trace 服務,將追蹤記錄匯出至專案。這個專案稱為追蹤專案。在 ESP 中,追蹤專案和擁有端點服務設定的專案相同。在 ESPv2 中,追蹤專案可透過 --tracing_project_id 旗標指定,預設為部署專案。
ESP 和 ESPv2 需要 Cloud Trace 代理者角色,才能啟用 Cloud Trace。
使用下列 gcloud 指令,將角色新增至附加的服務帳戶:
gcloud projects add-iam-policy-binding TRACING_PROJECT_ID \ --member serviceAccount:SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudtrace.agent
其中
* TRACING_PROJECT_ID 是追蹤專案 ID
* SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.com
是附加的服務帳戶。
詳情請參閱
  何謂角色和權限?
設定 SSL 金鑰和憑證
容器原生負載平衡使用 HTTP2 LB,必須經過 TLS 加密。這項作業需要在 GKE Ingress 和 ESPv2 中部署 TLS 憑證。您可以自備憑證,也可以使用自行簽署的憑證。
- 使用 openssl 建立自行簽署的憑證和金鑰。 系統要求輸入「Common Name(CN)」時,請務必輸入相同的 FQDN - bookstore.endpoints.MY_PROJECT_ID.cloud.goog。用戶端會使用這個名稱驗證伺服器憑證。- openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout ./server.key -out ./server.crt 
- 使用您的 SSL 金鑰和憑證建立 Kubernetes 密鑰。請注意,憑證會複製到 - server.crt和- tls.crt這兩個位置,因為密鑰會提供給 GKE Ingress 和 ESPv2。GKE Ingress 會尋找憑證路徑- tls.crt,ESPv2 則會尋找憑證路徑- server.crt。- kubectl create secret generic esp-ssl \ --from-file=server.crt=./server.crt --from-file=server.key=./server.key \ --from-file=tls.crt=./server.crt --from-file=tls.key=./server.key 
將範例 API 和 ESPv2 部署至叢集
將範例 gRPC 服務部署至叢集,讓客戶端可使用該服務:
- git clone這個存放區,然後開啟並編輯 grpc-bookstore.yaml 部署資訊清單檔案。
- 將 SERVICE_NAME 替換為 Ingress 和 ESPv2 容器的 Endpoints 服務名稱。此名稱與您在 api_config.yaml檔案的name欄位中設定的名稱相同。--rollout_strategy=managed選項會將 ESPv2 設定為使用最新部署的服務設定。指定此選項時,在您部署新服務設定後一分鐘內,ESPv2 會偵測到變更並自動開始使用新設定。建議您指定此選項,而非提供 ESPv2 使用的特定設定 ID。 如要進一步瞭解 ESPv2 引數,請參閱 ESPv2 啟動選項。例如: spec: containers: - name: esp image: gcr.io/endpoints-release/endpoints-runtime:2 args: [ "--listener_port=9000", "--service=bookstore.endpoints.example-project-12345.cloud.goog", "--rollout_strategy=managed", "--backend=grpc://127.0.0.1:8000" ]將服務設定部署至 Endpoints如果您在同一個 Google Cloud 專案中執行大量端點 (超過 100 個),建議您為容器掛接服務設定,而不是使用 --rollout_strategy=managed標記從 Service Management API 提取服務設定。Service Management API 設有預設配額。如果大量 ESPv2 Proxy 使用 請按照下列步驟掛接服務設定:--rollout_strategy=managed,這些 Proxy 都會輪詢最新的服務設定。機群可能超出配額,導致服務設定更新失敗。- 下載服務設定 JSON 檔案。
- 從 JSON 設定建立 Kubernetes ConfigMap 資源。
-  將設定對應資源掛接到容器,並使用 --service_config_path標記指定設定檔的路徑。
 curl -o "/tmp/service_config.json" -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://servicemanagement.googleapis.com/v1/services/SERVICE/configs/CONFIG_ID?view=FULL" kubectl create configmap service-config-configmap \ --from-file=service_config.json:/tmp/service_config.json 例如: containers: - args: - --listener_port=8081 - --backend=http://127.0.0.1:8080 - --service_json_path=/etc/espv2_config/service_config.json - --healthz=/healthz image: gcr.io/endpoints-release/endpoints-runtime:2 name: esp ports: - containerPort: 8081 protocol: TCP volumeMounts: - mountPath: /etc/espv2_config name: service-config-volume volumes: - configMap: defaultMode: 420 name: service-config-configmap name: service-config-volume
- 啟動服務:kubectl create -f grpc-bookstore.yaml 
如果您收到錯誤訊息,請參閱在 GKE 中疑難排解 Endpoints 一文。
取得服務的外部 IP 位址
您需要取得服務的外部 IP 位址,才能向範例 API 傳送要求。當您在容器中啟動服務後,系統可能需要幾分鐘的時間才能備妥外部 IP 位址。
- 查看外部 IP 位址: - kubectl get ingress 
- 記下 - EXTERNAL-IP的值,並儲存在 SERVER_IP 環境變數中。系統會使用外部 IP 位址將要求傳送至範例 API。- export SERVER_IP=YOUR_EXTERNAL_IP 
傳送要求至 API
如要傳送要求至範例 API,您可以使用以 Python 編寫的範例 gRPC 用戶端。
- 複製託管 gRPC 用戶端程式碼的 git 存放區: - git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git 
- 變更您的工作目錄: - cd python-docs-samples/endpoints/bookstore-grpc/ 
- 安裝依附元件: - pip install virtualenv- virtualenv env- source env/bin/activate- python -m pip install -r requirements.txt
- 為自行簽署的憑證建立根 CA - openssl x509 -in server.crt -out client.pem -outform PEM 
- 傳送要求至範例 API: - python bookstore_client.py --host SERVER_IP --port 443 \ --servername bookstore.endpoints.MY_PROJECT_ID.cloud.goog --use_tls true --ca_path=client.pem - 在「Endpoints」>「Services」(服務) 頁面中查看 API 的活動圖表。 
 - 要求可能需要一些時間才能反映在圖表中。 
- 在「Logs Explorer」(記錄檔探索工具) 頁面中查看您的 API 要求記錄。 
 
 
如果您未取得成功的回應,請參閱排解回應錯誤一文。
您已在 Endpoints 中部署並測試了 API!
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本教學課程中所用資源的相關費用,請刪除含有該項資源的專案,或者保留專案但刪除個別資源。
- 刪除 API: - gcloud endpoints services delete SERVICE_NAME - 將 SERVICE_NAME 替換為您的 API 名稱。 
- 刪除 GKE 叢集: - gcloud container clusters delete NAME --zone ZONE