GKE ワークロードのサイズ適正化を大規模に行う


このチュートリアルでは、VPA の推奨事項と使用状況の指標を使用して、Google Kubernetes Engine(GKE)ワークロードのサイズを適正化する方法について説明します。

リソースの適正サイズ化が重要な理由を理解する

過小プロビジョニングでは、アプリケーションの実行に必要なリソースのコンテナが枯渇して、それらの動作が遅くなり、信頼性が低下する可能性があります。過大プロビジョニングはアプリケーションのパフォーマンスには影響しませんが、毎月の請求額は増加する場合があります。

次のテーブルに、CPU とメモリの過小プロビジョニングと過大プロビジョニングとの関係を示します。

リソース プロビジョニングのステータス リスク 説明
CPU Google Cloud を利用する上位 100 社のお客様のうち コスト 不要なリソースを予約することで、ワークロードの費用が増加します。
パフォーマンス ワークロードが遅くなる、または応答しなくなる可能性があります。
未設定 信頼性 CPU が 0 に抑えられると、ワークロードが応答しなくなる可能性があります。
メモリ Google Cloud を利用する上位 100 社のお客様のうち コスト 不要なリソースを予約することで、ワークロードの費用が増加します。
信頼性 アプリケーションがメモリ不足(OOM)エラーで終了する可能性があります。
未設定 信頼性 kubelet はいつでも Pod を停止し、それらを失敗としてマークできます。

目標

このチュートリアルの学習内容は次のとおりです。

  • サンプル アプリケーションをデプロイする。
  • Monitoring から BigQuery に GKE 推奨事項の指標をエクスポートします。
  • BigQuery と Looker Studio を使用して、プロジェクトにわたる GKE コンテナの推奨事項を表示します。

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

プロジェクトを設定する

Cloud Shell には、このチュートリアルに必要な Dockerkubectlgcloud CLITerraform などのソフトウェアがプリインストールされています。Cloud Shell を使用しない場合は、gcloud CLI をインストールする必要があります。

  1. 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.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. 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.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Resource Manager, Google Kubernetes Engine, Cloud Monitoring, BigQuery, Cloud Run, Cloud Build APIs:

    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
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. 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.

  10. Make sure that billing is enabled for your Google Cloud project.

  11. Enable the Resource Manager, Google Kubernetes Engine, Cloud Monitoring, BigQuery, Cloud Run, Cloud Build APIs:

    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
  12. Grant roles to your user account. Run the following command once for each of the following IAM roles: 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
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.

環境を設定する

環境の設定手順は次のとおりです。

  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 をデプロイします。

次の手順では、サンプル アプリケーションをインストールしてデフォルト構成を変更します。たとえば、一部のワークロードで HorizontalPodAutoscaler(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 起動元のロールを付与します。
  • Artifact Registry から Docker イメージを pull し、指定された構成でイメージを実行する Cloud Run ジョブをデプロイします。
  • Cloud Run サービスを毎日トリガーする Cloud Scheduler ジョブを作成します。
  • 指標データと推奨事項を保存する 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 の使用状況と使用率の指標の期間を設定します。デフォルトは 259,200 秒(3 日)です。
    • METRIC_DISTANCE: データポイントが返される間隔。デフォルトは 600 秒(10 分)です。

    これらの値をワークロードのニーズに応じて調整します。たとえば、月に 1 回実行されるバッチ ワークロードの場合は、TF_VAR_RECOMMENDATION_WINDOW_SECONDSMETRIC_WINDOW2592000 秒(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}
    

デプロイを確認する

  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
    

    出力が一致しない場合は、5 分待ってから gcloud scheduler jobs run recommendation-schedule --location $REGION コマンドを実行します。

BigQuery でコンテナの推奨値を表示する

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    BigQuery に移動

  2. gke_metrics テーブルと container_recommendations ビューにデータが表示されていることを確認します。ワークロードの数によっては、すべての指標を BigQuery に書き込むのに数分かかることがあります。

  3. Query Editor で、container_recommendations ビューのすべての行を選択します。

    SELECT * FROM `PROJECT_ID.gke_metrics_dataset.container_recommendations`
    

    このプログラムは、Cloud Monitoring から次の指標を抽出します。

    • ワークロードの詳細: プロジェクト ID、クラスタ名、コントローラ、コンテナ名。

    • CPU / メモリの使用量と使用率: ワークロードによって使用されている CPU とメモリの量、使用されている CPU とメモリの割合。

    • リクエストされた量と上限: ワークロードに対してリクエストされた CPU とメモリの量、ワークロードで許可されている CPU とメモリの最大量。

    • CPU とメモリ ワークロードの推奨事項: ワークロードが円滑に実行されるように、ワークロードに割り当てられる CPU とメモリの量に関する推奨事項(Deployment に対する VPA の推奨事項、および Deopoyment 以外のオブジェクトの目標使用率に基づく)。

Looker Studio で推奨値を可視化する

Looker Studio は、データを可視化し、ダッシュボード、レポートを作成して、それらを利用できるようにする、セルフサービス型の無料のビジネス インテリジェンス プラットフォームです。Looker Studio を使用すると、データに接続し、可視化を行い、分析情報を他のユーザーと共有できます。

Looker Studio を使用して、BigQuery の container_recommendations ビューでデータを可視化します。

  1. ワークロードのサイズ適正化ダッシュボード テンプレートを開きます。
  2. [自分のデータを使用] をクリックします。
  3. プロジェクトを選択します。
  4. [データセット] の場合、[gke_metric_dataset] を選択します。
  5. [テーブル] の場合、[container_recommendations] を選択します。
  6. [Add(追加)] をクリックします。
  7. [レポートに追加] をクリックします。

Looker Studio テンプレートの詳細

Looker Studio テンプレートの詳細ページでは、次の情報が表示されます。

  • GKE ワークロードのサイズ適正化の概要: 次のようなクラスタの概要が提供されます。
    • 信頼性とパフォーマンスの問題のリスクがあるベスト エフォートとバースト可能なワークロードの数。
    • CPU とメモリのリソースを節約できる可能性。正の値は過剰プロビジョニングを示し、負の値は過少プロビジョニングであることを示します。
  • ワークロードの推奨事項: ワークロードの CPU とメモリのリクエスト量と上限に関する推奨事項を提供します。
  • リスクのある GKE ワークロード: 信頼性とパフォーマンスの問題が発生するリスクが特に高いワークロードが表示されます。
  • 履歴 - ワークロードのサイズ適正化 - 現状:ワークロードのサイズ適正化とベスト エフォート型のワークロード数の削減の実装に関する履歴ビューを提供します。

リクエストされた CPU とコンテナの推奨値の上限

リクエストされたワークロードの CPU と上限の値が等しい場合、QoS は保証済みとみなされ、CPU 推奨値は 14 日のウィンドウ期間内で最大値に設定されます。それ以外の場合は、14 日以内に VPA CPU が リクエストした推奨値の 95 パーセンタイルが使用されます。

CPU リクエストと上限の値が等しい場合、CPU 上限の推奨事項は、Deployment オブジェクトに対してのみ最大 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 アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトを削除する

課金が発生しないようにする最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

Delete a Google Cloud project:

gcloud projects delete PROJECT_ID

次のステップ