本教學課程說明如何使用 Spanner 資料庫後端,在 Google Kubernetes Engine (GKE) Autopilot 叢集上部署容器化網頁應用程式。您可以使用 GKE Autopilot 叢集和 Spanner,建構及部署可擴充且可靠的網頁應用程式,不必管理複雜的基礎架構。GKE 會自動佈建及管理 Kubernetes 叢集資源,減少作業負擔。Spanner 是全代管的全球分散式關聯資料庫,可提供高效能和高可用性,並支援 ACID 交易和 SQL 語意。
閱讀本頁內容前,請務必先熟悉 Kubernetes。
這份文件適用於開發人員和雲端平台管理員。如要進一步瞭解 內容中 Google Cloud 提及的常見角色和範例工作, 請參閱「常見的 GKE 使用者角色和 工作」。
為何選擇 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 區域 | 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 服務帳戶憑證和 Spanner API。
啟用 API 時所需的角色
如要啟用 API,您必須具備 serviceusage.services.enable 權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。
設定 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 服務帳戶,以便讀取及寫入 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]"
使用 IAM 服務帳戶的電子郵件地址為 Kubernetes 服務帳戶加註。這樣一來,範例應用程式就能知道要使用哪個服務帳戶存取 Google Cloud 服務。因此,當應用程式使用任何標準的 Google API 用戶端程式庫存取 Google Cloud 服務時,會使用該 IAM 服務帳戶。
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檔案,然後將serviceAccountName欄位中的<KSA_NAME>替換為ksa-helloapp,也就是 Kubernetes 服務帳戶的名稱。
圖 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 資源
刪除服務。這麼做會取消分配為您的 Service 所建立的 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