本教學課程說明如何在非執行於Google Cloud的 Kubernetes 叢集上,部署簡單的範例 gRPC 服務和可擴充服務 Proxy (ESP)。本教學課程使用 Python 版本的 bookstore-grpc
範例。如需其他語言的 gRPC 範例,請參閱「後續步驟」一節。
本教學課程使用範例程式碼與 ESP 預先建構的容器映像檔,這些映像檔儲存在 Artifact Registry 中。如果您對於容器不熟悉,請參閱以下詳細資訊:
如需 Cloud Endpoints 的總覽,請參閱關於 Endpoints 和 Endpoints 架構。
目標
請根據以下的主要工作清單,逐步進行本教學課程的各個步驟。您必須完成所有工作才能成功傳送要求至 API。
- 設定 Google Cloud 專案,並下載必要軟體。請參閱事前準備。
- 從
bookstore-grpc
範例複製並設定檔案。請參閱設定 Cloud Endpoints 一節。 - 部署 Endpoints 設定以建立 Endpoints 服務。請參閱部署 Endpoints 設定一節。
- 為您的 Endpoints 服務建立憑證。請參閱為服務建立憑證一節。
- 建立後端來提供及部署 API。請參閱部署 API 後端一節。
- 取得服務的外部 IP 位址。詳情請參閱取得服務的外部 IP 位址一節。
- 傳送要求至 API。請參閱傳送要求至 API 一節。
- 避免系統向您的 Google Cloud 帳戶收取費用。請參閱「清除所用資源」一節。
費用
In this document, you use the following billable components of Google Cloud:
To generate a cost estimate based on your projected usage,
use the pricing calculator.
When you finish the tasks that are described in this document, you can avoid continued billing by deleting the resources that you created. For more information, see Clean up.
事前準備
本教學課程假設您已完成 Minikube 或 Kubernetes 叢集設定。詳情請參閱 Kubernetes 說明文件。
- 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.
-
Make sure 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.
-
Make sure that billing is enabled for your Google Cloud project.
- 記下 Google Cloud 專案 ID,後續步驟將會用到。
- 安裝並初始化 gcloud 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
替換為您的 Google Cloud 專案 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
指令。這個指令使用了服務基礎架構,也就是 Google 的基礎服務平台。Endpoints 和其他服務都是使用這個基礎架構來建立和管理 API 及服務。
- 確認您所在的目錄有
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」頁面。系統會在「Service name」欄下方顯示可能的 ENDPOINTS_SERVICE_NAME 清單。
針對 OpenAPI,ENDPOINTS_SERVICE_NAME 是您在 OpenAPI 規格
host
欄位中指定的值。針對 gRPC,ENDPOINTS_SERVICE_NAME 是您在 gRPC Endpoints 設定的name
欄位中指定的值。
如要進一步瞭解 gcloud
指令,請參閱 gcloud
服務。
如果您收到錯誤訊息,請參閱排解 Endpoints 設定部署問題一文。
詳情請參閱「部署 Endpoints 設定」一文。
為服務建立憑證
為了妥善管理您的 API,ESP 和 ESPv2 都需要使用服務基礎架構中的服務。ESP 和 ESPv2 必須使用存取憑證才能呼叫這些服務。當您將 ESP 或 ESPv2 部署至 GKE 或 Compute Engine 等 Google Cloud 環境時,ESP 和 ESPv2 會透過 Google Cloud 中繼資料服務為您取得存取憑證。
如果您要將 ESP 或 ESPv2 部署至非Google Cloud 環境 (例如本機電腦、內部部署的 Kubernetes 叢集,或是其他雲端服務平台),則必須提供含有私密金鑰的服務帳戶 JSON 檔案。ESP 和 ESPv2 會使用服務帳戶產生存取權杖,以呼叫管理 API 所需的服務。
您可以使用 Google Cloud 控制台或 Google Cloud CLI 建立服務帳戶和私密金鑰檔案:
控制台
- 在 Google Cloud 控制台中,開啟「Service Accounts」(服務帳戶) 頁面。
- 按一下 [Select a project] (選取專案)。
- 選取您已建立 API 的專案,並按一下 [Open] (開啟)。
- 按一下 [+ Create Service Account] (+ 建立服務帳戶)。
- 在「Service account name」(服務帳戶名稱) 欄位中,輸入服務帳戶的名稱。
- 按一下 [建立]。
- 按一下「繼續」。
- 按一下 [完成]。
- 按一下新建立的服務帳戶電子郵件地址。
- 點選「金鑰」。
- 依序點選「新增金鑰」和「建立新的金鑰」。
按一下「建立」,JSON 金鑰檔案會下載至您的電腦。
請務必妥善保存金鑰檔案,因為此檔案可當做服務帳戶進行驗證。您可以任意移動及重新命名這個檔案。
按一下 [關閉]。
gcloud
輸入以下指令,以顯示Google Cloud 專案的專案 ID:
gcloud projects list
替換以下指令中的 PROJECT_ID,將預設專案設為您的 API 所在的專案:
gcloud config set project PROJECT_ID
確認 Google Cloud CLI (
gcloud
) 已取得授權,可存取您在 Google Cloud中的資料與服務:gcloud auth login
如果您有多個帳戶,請務必選擇 API 所在之 Google Cloud 專案中的帳戶。如果您執行
gcloud auth list
,則您選取的帳戶會顯示為專案的有效帳戶。如要建立服務帳戶,請執行下列指令,並將 SERVICE_ACCOUNT_NAME 和
My Service Account
替換為您要使用的名稱及顯示名稱:gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \ --display-name "My Service Account"
指令會為服務帳戶指派電子郵件地址,格式如下:
SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
後續指令將會用到這個電子郵件地址。
建立服務帳戶金鑰檔案:
gcloud iam service-accounts keys create ~/service-account-creds.json \ --iam-account SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
新增必要的 IAM 角色:
本節說明 ESP 和 ESPv2 使用的 IAM 資源,以及附加服務帳戶存取這些資源所需的 IAM 角色。
端點服務設定
ESP 和 ESPv2 會呼叫 Service Control,後者會使用 Endpoints 服務設定。端點服務設定是 IAM 資源,ESP 和 ESPv2 需要Service Controller 角色才能存取。
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 服務,將 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
是已附加的服務帳戶。詳情請參閱「
什麼是角色和權限?」。
如要進一步瞭解指令,請參閱 gcloud iam service-accounts
。
部署 API 後端
到目前為止,您已將服務設定部署至 Service Management,但尚未部署為 API 後端提供服務的程式碼。本節會逐步引導您針對 API 範例和 ESP,將預先建置的容器部署至 Kubernetes。
為 ESP 提供服務憑證
在容器內部執行的 ESP 必須能存取儲存在本機 service-account-creds.json
檔案中的憑證。如果要讓 ESP 能存取憑證,您可以建立 Kubernetes 密鑰,並將 Kubernetes 密鑰掛接成 Kubernetes 磁碟區。
如何建立 Kubernetes 密鑰並掛接磁碟區:
如果您使用 Google Cloud 主控台建立服務帳戶,請將 JSON 檔案重新命名為
service-account-creds.json
。將檔案移至api_descriptor.pb
和api_config.yaml
所在的相同目錄中。使用服務帳戶憑證建立 Kubernetes 密鑰:
kubectl create secret generic service-account-creds --from-file=service-account-creds.json
成功後,您會看見此訊息:
secret "service-account-creds" created
。
您用來將 API 和 ESP 部署至 Kubernetes 的部署資訊清單檔案,已包含密鑰磁碟區,如下列檔案的兩個區段所示:
設定服務名稱並啟動服務
ESP 必須知道您的服務名稱,才能使用 gcloud endpoints services deploy
指令找出先前部署的設定。
如何設定服務名稱及啟動服務:
將部署資訊清單檔案
k8s-grpc-bookstore.yaml
的複本儲存至service-account-creds.json
所在的相同目錄中。開啟
k8s-grpc-bookstore.yaml
,並將 SERVICE_NAME 替換為 Endpoints 服務名稱。這是您在api_config.yaml
檔案的name
欄位中設定的名稱相同。--rollout_strategy=managed
選項可將 ESP 設為使用最新部署的服務設定。指定此選項時,在您部署新服務設定後 5 分鐘內,ESP 會偵測到變更並自動開始使用新設定。建議您指定此選項而非讓 ESP 使用特定的設定 ID。 如要進一步瞭解 ESP 引數,請參閱 ESP 啟動選項一文。啟動服務以在 Kubernetes 上部署服務:
kubectl create -f k8s-grpc-bookstore.yaml
如果您看到類似以下內容的錯誤訊息:
The connection to the server localhost:8080 was refused - did you specify the right host or port?
這表示您未正確設定
kubectl
,詳情請參閱「設定kubectl
」。
取得服務的外部 IP 位址
您需要取得服務的外部 IP 位址,才能向範例 API 傳送要求。當您在容器中啟動服務後,系統可能需要幾分鐘的時間才能備妥外部 IP 位址。
查看外部 IP 位址:
kubectl get service
記下
EXTERNAL-IP
的值,然後將它儲存在 SERVER_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
傳送要求至範例 API:
python bookstore_client.py --host SERVER_IP --port 80
在「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
後續步驟
- 瞭解如何為 Endpoints 設定您自己的 gRPC API。
- 設定 DNS:
- 詳閱 GitHub 上的 Bookstore 範例應用程式。用戶端和伺服器都提供 Python 與 Java 版本。
- 您可以在 GitHub 取得下列程式語言的
getting-started-grpc
範例: