本教學課程示範如何使用 Google Kubernetes Engine (GKE) 建構多層級網頁應用程式。
在本教學課程中,執行下列操作:
這個範例說明下列 Kubernetes 概念:
- 陳述式設定 採用 YAML 資訊清單檔案
- Deployment,這是 Kubernetes 資源,用於決定一組 Pod 複本的設定
- 服務:為一組 Pod 建立內部和外部負載平衡器
目標
如要在 GKE 上部署及執行應用程式,請按照下列步驟操作:- 設定 Redis 領導者
- 設定兩個 Redis follower
- 設定網路前端
- 造訪網站
- 擴充網站前端
下圖概略說明您完成這些目標後建立的叢集架構:
費用
在本文件中,您會使用 Google Cloud的下列計費元件:
如要根據預測用量估算費用,請使用 Pricing Calculator。
完成本文所述工作後,您可以刪除已建立的資源,避免繼續計費。詳情請參閱清除所用資源一節。
事前準備
Cloud Shell 已預先安裝本教學課程所需的軟體,包括 kubectl
和 gcloud CLI。如果您未使用 Cloud Shell,則必須安裝 gcloud CLI。
- 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.
-
Install the Google Cloud CLI.
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
如要初始化 gcloud CLI,請執行下列指令:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the GKE API:
gcloud services enable container.googleapis.com
-
Install the Google Cloud CLI.
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
如要初始化 gcloud CLI,請執行下列指令:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the GKE API:
gcloud services enable container.googleapis.com
設定環境變數:
export PROJECT_ID=PROJECT_ID export COMPUTE_LOCATION=COMPUTE_LOCATION
更改下列內容:
PROJECT_ID
:您的 Google Cloud 專案 IDCOMPUTE_LOCATION
:a Compute Engine 位置,例如us-central1
。
複製 GitHub 存放區:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
變更為工作目錄:
cd kubernetes-engine-samples/quickstarts/guestbook/
下列資訊清單說明 Kubernetes 部署作業,該作業會執行單一副本 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 43s
「
STATUS
」可能需要幾分鐘的時間,才會從Pending
變更為Running
。下列資訊清單說明 Redis 領導者的 Service:
這個資訊清單包含一組標籤選取器。這些標籤與上一步中部署的標籤集相符。因此,這項服務會將網路流量轉送至上一步建立的 Redis 領導者 Pod。
資訊清單的
ports
區段會宣告單一通訊埠對應。服務會針對與指定selector
標籤相符的容器,將port: 6379
的流量轉送至該容器的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 Pod 的部署:
將資訊清單套用至叢集:
kubectl apply -f redis-follower-deployment.yaml
確認兩個 Redis follower 副本正在執行:
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 119s
「
STATUS
」可能需要幾分鐘的時間,才會從Pending
變更為Running
。下列資訊清單說明 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
下列資訊清單說明網路伺服器的 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
向上擴充
frontend
Pod 的數量: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
您可以使用相同指令縮減
frontend
Pod 數量,只要將5
換成1
即可。刪除
frontend
服務:kubectl delete service frontend
刪除 GKE 叢集:
gcloud container clusters delete 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 執行個體讀取資料。
建立 Redis 領導者服務
Web 應用程式需要與 Redis 領導者通訊來寫入資料。您可以建立服務,將流量代理至 Redis 領導者 Pod。
Service 是 Kubernetes 抽象層,可定義邏輯上的一組 Pod 和存取這些 Pod 的政策。建立 Service 時,您可以根據 Pod 標籤說明要代理的 Pod。
設定 Redis 追隨者
雖然 Redis 領導者是單一 Pod,但透過新增幾個 Redis 追隨者或副本,即可大幅提升 Redis 領導者的可用性並滿足流量需求。
建立 Redis follower 服務
網路應用程式必須與 Redis 追隨者通訊來讀取資料。如要開放 Redis 追隨者以供偵測,則必須設定服務。
設定應用程式網路前端
現在您已為應用程式準備好 Redis 儲存空間,請啟動網路伺服器。與 Redis 追隨者一樣,前端是使用 Kubernetes Deployment 部署。
這個網路應用程式使用 PHP 前端,可根據要求是讀取或寫入,設定成與 Redis 追隨者或領導者服務進行通訊。前端會公開 JSON 介面,並提供以 jQuery Ajax 為基礎的 UI。
在外部 IP 位址公開前端
根據目前的設定,您在先前的步驟中建立的 redis-follower
和 redis-leader
服務只能在 GKE 叢集中存取,因為服務的預設類型為 ClusterIP
。
ClusterIP
Service 會為 Service 所指向的一組 Pod 提供單一 IP 位址。這個 IP 位址只能在叢集中存取。
如要讓外部存取網路前端服務,您可以根據需求在服務設定中指定 type: LoadBalancer
或 type: NodePort
。
以下資訊清單說明 LoadBalancer 類型的服務:
在 ports
區段底下的通訊埠宣告會指定 port: 80
,並且不會指定 targetPort
。如果省略 targetPort
屬性,該屬性會預設為 port
欄位的值。在這種情況下,這項服務會將通訊埠 80 的流量轉送至 frontend
部署中容器的通訊埠 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 數量來達成這個目標。
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本教學課程中所用資源的相關費用,請刪除含有該項資源的專案,或者保留專案但刪除個別資源。
刪除專案
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
刪除個別資源
如果您使用現有專案,但不想刪除專案,請刪除個別資源。