大規模調整 GKE 工作負載大小

本教學課程說明如何根據 VPA 建議和使用率指標,調整 Google Kubernetes Engine (GKE) 工作負載的大小。

瞭解資源適當調整大小的重要性

如果資源不足,容器就無法取得執行應用程式所需的資源,導致應用程式速度緩慢且不可靠。過度佈建不會影響應用程式效能,但可能會增加每月帳單費用。

下表說明 CPU 和記憶體資源配置不足和過多的影響:

資源 佈建狀態 風險 說明
CPU 超過 費用 預留不必要的資源,增加工作負載成本。
低於 效能 可能導致工作負載速度變慢或沒有回應。
未設定 可靠性 CPU 可能會節流至 0,導致工作負載沒有回應。
記憶體 超過 費用 預留不必要的資源,增加工作負載成本。
低於 可靠性 可能導致應用程式因記憶體不足 (OOM) 錯誤而終止。
未設定 可靠性 kubelet 隨時可以停止 Pod,並將其標示為失敗。

目標

您在本教學課程中將學習以下內容:

  • 部署範例應用程式。
  • 將 GKE 建議指標從 Monitoring 匯出至 BigQuery。
  • 使用 BigQuery 和數據分析,查看各專案的 GKE 容器建議。

費用

在本文件中,您將使用下列 Google Cloud計費元件:

您可以使用 Pricing Calculator,根據預測用量估算費用。

初次使用 Google Cloud 的使用者可能符合免費試用期資格。

完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」。

事前準備

設定專案

Cloud Shell 已預先安裝本教學課程所需的軟體,包括 Docker、kubectl、gcloud CLI 和 Terraform。如果您未使用 Cloud Shell,則必須安裝 gcloud CLI。

  1. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自體驗產品的實際應用成效。新客戶還能獲得價值 $300 美元的免費抵免額,用於執行、測試及部署工作負載。
  2. 安裝 Google Cloud CLI。

  3. 如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。

  4. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  5. 建立或選取 Google Cloud 專案。

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需具備特定 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 專案名稱。

  6. 確認 Google Cloud 專案已啟用計費功能。

  7. 啟用 Resource Manager、Google Kubernetes Engine、Cloud Monitoring、BigQuery、Cloud Run、Cloud Build API (如果尚未啟用):

    啟用 API 時所需的角色

    如要啟用 API,您必須具備 serviceusage.services.enable 權限。如果您建立了專案,可能已透過擁有者角色 (roles/owner) 取得這項權限。否則,您可以透過服務使用情形管理員角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。

    gcloud services enable cloudresourcemanager.googleapis.com container.googleapis.com monitoring.googleapis.com bigquery.googleapis.com run.googleapis.com cloudbuild.googleapis.com cloudscheduler.googleapis.com artifactregistry.googleapis.com
  8. 安裝 Google Cloud CLI。

  9. 如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。

  10. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  11. 建立或選取 Google Cloud 專案。

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需具備特定 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 專案名稱。

  12. 確認 Google Cloud 專案已啟用計費功能。

  13. 啟用 Resource Manager、Google Kubernetes Engine、Cloud Monitoring、BigQuery、Cloud Run、Cloud Build API (如果尚未啟用):

    啟用 API 時所需的角色

    如要啟用 API,您必須具備 serviceusage.services.enable 權限。如果您建立了專案,可能已透過擁有者角色 (roles/owner) 取得這項權限。否則,您可以透過服務使用情形管理員角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。

    gcloud services enable cloudresourcemanager.googleapis.com container.googleapis.com monitoring.googleapis.com bigquery.googleapis.com run.googleapis.com cloudbuild.googleapis.com cloudscheduler.googleapis.com artifactregistry.googleapis.com
  14. 將角色授予使用者帳戶。針對下列各個 IAM 角色執行下列指令一次:roles/serviceusage.serviceUsageAdmin, roles/container.clusterAdmin, roles/iam.serviceAccountAdmin, roles/iam.securityAdmin, 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 角色。

設定環境

如要設定環境,請按照下列步驟操作

  1. 設定環境變數:

    export PROJECT_ID=PROJECT_ID
    export REGION=us-central1
    export ZONE=us-central1-f
    export IMAGE=$REGION-docker.pkg.dev/$PROJECT_ID/main/vpa-recs-image:latest
    

    將 PROJECT_ID 替換為 Google Cloud 專案 ID。

  2. 設定預設環境變數:

    gcloud config set project $PROJECT_ID
    gcloud config set compute/region $REGION
    gcloud config set compute/zone $ZONE
    
  3. 複製程式碼存放區。

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. 切換至目前使用的目錄。

    cd kubernetes-engine-samples/cost-optimization/gke-vpa-recommendations
    

(選用) 設定範例應用程式

本節內容屬於選用性質,但其中可能有適合您應用程式採用的提示。如要使用現有叢集,請確認叢集已設定 Cloud Monitoring。

為模擬真實環境,您將使用設定指令碼部署 Online Boutique。

下列步驟會安裝範例應用程式,並修改預設設定。舉例來說,這些指令會為部分工作負載設定水平 Pod 自動調度器 (HPA),並變更資源要求和限制。

  1. 執行設定指令碼:

    ./scripts/setup.sh
    

    設定指令碼會執行下列動作:

    • 建立 GKE 叢集。
    • 部署 Online Boutique 範例應用程式。
    • 更新 Pod 的 CPU 和記憶體資源要求。
    • 為adservice工作負載設定 HorizontalPodAutoscaler 資源,模擬真實環境。

    設定指令碼最多可能需要 10 分鐘才能完成。

  2. 確認範例應用程式已準備就緒:

    kubectl get deployment
    

    輸出結果會與下列內容相似:

    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    adservice               2/2     2            2           4m54s
    cartservice             1/1     1            1           4m55s
    checkoutservice         1/1     1            1           4m56s
    currencyservice         1/1     1            1           4m55s
    emailservice            1/1     1            1           4m56s
    frontend                1/1     1            1           4m55s
    loadgenerator           1/1     1            1           4m55s
    paymentservice          1/1     1            1           4m55s
    productcatalogservice   1/1     1            1           4m55s
    recommendationservice   1/1     1            1           4m56s
    redis-cart              1/1     1            1           4m54s
    shippingservice         1/1     1            1           4m54s
    

建立存放區

建立存放區來儲存指標匯出工具映像檔。

  1. 建立新的 Docker 存放區:

    gcloud artifacts repositories create main --repository-format=docker \
        --location=$REGION \
        --description="docker repository"
    
  2. 設定 Docker 存放區的驗證機制:

    gcloud auth configure-docker $REGION-docker.pkg.dev
    
  3. 執行下列指令來部署映像檔:

    gcloud builds submit metrics-exporter --region=$REGION --tag $IMAGE
    

部署應用程式

在下一節中,您將使用 Terraform 執行下列工作:

  • 建立服務帳戶,並指派管理及與 Google Cloud 資源互動所需的權限。
  • 將監控檢視者、BigQuery 資料編輯者、BigQuery 資料擁有者、BigQuery 工作使用者和 Cloud Run 叫用者角色授予服務帳戶。
  • 部署 Cloud Run 工作,從 Artifact Registry 提取 Docker 映像檔,並以指定設定執行。
  • 建立 Cloud Scheduler 工作,每天觸發 Cloud Run 服務。
  • 建立 BigQuery 資料集、資料表和檢視區塊,儲存指標資料和建議。

設定 Terraform

  1. 設定環境變數:

    export TF_VAR_BIGQUERY_DATASET=gke_metrics_dataset
    export TF_VAR_BIGQUERY_TABLE=gke_metrics
    export TF_VAR_RECOMMENDATION_WINDOW_SECONDS=1209600
    export TF_VAR_RECOMMENDATION_DISTANCE=86400
    export TF_VAR_LATEST_WINDOW_SECONDS=600
    export TF_VAR_METRIC_WINDOW=259200
    export TF_VAR_METRIC_DISTANCE=600
    

    這個指令包含下列項目:

    • TF_VAR_BIGQUERY_DATASET 和 TF_VAR_BIGQUERY_TABLE:保留 GKE 指標資料。
    • TF_VAR_RECOMMENDATION_WINDOW_SECONDS:VPA 建議的時間範圍。預設值為 1,209,600 秒,也就是 14 天。
    • TF_VAR_RECOMMENDATION_DISTANCE:傳回 VPA 建議資料點的間隔。預設值為 86,400 秒,或每 1 天。
    • TF_VAR_LATEST_WINDOW_SECONDS:取得最近要求和限制資源值的時間範圍。預設值為 600 秒 (10 分鐘)。
    • METRIC_WINDOW:設定 GKE 用量和使用率指標的時間範圍。預設值為 25,9200 秒 (3 天)。
    • METRIC_DISTANCE:傳回資料點的間隔。預設值為 600 秒,也就是每 10 分鐘。

    請根據工作負載需求調整這些值。舉例來說,如果批次工作負載每月執行一次,請將 TF_VAR_RECOMMENDATION_WINDOW_SECONDS 和 METRIC_WINDOW 更新為 2592000 秒 (30 天)。

部署 Terraform 設定

  1. 初始化、驗證及套用設定:

    terraform -chdir=terraform init
    terraform -chdir=terraform validate
    terraform -chdir=terraform apply -var project_id=$PROJECT_ID -var region=$REGION -var image=$IMAGE
    

    這個指令會提供執行計畫,並在進行任何變更前徵求您的核准。查看計畫,如果一切符合預期,請輸入 yes 繼續。

    apply 指令成功完成後,Terraform 就會建立及管理您的資源。

  2. 手動執行 Cloud Scheduler 工作:

    gcloud scheduler jobs run recommendation-schedule --location ${REGION}
    

驗證 Deployment

  1. 在 workload-recommendations 詳細資料頁面,選取「記錄」分頁標籤。

  2. 在 Cloud Run 控制台中,確認指標記錄檔是否正在處理:

    前往 Cloud Run。

    記錄檔會顯示寫入 BigQuery 的指標。輸出內容應如下所示:

    INFO - Building Row
    INFO - Successfully wrote 12 rows to BigQuery table [PROJECT_ID].gke_metric_dataset.gke_metrics.
    INFO - Run Completed
    

    如果輸出內容不符,請等待五分鐘,然後執行 gcloud scheduler jobs run recommendation-schedule --location $REGION 指令。

在 BigQuery 中查看容器建議

  1. 前往 Google Cloud 控制台的「BigQuery」頁面:

    前往「BigQuery」

  2. 確認資料顯示在「gke_metrics」資料表和「container_recommendations」檢視畫面中。視工作負載數量而定,將所有指標寫入 BigQuery 可能需要幾分鐘的時間。

  3. 在查詢編輯器中,選取 container_recommendations 檢視表中的所有資料列:

    SELECT * FROM `PROJECT_ID.gke_metrics_dataset.container_recommendations`
    

    這項程式會從 Cloud Monitoring 擷取下列指標:

    • 工作負載詳細資料:專案 ID、叢集名稱、控制器和容器名稱。

    • CPU/記憶體用量和使用率:工作負載使用的 CPU 和記憶體量,以及 CPU 和記憶體的使用百分比。

    • 要求和限制:為工作負載要求的 CPU 和記憶體數量,以及工作負載允許的 CPU 和記憶體數量上限。

    • CPU 和記憶體工作負載建議:根據 Deployment 的 VPA 建議,以及非 Deployment 物件的實際用量和目標使用率,建議應為工作負載分配多少 CPU 和記憶體,確保工作負載順利執行。

在數據分析中以視覺化方式呈現建議

數據分析是免費的自助式商業智慧平台,可讓您建構及使用資料視覺化、資訊主頁和報表。您可以使用數據分析連結資料、建立視覺化內容,並與他人分享深入分析。

使用數據分析,以圖表呈現 BigQuery container_recommendations 檢視表中的資料:

  1. 開啟「工作負載大小合適度」資訊主頁範本
  2. 按一下「使用我自己的資料」。
  3. 選取專案。
  4. 在「資料集」部分,選取 gke_metric_dataset。
  5. 選取「資料表」的 container_recommendations。
  6. 按一下「新增」。
  7. 按一下 [Add to Report] (加入報表)。

數據分析範本詳細資料

數據分析範本詳細資料頁面提供下列資訊:

  • GKE 工作負載適當大小總覽:提供叢集總覽,包括:
    • 有可靠性和效能問題風險的「盡力而為」和「可高載」工作負載數量。
    • 可能節省的 CPU 和記憶體資源。正值表示過度佈建,負值則表示佈建不足。
  • 工作負載建議:提供工作負載 CPU 和記憶體要求與限制的建議。
  • GKE Workloads at Risk:顯示最有可能發生可靠性和效能問題的工作負載。
  • 記錄 - 工作負載大小合適度 - 我們的表現如何?:提供歷來檢視畫面,說明工作負載適當調整和減少「盡力而為」工作負載數量的實施成效。

CPU 要求和限制容器建議

如果工作負載要求的 CPU 值和限制值相等,QoS 會視為「保證」,且 CPU 建議值會設為 14 天時間範圍內的最大值。否則,系統會使用 14 天內 CPU 要求的建議值第 95 個百分位數。

當 CPU 要求和限制值相等時,CPU 限制的建議值會設為部署物件的 CPU 要求 VPA 建議值上限,且目標使用率為 70% 的 CPU 使用量。如果工作負載的要求和限制不相同,系統會使用現有的限制比率。

建議的容器記憶體要求和限制

記憶體建議只會針對 Deployment 物件使用 VPA 建議上限,並以 80% 的目標使用率為上限,確保工作負載的可靠性。您可以在 container_recommendation 檢視表的查詢中更新目標使用率值。

由於記憶體是不可壓縮的資源,因此建議您將要求和限制設為相同的記憶體容量。記憶體用盡時,必須關閉 Pod。為避免 Pod 遭到終止並導致環境不穩定,您必須將要求的記憶體設為記憶體限制。

優先處理建議

系統會為每個資料列指派優先順序值,根據建議找出需要立即處理的工作負載。CPU 和記憶體的單位不同。為正規化單位,系統會使用預先定義 CPU 和記憶體之間的 E2 機型隨選價格比率,做為將記憶體單位轉換為 CPU 單位的近似值。

優先順序的計算公式如下:

priority = (CPU requested - CPU recommendation) + ((memory requested -
memory recommendation) / (vCPUs on-demand pricing /memory on-demand pricing ))

如果是 Autopilot,部署設定要求的資源總數應在支援的最小值和最大值範圍內。

查看多項專案的 VPA 建議

如要查看多項專案的 VPA 容器建議,請使用新的專案做為限定範圍專案。

在正式環境中部署這個專案時,請將要分析的所有專案新增至新專案的指標範圍。

清除所用資源

為避免因為本教學課程所用資源,導致系統向 Google Cloud 收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。

刪除專案

如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。

刪除 Google Cloud 專案:

gcloud projects delete PROJECT_ID

後續步驟