本教學課程將示範如何使用 Google Kubernetes Engine (GKE) 建構多層網頁應用程式。
在本教學課程中,執行下列操作:
這個範例說明下列 Kubernetes 概念:
目標
如要在 GKE 上部署及執行應用程式,請按照下列步驟操作:- 設定 Redis 領導者
- 設定兩個 Redis follower
- 設定網頁前端
- 造訪網站
- 擴充網頁前端
下圖概略說明您完成這些目標後建立的叢集架構:
費用
在本文件中,您會使用下列 Google Cloud的計費元件:
如要根據預測用量估算費用,請使用 Pricing Calculator。
完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」。
事前準備
Cloud Shell 已預先安裝本教學課程所需的軟體,包括 kubectl 和 gcloud CLI。如果未使用 Cloud Shell,請務必安裝 gcloud CLI。
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
-
安裝 Google Cloud CLI。
-
若您採用的是外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
選取或建立專案所需的角色
- 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
-
建立專案:如要建立專案,您需要「專案建立者」角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
建立 Google Cloud 專案:
gcloud projects create PROJECT_ID
將
PROJECT_ID替換為您要建立的 Google Cloud 專案名稱。 -
選取您建立的 Google Cloud 專案:
gcloud config set project PROJECT_ID
將
PROJECT_ID替換為 Google Cloud 專案名稱。
如果尚未啟用,請啟用 GKE API:
啟用 API 時所需的角色
如要啟用 API,您必須具備
serviceusage.services.enable權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。gcloud services enable container.googleapis.com
-
安裝 Google Cloud CLI。
-
若您採用的是外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
選取或建立專案所需的角色
- 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
-
建立專案:如要建立專案,您需要「專案建立者」角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
建立 Google Cloud 專案:
gcloud projects create PROJECT_ID
將
PROJECT_ID替換為您要建立的 Google Cloud 專案名稱。 -
選取您建立的 Google Cloud 專案:
gcloud config set project PROJECT_ID
將
PROJECT_ID替換為 Google Cloud 專案名稱。
如果尚未啟用,請啟用 GKE API:
啟用 API 時所需的角色
如要啟用 API,您必須具備
serviceusage.services.enable權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。gcloud services enable container.googleapis.com
準備環境
如要設定環境,請按照下列步驟操作:
設定環境變數:
export PROJECT_ID=PROJECT_ID export COMPUTE_LOCATION=COMPUTE_LOCATION更改下列內容:
PROJECT_ID:您的 Google Cloud 專案 IDCOMPUTE_LOCATION:Compute Engine 位置,例如us-central1。
複製 GitHub 存放區:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples變更為目前使用的目錄:
cd kubernetes-engine-samples/quickstarts/guestbook/
建立 GKE 叢集
建立 Autopilot 或 Standard GKE 叢集:
Autopilot
gcloud container clusters create-auto guestbook \
--location=${COMPUTE_LOCATION} \
標準
gcloud container clusters create guestbook \
--location=${COMPUTE_LOCATION} \
--num-nodes=4
連線至叢集
設定 kubectl 與叢集通訊:
gcloud container clusters get-credentials guestbook \
--location=${COMPUTE_LOCATION}
設定 Redis 領導者
應用程式會使用 Redis 儲存資料。應用程式會將資料寫入 Redis 領導者執行個體,並從多個 Redis follower 執行個體讀取資料。
下列資訊清單說明 Kubernetes Deployment,該 Deployment 會執行單一副本的 Redis 領導者 Pod:
將資訊清單套用至叢集:
kubectl apply -f redis-leader-deployment.yaml確認 Redis 領導者 Pod 是否正在運作:
kubectl get pods輸出結果會與下列內容相似:
NAME READY STATUS RESTARTS AGE redis-leader-343230949-qfvrq 1/1 Running 0 43sSTATUS可能需要幾分鐘的時間,才能從Pending變更為Running。
建立 Redis 領導者服務
網頁應用程式需要與 Redis 領導者通訊,才能寫入資料。您可以建立 Service,將流量 Proxy 至 Redis 領導者 Pod。
Service 是 Kubernetes 的抽象層,用於定義邏輯上的一組 Pod 和這些 Pod 依據的存取政策。建立 Service 時,請根據 Pod 標籤說明要將哪些 Pod 設為 Proxy。
以下資訊清單說明 Redis 領導者的服務:
這個資訊清單包含一組標籤選取器。這些標籤與上一個步驟中部署的標籤組相符。因此,這項服務會將網路流量路由至先前步驟中建立的 Redis 領導者 Pod。
資訊清單的
ports區段會宣告單一通訊埠對應。Service 會將port: 6379上的流量轉送至符合指定selector標籤的容器targetPort: 6379。部署作業中使用的containerPort必須與targetPort相符,才能將流量導向部署作業。將資訊清單套用至叢集:
kubectl apply -f redis-leader-service.yaml確認 GKE 是否已建立服務:
kubectl get service輸出結果會與下列內容相似:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.51.240.1 <none> 443/TCP 42s redis-leader 10.51.242.233 <none> 6379/TCP 12s
設定 Redis follower
雖然 Redis 領導者是單一 Pod,但您可以新增幾個 Redis 追隨者或副本,提高可用性並滿足流量需求。
下列資訊清單說明 Redis follower Pod 的 Deployment:
將資訊清單套用至叢集:
kubectl apply -f redis-follower-deployment.yaml確認兩個 Redis 追隨者副本正在執行:
kubectl get pods輸出結果會與下列內容相似:
NAME READY STATUS RESTARTS AGE redis-follower-76588f55b7-bnsq6 1/1 Running 0 27s redis-follower-76588f55b7-qvtws 1/1 Running 0 27s redis-leader-dd446dc55-kl7nl 1/1 Running 0 119sSTATUS可能需要幾分鐘的時間,才能從Pending變更為Running。
建立 Redis follower 服務
網頁應用程式必須與 Redis 追隨者通訊,才能讀取資料。如要讓 Redis 追隨者可供探索,您必須設定服務。
以下資訊清單說明 Redis follower 的 Service:
這個資訊清單會指定 Service 在通訊埠 6379 上執行。Service 的
selector欄位與上一步建立的 Redis follower Pod 相符。將資訊清單套用至叢集:
kubectl apply -f redis-follower-service.yaml確認 GKE 是否已建立 Service:
kubectl get service輸出結果會與下列內容相似:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.51.240.1 <none> 443/TCP 1m redis-leader 10.51.242.233 <none> 6379/TCP 49s redis-follower 10.51.247.238 <none> 6379/TCP 3s
設定應用程式網頁前端
現在您已為應用程式準備好 Redis 儲存空間,請啟動網路伺服器。 與 Redis 追隨者一樣,前端是使用 Kubernetes Deployment 部署。
網頁應用程式使用 PHP 前端,並根據要求是讀取還是寫入,設定與 Redis follower 或 leader 服務通訊。前端會公開 JSON 介面,並提供以 jQuery Ajax 為基礎的 UI。
下列資訊清單說明網路伺服器的 Deployment:
資訊清單檔案會指定環境變數
GET_HOSTS_FROM=dns。 將設定提供給網頁前端應用程式時,前端應用程式會使用主機名稱redis-follower和redis-leader執行 DNS 查詢。DNS 查詢會找出您在上一個步驟中建立的服務 IP 位址。這個概念稱為 DNS 服務探索。將資訊清單套用至叢集:
kubectl apply -f frontend-deployment.yaml確認備用資源正在執行:
kubectl get pods -l app=guestbook -l tier=frontend輸出結果會與下列內容相似:
NAME READY STATUS RESTARTS AGE frontend-7b78458576-8kp8s 1/1 Running 0 37s frontend-7b78458576-gg86q 1/1 Running 0 37s frontend-7b78458576-hz87g 1/1 Running 0 37s
在外部 IP 位址公開前端
在目前的設定中,您在上一個步驟建立的 redis-follower 和 redis-leader 服務只能在 GKE 叢集內存取,因為服務的預設類型為 ClusterIP。
ClusterIP Service 會為 Service 指向的 Pod 集提供單一 IP 位址。這個 IP 位址只能在叢集中存取。
如要讓外部存取網頁前端服務,您可以視需求在服務設定中指定 type: LoadBalancer 或 type: NodePort。
下列資訊清單說明 LoadBalancer 類型的 Service:
「ports」部分下的連接埠宣告會指定「port: 80」,但未指定「targetPort」。如果省略 targetPort 屬性,系統會預設為 port 欄位的值。在本例中,這項 Service 會將通訊埠 80 的外部流量,轉送至 frontend Deployment 中容器的通訊埠 80。
將資訊清單套用至叢集:
kubectl apply -f frontend-service.yaml
建立 frontend Service 時,GKE 會建立負載平衡器和外部 IP 位址。這些資源會產生費用。
前往應用程式網站
如要存取應用程式網站,請取得 frontend 服務的外部 IP 位址:
kubectl get service frontend
輸出結果會與下列內容相似:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
frontend 10.51.242.136 109.197.92.229 80:32372/TCP 1m
建立負載平衡器時,「EXTERNAL-IP」欄可能會顯示 <pending>。這可能需要幾分鐘的時間。如果看到 Does not have minimum availability 等錯誤訊息,請稍候幾分鐘。GKE 會重新建立節點來進行變更,因此發生這個暫時性錯誤。
複製 IP 位址,然後在瀏覽器中開啟該頁面:

請嘗試輸入訊息,然後按一下「提交」,新增一些項目。您輸入的訊息會顯示在前端。這則訊息表示資料已透過您建立的服務成功新增至 Redis。
擴充網頁前端
假設您的應用程式已執行一段時間,突然爆紅。您認為在前端新增更多網路伺服器會是個不錯的主意。方法是增加 Pod 數量。
向上擴充
frontendPod 數量:kubectl scale deployment frontend --replicas=5輸出結果會與下列內容相似:
deployment.extensions/frontend scaled確認正在執行的副本數量:
kubectl get pods輸出結果會與下列內容相似:
NAME READY STATUS RESTARTS AGE frontend-88237173-3s3sc 1/1 Running 0 1s frontend-88237173-twgvn 1/1 Running 0 1s frontend-88237173-5p257 1/1 Running 0 23m frontend-88237173-84036 1/1 Running 0 23m frontend-88237173-j3rvr 1/1 Running 0 23m redis-leader-343230949-qfvrq 1/1 Running 0 54m redis-follower-132015689-dp23k 1/1 Running 0 37m redis-follower-132015689-xq9v0 1/1 Running 0 37m您可以使用同一個指令縮減
frontendPod 數量,只要將5換成1即可。
清除所用資源
為避免因為本教學課程所用資源,導致系統向 Google Cloud 收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。
刪除專案
刪除 Google Cloud 專案:
gcloud projects delete PROJECT_ID
刪除個別資源
如果您使用現有專案,但不想刪除專案,請刪除個別資源。
刪除
frontend服務:kubectl delete service frontend刪除 GKE 叢集:
gcloud container clusters delete guestbook