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

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

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

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

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

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

目標

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

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

費用

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

如要根據預測用量估算費用,請使用 Pricing Calculator

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

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

事前準備

設定專案

Cloud Shell 已預先安裝本教學課程所需的軟體,包括 Dockerkubectlgcloud CLITerraform。如果您未使用 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_DATASETTF_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_SECONDSMETRIC_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 工作負載:顯示最有可能發生可靠性和效能問題的工作負載。
  • 記錄 - 工作負載大小調整 - 我們的服務您還滿意嗎?:提供歷史記錄檢視畫面,顯示工作負載適當調整大小和減少最佳效能工作負載數量的實施成效。

建議的容器 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

後續步驟