本教學課程說明如何將容器化網頁應用程式部署至 Google Kubernetes Engine (GKE) Autopilot 叢集,並在後端使用 Google Spanner 資料庫儲存資料。這個範例應用程式會管理遊戲玩家表格。你可以透過應用程式的圖形使用者介面 (GUI) 新增及刪除播放器。
Spanner 是全代管的關聯式資料庫服務,可水平擴充並分散在全球各地,提供 ACID 交易和 SQL 語意,同時兼顧效能和高可用性。
閱讀本頁面之前,請先熟悉 Kubernetes。
為何選擇 GKE 和 Spanner
開發人員可能不想花時間計算應用程式所需的儲存空間和運算資源量,也不想預測需求量波動期間的 RAM 和 CPU 消耗量,或擔心應用程式在尖峰負載時發生故障。
使用 GKE Autopilot 做為全代管 Kubernetes 服務,並使用 Spanner 做為全代管資料庫服務,您就能在穩定的基礎架構上更快開發及部署應用程式,簡化資源的設定和管理作業。GKE Autopilot 會根據執行階段需求,在叢集中新增或移除節點,藉此設定及調度資源,代管應用程式的基礎架構。同樣地,隨著儲存空間或運算需求變化,Spanner 也能動態水平擴展及縮減資源,且幾乎不需要手動介入。
舉例來說,假設您即將推出下一款熱門遊戲,預期會爆紅,因此在推出當週會吸引大量網路流量。Spanner 可讓您即時增加、減少或重新分配運算資源,同時透過 GKE Autopilot 維持應用程式的最高可用性,因應這類暴增的輸送量。
目標
在本教學課程中,您將瞭解以下內容:
建立 Spanner 資料庫,儲存玩家的登錄資料。
部署名為
hello-app-cloud-spanner的範例網頁應用程式,並使用圖形使用者介面。
下表說明您建立或使用的 Google Cloud 資源、識別這些資源的變數,以及本教學課程規定的值:
| 資源 | 變數 | 值 |
|---|---|---|
| Google Cloud 專案 ID | PROJECT_ID
|
建立專案時產生的專案 ID。
範例: |
| 運算區域 | COMPUTE_REGION |
要建立 Spanner 執行個體和 GKE 叢集的 Compute Engine 區域。建議您選擇最靠近客戶地理位置的區域,但在本教學課程中,請使用 |
| Spanner 執行個體 | - | hello-instance |
| Spanner 資料庫 | - | hello-database |
| GKE Autopilot 叢集 | CLUSTER_NAME |
hello-cluster |
| Kubernetes 命名空間 | NAMESPACE |
hello-namespace |
| Kubernetes 服務帳戶 | KSA_NAME |
ksa-helloapp |
| IAM 服務帳戶 | GSA_NAME |
gsa-helloapp |
| IAM 服務帳戶的專案 ID | GSA_PROJECT |
你的 Google Cloud PROJECT_ID。 |
為方便進行本教學課程,建議您建立新資源,這樣在部署範例應用程式後,就能輕鬆刪除這些資源,不必擔心造成任何風險。不過,如果您有現有的命名空間、IAM 服務帳戶和 Kubernetes 服務帳戶,也可以使用這些資源。
費用
在本文件中,您會使用下列 Google Cloud的計費元件:
- Compute Engine instances used by GKE
- Spanner
- Cloud Load Balancing
如要根據預測用量估算費用,請使用 Pricing Calculator。
完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」。
事前準備
請務必完成下列必要條件:
選取或建立專案
您可以使用現有專案,也可以為本教學課程建立新專案。
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
-
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 role
(
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 role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
啟用 API
啟用 Artifact Registry、Compute Engine、GKE 和 IAM 服務帳戶憑證 API。
啟用 API 時所需的角色
如要啟用 API,您需要服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色。
設定 Cloud Shell
在本教學課程中,您將使用 Cloud Shell 執行 gcloud 和 kubectl 指令。Cloud Shell 是殼層環境,用於管理託管在 Google Cloud的資源。這個環境已預先安裝 Google Cloud CLI 和 kubectl 指令列工具。
在 Google Cloud 控制台中啟用 Cloud Shell。
此時 Cloud Shell 工作階段會在控制台底部的頁框中開啟,
在本教學課程中執行指令前,請務必將預設專案設為要部署範例應用程式的專案 ID。如果尚未設定,請在 Cloud Shell 中執行下列指令:
gcloud config set project PROJECT_ID
將 PROJECT_ID 替換為專案 ID。
授予 IAM 角色
確認 Google Cloud 帳戶具備本教學課程所需的 IAM 角色。
將角色授予使用者帳戶。針對下列每個 IAM 角色,執行一次下列指令:
roles/iam.serviceAccountAdmin, roles/serviceusage.serviceUsageConsumer, roles/iam.serviceAccountUser, roles/iam.securityAdmin, roles/spanner.admin, roles/container.admin
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
更改下列內容:
PROJECT_ID:專案 ID。USER_IDENTIFIER:使用者帳戶的 ID。 例如:myemail@example.com。ROLE:授予使用者帳戶的 IAM 角色。
設定 Spanner
如要設定 Spanner,您需要建立 Spanner 執行個體和 Spanner 資料庫。
可建立 Spanner 執行個體
Spanner 執行個體是一種資源分配單位,在執行個體內建立的 Spanner 資料庫會使用個體內的資源。
建立名為 hello-instance 的 Spanner 執行個體,並採用地區設定和 100 個處理單元的運算容量。
gcloud spanner instances create hello-instance \
--config=regional-COMPUTE_REGION \
--description="Spanner sample instance" \
--processing-units=100
在本教學課程中,請將 COMPUTE_REGION 替換為 us-west1。
可建立 Spanner 資料庫
Spanner 資料庫包含資料表、檢視區塊和索引。資料庫會從上層執行個體繼承屬性,例如設定 (區域或多區域)、可用運算容量和儲存空間。
使用 GoogleSQL 方言建立名為 hello-database 的 Spanner 資料庫,其中有個名為 Players 的資料表。在 Cloud Shell 中執行下列查詢:
gcloud spanner databases create hello-database \
--instance=hello-instance \
--database-dialect=GOOGLE_STANDARD_SQL \
--ddl="CREATE TABLE Players (
PlayerUuid STRING(36) NOT NULL,
FirstName STRING(1024),
LastName STRING(1024),
BirthDate DATE) PRIMARY KEY(PlayerUuid)"
建立 GKE Autopilot 叢集
設定 Spanner 後,請建立 Autopilot 叢集,並使用 Workload Identity Federation for GKE,以安全且易於管理的方式存取資料庫。
建立名為 hello-cluster 的 Autopilot 叢集。Autopilot 叢集預設會啟用 Workload Identity Federation for GKE。
gcloud container clusters create-auto CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION
更改下列內容:
CLUSTER_NAME:hello-clusterCONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 區域。在本教學課程中,請使用您建立 Spanner 執行個體的相同區域us-west1。建議您在相同區域內建立 Spanner 執行個體和 GKE Autopilot 叢集,以縮短延遲時間。
建立叢集最多可能需要 8 到 10 分鐘。
輸出結果會與下列內容相似:
NAME: hello-cluster LOCATION: us-west1 MASTER_VERSION: 1.26.5-gke.1200 MASTER_IP: 192.0.2.1 MACHINE_TYPE: e2-medium NODE_VERSION: 1.26.5-gke.1200 NUM_NODES: 3 STATUS: RUNNING
設定叢集以使用 Workload Identity Federation for GKE
部署應用程式前,請先設定叢集,透過 GKE 適用的工作負載身分聯盟向 Google Cloud 進行驗證。
取得憑證來存取叢集:
gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION更改下列內容:
CLUSTER_NAME:hello-clusterCONTROL_PLANE_LOCATION:us-west1
這會更新
kubeconfig檔案,加入適當的憑證和端點資訊,將kubectl指向叢集。建立要用於 Kubernetes 服務帳戶的命名空間。您也可以使用預設命名空間或任何現有命名空間。
kubectl create namespace NAMESPACE將
NAMESPACE替換為hello-namespace,也就是您要建立的新命名空間名稱。為應用程式建立 Kubernetes 服務帳戶:
kubectl create serviceaccount KSA_NAME \ --namespace NAMESPACE更改下列內容:
KSA_NAME:ksa-helloapp,您要建立的新 Kubernetes 服務帳戶名稱。NAMESPACE:hello-namespace
為應用程式建立 IAM 服務帳戶:
gcloud iam service-accounts create GSA_NAME \ --project=GSA_PROJECT更改下列內容:
GSA_NAME:gsa-helloapp,您要建立的新 IAM 服務帳戶名稱。GSA_PROJECT:您的 Google Cloud專案 ID。在本教學課程中,您會在部署範例應用程式的 Google Cloud 專案中建立 IAM 服務帳戶。因此,GSA_PROJECT和Google CloudPROJECT_ID相同。
為 IAM 服務帳戶新增 IAM 政策繫結,以便讀取及寫入 Spanner:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/spanner.admin"更改下列內容:
PROJECT_ID:您的 Google Cloud 專案 IDGSA_NAME:gsa-helloapp
範例:
gcloud projects add-iam-policy-binding my-gcp-project \ --member "serviceAccount:gsa-helloapp@my-gcp-project.iam.gserviceaccount.com" \ --role "roles/spanner.admin"
在兩個服務帳戶之間新增 IAM 政策繫結,允許 Kubernetes 服務帳戶模擬 IAM 服務帳戶。這個繫結可讓 Kubernetes 服務帳戶做為 IAM 服務帳戶,以便 Kubernetes 服務帳戶讀取及寫入 Spanner。
gcloud iam service-accounts add-iam-policy-binding GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"更改下列內容:
GSA_NAME:gsa-helloappGSA_PROJECT:您的 Google Cloud 專案 IDPROJECT_ID:您的 Google Cloud 專案 IDNAMESPACE:hello-namespaceKSA_NAME:ksa-helloapp
範例:
gcloud iam service-accounts add-iam-policy-binding gsa-helloapp@my-gcp-project.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:my-gcp-project.svc.id.goog[hello-namespace/ksa-helloapp]"
註解 Kubernetes 服務帳戶,並提供 IAM 服務帳戶的電子郵件地址。這樣範例應用程式就能知道要使用哪個服務帳戶存取服務 Google Cloud 。因此,當應用程式使用任何標準 Google API 用戶端程式庫存取服務時,會使用該 IAM 服務帳戶。 Google Cloud
kubectl annotate serviceaccount KSA_NAME \ --namespace NAMESPACE \ iam.gke.io/gcp-service-account=GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com更改下列內容:
KSA_NAME:ksa-helloappNAMESPACE:hello-namespaceGSA_NAME:gsa-helloappGSA_PROJECT:您的 Google Cloud 專案 ID
範例:
kubectl annotate serviceaccount ksa-helloapp \ --namespace hello-namespace \ iam.gke.io/gcp-service-account=gsa-helloapp@my-gcp-project.iam.gserviceaccount.com
將範例應用程式部署至叢集
您已透過必要的服務和驗證設定 GKE 和 Spanner,現在可以部署範例應用程式 hello-app-cloud-spanner。
將 GitHub 存放區中的範例應用程式複製到 Cloud Shell:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git按一下終端機視窗工具列中的「開啟編輯器」,啟動 Cloud Shell 編輯器。

詳情請參閱「Cloud Shell 編輯器介面總覽」。
開啟 Cloud Shell 編輯器的 Explorer 窗格,然後瀏覽至
kubernetes-engine-samples/databases/hello-app-cloud-spanner/k8s目錄。開啟
deployment.yaml檔案,然後將<KSA_NAME>替換為 Kubernetes 服務帳戶名稱ksa-helloapp,更新serviceAccountName欄位。
圖 1:在部署檔案中更新 Kubernetes 服務帳戶名稱。 關閉 Cloud Shell 編輯器,然後返回 Cloud Shell 終端機。
在 Cloud Shell 終端機中,前往
hello-app-cloud-spanner目錄:cd kubernetes-engine-samples/databases/hello-app-cloud-spanner部署應用程式:
kubectl apply -f k8s/deployment.yaml -n=NAMESPACE將
NAMESPACE替換為hello-namespace。等待應用程式以
STATUS部署為Running:kubectl get pods -n=NAMESPACE --watch將
NAMESPACE替換為hello-namespace。輸出結果會與下列內容相似:
NAME READY STATUS RESTARTS AGE hello-app-cloud-spanner-765c9b8779-lfcrc 0/1 ContainerCreating 0 87s hello-app-cloud-spanner-765c9b8779-lfcrc 1/1 Running 0 3m15s按下鍵盤上的 Ctrl+C 鍵,返回命令提示字元以執行其他指令。
將範例應用程式公開發布到網際網路
如要從叢集外部公開發布 Kubernetes Service,請建立類型為 LoadBalancer 的 Service。這種類型的 Service 會為 Pod 產生外部負載平衡器 IP 位址,可透過網際網路存取。
部署負載平衡器:
kubectl apply -f k8s/service.yaml -n=NAMESPACE將
NAMESPACE替換為hello-namespace。等待系統指派外部 IP 位址:
kubectl get service -n=NAMESPACE --watch將
NAMESPACE替換為hello-namespace。指派完成後,請複製
EXTERNAL-IP(例如203.0.113.0) 並在瀏覽器中開啟。系統會開啟網頁介面,顯示及管理玩家資料庫。您可以使用應用程式 GUI 建立或刪除玩家記錄,並儲存在 Spanner 資料庫中。
圖 2. 在註冊資料庫中建立或刪除玩家。 執行下列查詢,確認 Spanner 資料庫是否已更新您的項目:
gcloud spanner databases execute-sql hello-database \ --instance=hello-instance \ --sql="SELECT * FROM Players LIMIT 10"輸出結果會與下列內容相似:
PlayerUuid: a1f34bbf-929c-498d-8b16-39bbb29d70e3 FirstName: John LastName: Smith BirthDate: 1997-07-12 PlayerUuid: d634e157-96ea-45f2-be3f-fb907ced188e FirstName: Jane LastName: Doe BirthDate: 2013-07-12
清除所用資源
為避免因為本教學課程所用資源,導致系統向 Google Cloud 帳戶收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。
刪除專案
如要避免付費,最簡單的方法就是刪除您為本教學課程建立的專案。
刪除 Google Cloud 專案:
gcloud projects delete PROJECT_ID
如果您已刪除專案,則清理作業完成。如果沒有刪除專案,請繼續刪除 GKE 和 Spanner 資源。
刪除 GKE 資源
刪除服務。這麼做會取消分配為您的服務所建立的 Google Cloud 負載平衡器:
kubectl delete service hello-app-cloud-spanner -n=NAMESPACE將
NAMESPACE替換為hello-namespace。刪除 GKE 叢集。這會刪除構成叢集的資源,例如運算執行個體、磁碟和網路資源:
gcloud container clusters delete CLUSTER_NAME --location=CONTROL_PLANE_LOCATION
刪除 Spanner 資源
刪除 Spanner 資料庫:
gcloud spanner databases delete hello-database --instance=hello-instance刪除 Spanner 執行個體:
gcloud spanner instances delete hello-instance