IT 管理員和營運人員可以透過這個系列的教學課程,瞭解如何部署、執行及管理 Google Kubernetes Engine (GKE) Enterprise 版中運作的現代化應用程式環境。在本系列教學課程中,您將瞭解如何設定監控和快訊、擴充工作負載,以及模擬故障,所有操作都使用 Cymbal Bank 範例微服務應用程式:
- 建立叢集並部署範例應用程式
- 使用 Google Cloud Managed Service for Prometheus 監控
- 調度工作負載資源 (本教學課程)
- 模擬失敗情形
- 集中管理變更
總覽和目標
Cymbal Bank 等消費者應用程式的使用者人數通常會隨時間變化。理想情況下,網站應能應付流量暴增的情況,不會變慢或發生其他問題,但機構不必花錢購買實際不需要的雲端資源。Google Cloud 自動調度功能可解決這個問題。
在本教學課程中,您將瞭解如何在 GKE 叢集中設定叢集和工作負載,以便使用內建 Kubernetes 指標,以及 Cloud Monitoring 和 Cloud Trace 的自訂指標來調整資源配置。您將瞭解如何完成下列工作:
- 在 Cloud Monitoring 中啟用 Trace 的自訂指標。
- 自訂指標可讓您使用 Kubernetes 叢集以外的其他監控資料或外部輸入內容進行調整,例如網路流量或 HTTP 回應碼。
- 設定水平 Pod 自動調度資源,這項 GKE 功能可根據指定指標,自動增加或減少工作負載的 Pod 數量。
- 模擬應用程式負載,並查看叢集自動配置器和水平 Pod 自動配置器的回應。
費用
啟用 GKE Enterprise 並部署本系列教學課程的 Cymbal Bank 範例應用程式,表示您將產生 GKE Enterprise 的叢集費用,直到停用 GKE Enterprise 或刪除專案為止。如要瞭解相關費用,請參閱 Google Cloud 定價頁面。
您也必須支付執行 Cymbal Bank 範例應用程式時產生的其他 Google Cloud 費用,例如 Compute Engine VM 和 Trace 的費用。
事前準備
如要瞭解如何擴充部署作業,您必須先完成第一個教學課程,建立使用 Autopilot 的 GKE 叢集,並部署 Cymbal Bank 範例微服務型應用程式。
建議您依序完成 Cymbal Bank 的這組教學課程。完成一系列教學課程後,您將學到新技能,並使用其他 Google Cloud 產品和服務。
您也需要建立 IAM 服務帳戶,並授予一些權限,水平 Pod 自動調度資源才能正常運作:
建立 IAM 服務帳戶。本教學課程會使用這個服務帳戶授予自訂指標的存取權,讓水平 Pod 自動配置器判斷何時應調度資源:
gcloud iam service-accounts create scalable-apps
授予 IAM 服務帳戶存取權,以執行必要的調整動作:
gcloud projects add-iam-policy-binding PROJECT_ID \ --role roles/cloudtrace.agent \ --member "serviceAccount:scalable-apps@PROJECT_ID.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding PROJECT_ID \ --role roles/monitoring.metricWriter \ --member "serviceAccount:scalable-apps@PROJECT_ID.iam.gserviceaccount.com" gcloud iam service-accounts add-iam-policy-binding "scalable-apps@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[default/default]"
系統會將下列存取權授予 IAM 服務帳戶:
roles/cloudtrace.agent
:將延遲資訊等追蹤資料寫入 Trace。roles/monitoring.metricWriter
:將指標寫入 Cloud Monitoring。roles/iam.workloadIdentityUser
:允許 Kubernetes 服務帳戶使用 Workload Identity Federation for GKE,以 IAM 服務帳戶的身分運作。
在
default
命名空間中設定default
Kubernetes 服務帳戶,做為您建立的 IAM 服務帳戶:kubectl annotate serviceaccount default \ iam.gke.io/gcp-service-account=scalable-apps@PROJECT_ID.iam.gserviceaccount.com
這項設定可讓使用
default
命名空間中 Kubernetes 服務帳戶的 Pod,存取與 IAM 服務帳戶相同的 Google Cloud資源。default
設定自訂指標收集
您可以設定水平 Pod 自動調度器,使用 Kubernetes 內建的基本 CPU 和記憶體指標,也可以使用 Cloud Monitoring 的自訂指標,例如每秒 HTTP 要求數或 SELECT
陳述式數量。自訂指標不需變更應用程式即可運作,並讓叢集更深入瞭解應用程式的整體效能和需求。在本教學課程中,您將瞭解如何使用內建和自訂指標。
如要允許水平 Pod 自動調度器從 Monitoring 讀取自訂指標,您必須在叢集中安裝自訂指標 - Stackdriver 轉接器。
將自訂指標 Stackdriver 轉接器部署至叢集:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml
如要允許 Stackdriver 轉接器從叢集取得自訂指標,請使用 GKE 適用的工作負載身分聯盟。這個方法會使用具備讀取監控指標權限的 IAM 服務帳戶。
將
roles/monitoring.viewer
角色授予 IAM 服務帳戶:gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:scalable-apps@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/monitoring.viewer
設定 Stackdriver 介面卡,使用 GKE 適用的工作負載身分聯盟,以及有權讀取監控指標的 IAM 服務帳戶:
gcloud iam service-accounts add-iam-policy-binding scalable-apps@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]"
Kubernetes 內建服務帳戶系統,可在叢集內提供存取權。如要讓應用程式向 Google Kubernetes Engine (GKE) Enterprise 版叢集外部的服務和資源 (例如 Monitoring) 進行驗證,請使用 GKE 適用的工作負載身分聯盟。這種做法會設定 Kubernetes 服務帳戶,以使用 GKE 的 IAM 服務帳戶。
為介面卡使用的 Kubernetes 服務帳戶加上註解:
kubectl annotate serviceaccount custom-metrics-stackdriver-adapter \ --namespace=custom-metrics \ iam.gke.io/gcp-service-account=scalable-apps@PROJECT_ID.iam.gserviceaccount.com
重新啟動 Stackdriver 轉接器部署作業,以套用變更:
kubectl rollout restart deployment custom-metrics-stackdriver-adapter \ --namespace=custom-metrics
設定水平 Pod 自動配置器
GKE Autopilot 可透過幾種不同方式進行擴縮。在本教學課程中,您將瞭解如何使用下列方法調度叢集資源:
- 水平 Pod 自動調度器:調整工作負載的 Pod 數量。
- 叢集自動配置器:調整叢集中可用的節點資源。
這兩種方法可以搭配使用,這樣一來,應用程式的 Pod 數量變更時,支援這些 Pod 的節點資源也會隨之變更。
您也可以使用垂直 Pod 自動調度器,調整 Pod 的 CPU 和記憶體要求,而非 Pod 數量。
在本教學課程中,您將使用內建指標為 userservice
Deployment 設定水平 Pod 自動配置器,並使用自訂指標為 frontend
Deployment 設定水平 Pod 自動配置器。
如果是您自己的應用程式,請與應用程式開發人員和平台工程師合作,瞭解他們的需求,並設定 Horizontal Pod Autoscaler 規則。
調整 userservice
Deployment 的資源配置
當 Cymbal Bank 範例應用程式的使用者人數增加時,userservice
服務會消耗更多 CPU 資源。您可以使用 HorizontalPodAutoscaler
物件,控管應用程式對負載的回應方式。在 HorizontalPodAutoscaler
的 YAML 資訊清單中,您可以定義要讓水平 Pod 自動配置器調度哪些 Deployment 資源、要監控哪些指標,以及要執行的備用資源數量下限和上限。
查看
userservice
Deployment 的HorizontalPodAutoscaler
範例資訊清單:這個資訊清單會執行下列操作:
- 將擴充期間的備用資源數量上限設為
50
。 - 將縮減期間的執行個體數量下限設為
5
。 - 使用內建的 Kubernetes 指標來決定資源調度。在這個範例中,指標是 CPU 使用率,目標使用率為 60%,可避免過度使用和使用不足。
- 將擴充期間的備用資源數量上限設為
將資訊清單套用至叢集:
kubectl apply -f extras/postgres-hpa/hpa/userservice.yaml
調整 frontend
Deployment 的資源配置
在上一節中,您已根據 CPU 使用率的內建 Kubernetes 指標,在 Deployment 上設定水平 Pod 自動配置器。userservice
對於「部署」frontend
,您可能想改為根據傳入的 HTTP 要求數量進行調整。這個方法會使用 Stackdriver 介面卡,從 Monitoring 讀取 HTTP(S) 負載平衡器 Ingress 物件的自訂指標。
查看
frontend
Deployment 的HorizontalPodAutoscaler
資訊清單:這份資訊清單使用下列欄位:
spec.scaleTargetRef
:要擴充的 Kubernetes 資源。spec.minReplicas
:備用資源數量下限,在本範例中為5
。spec.maxReplicas
:副本數量上限,在本範例中為25
。spec.metrics.*
:要使用的指標。在本範例中,這是每秒的 HTTP 要求數,也就是您部署的介面卡提供的 Monitoring 自訂指標。spec.metrics.external.metric.selector.matchLabels
:縮放時要篩選的特定資源標籤。
從
frontend
Ingress 負載平衡器找出轉送規則名稱:export FW_RULE=$(kubectl get ingress frontend -o=jsonpath='{.metadata.annotations.ingress\.kubernetes\.io/forwarding-rule}') echo $FW_RULE
輸出結果會與下列內容相似:
k8s2-fr-j76hrtv4-default-frontend-wvvf7381
在資訊清單中新增轉送規則:
sed -i "s/FORWARDING_RULE_NAME/$FW_RULE/g" "extras/postgres-hpa/hpa/frontend.yaml"
這個指令會將
FORWARDING_RULE_NAME
替換為您儲存的轉送規則。將資訊清單套用至叢集:
kubectl apply -f extras/postgres-hpa/hpa/frontend.yaml
模擬負載
在本節中,您會使用負載產生器模擬流量尖峰,並觀察副本數量和節點數量隨著時間增加,以因應負載增加的情況。然後停止產生流量,觀察副本和節點數量是否隨之減少。
開始前,請先檢查水平 Pod 自動配置器的狀態,並查看目前使用的副本數量。
取得
HorizontalPodAutoscaler
資源的狀態:kubectl get hpa
輸出內容會與下列內容類似,顯示有 1 個
frontend
副本和 5 個userservice
副本:NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE frontend Deployment/frontend <unknown>/5 (avg) 5 25 1 34s userservice Deployment/userservice 0%/60% 5 50 5 4m56s
Cymbal Bank 範例應用程式包含
loadgenerator
服務。這項服務會持續傳送模仿使用者的要求至前端,並定期建立新帳戶,以及模擬這些帳戶之間的交易。在本機公開
loadgenerator
網頁介面。您可以使用這個介面模擬 Cymbal Bank 範例應用程式的負載:kubectl port-forward svc/loadgenerator 8080
如果看到錯誤訊息,請在 Pod 執行時重試。
在電腦的瀏覽器中開啟負載產生器網頁介面:
- 如果您使用本機殼層,請開啟瀏覽器並前往 http://127.0.0.1:8080。
- 如果您使用 Cloud Shell,請按一下 「Web preview」(網頁預覽),然後按一下「Preview on port 8080」(透過以下通訊埠預覽:8080)。
在負載產生器網頁介面中,如果「Failures」(失敗) 值顯示
100%
,請完成下列步驟來更新測試設定:- 按一下失敗率計數器旁的「停止」按鈕。
- 在「狀態」下方,點選「新測試」選項。
- 將「Host」值更新為 Cymbal Bank 進入點的 IP 位址。
- 按一下「Start Swarming」。
在負載產生器網頁介面中,按一下「圖表」分頁標籤,即可觀察一段時間內的效能。查看要求數量和資源用量。
開啟新的終端機視窗,並監控
frontend
和userservice
Pod 的副本數量:kubectl get hpa -w
負載增加時,備用資源數量也會增加。叢集會辨識設定的指標是否達到定義的門檻,並使用水平自動調度 Pod 資源功能調度 Pod 數量,因此 scaleUp 動作可能需要約十分鐘。
以下範例輸出內容顯示,隨著負載產生器執行,副本數量會增加:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS frontend Deployment/frontend 5200m/5 (avg) 5 25 13 userservice Deployment/userservice 71%/60% 5 50 17
開啟另一個終端機視窗,然後檢查叢集中的節點數量:
gcloud container clusters list \ --filter='name=scalable-apps' \ --format='table(name, currentMasterVersion, currentNodeVersion, currentNodeCount)' \ --region="REGION"
將
REGION
替換為叢集執行的區域。節點數量也從初始數量增加,以容納新的副本。節點數量增加是由 GKE Autopilot 驅動。您不需要為這個節點規模設定任何項目。
開啟負載產生器介面,然後按一下「停止」結束測試。
再次檢查副本數量和節點數量,並觀察數字是否隨著負載減少而降低。縮減作業可能需要一段時間,因為 Kubernetes
HorizontalPodAutoscaler
資源中副本的預設穩定時間範圍為五分鐘。
在實際環境中,環境中的節點和 Pod 數量會自動擴充和縮減,與模擬負載的情況相同。Cymbal Bank 範例應用程式的設計可因應這類擴充作業。請與應用程式營運人員和網站可靠性工程 (SRE) 或應用程式開發人員確認,瞭解他們的工作負載是否能從這些擴充功能獲益。
清除所用資源
Cymbal Bank 的教學課程集設計為依序完成。隨著您完成一系列教學課程,將能學到新技能,並使用其他 Google Cloud 產品和服務。
如果您想暫時休息,之後再繼續下一個教學課程,並避免系統向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除您建立的專案。
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
後續步驟
在下一個教學課程中,瞭解如何模擬 GKE Enterprise 中的故障。