IT 管理員和營運人員可以透過這個系列的教學課程,瞭解如何部署、執行及管理 Google Kubernetes Engine (GKE) 中運作的現代化應用程式環境。在本系列教學課程中,您將瞭解如何設定監控和快訊、擴充工作負載,以及模擬失敗,所有操作都使用 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 自動配置器的回應。
設定自訂指標收集
您可以設定水平 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 叢集外部的服務和資源 (例如 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 轉接器 Deployment,以套用變更:
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 資源、要監控哪些指標,以及要執行的備用資源數量下限和上限。
查看
userserviceDeployment 的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 物件的自訂指標。
查看
frontendDeployment 的HorizontalPodAutoscaler資訊清單:這份資訊清單使用下列欄位:
spec.scaleTargetRef:要擴展的 Kubernetes 資源。spec.minReplicas:備用資源數量下限,在本範例中為5。spec.maxReplicas:副本數量上限,在本範例中為25。spec.metrics.*:要使用的指標。在本範例中,這是每秒的 HTTP 要求數,也就是您部署的介面卡提供的 Monitoring 自訂指標。spec.metrics.external.metric.selector.matchLabels:縮放時要篩選的特定資源標籤。
從
frontendIngress 負載平衡器找出轉送規則名稱: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 4m56sCymbal 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和userservicePod 的副本數量: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)' \ --location="CONTROL_PLANE_LOCATION"將
CONTROL_PLANE_LOCATION替換為叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。節點數量也從初始數量增加,以容納新的副本。節點數量增加是由 GKE Autopilot 驅動。您不需要為這個節點規模設定任何項目。
開啟負載產生器介面,然後按一下「停止」結束測試。
再次檢查副本數量和節點數量,並觀察數字是否隨著負載減少而降低。縮減作業可能需要一段時間,因為 Kubernetes
HorizontalPodAutoscaler資源中副本的預設穩定時間範圍為五分鐘。
在實際環境中,環境中的節點和 Pod 數量會自動擴充和縮減,與這個模擬負載相同。Cymbal Bank 範例應用程式的設計可因應這類擴充需求。請與應用程式營運人員和網站可靠性工程 (SRE) 或應用程式開發人員確認,瞭解他們的工作負載是否能從這些擴充功能獲益。