垂直 Pod オートスケーラーのイベントログを収集する

このページでは、Google Kubernetes Engine(GKE)の垂直 Pod オートスケーラーによって出力される決定イベントについて説明します。これらのイベントを分析することで、垂直 Pod オートスケーラー コントローラがワークロードのスケーリングを管理する方法に関する分析情報を取得し、アクションの背後にある意思決定プロセスを把握できます。

垂直 Pod 自動スケーリングにより、決定イベントが出力されます。このイベントは、Cloud Logging のログエントリとして保存されます。

始める前に

次の前提条件を満たしていることを確認してください。

プロジェクトの選択または作成

既存のプロジェクトを使用することも、このチュートリアル用の新しいプロジェクトを作成することもできます。

  1. In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Cloud de Confiance project.

API を有効にする

GKE API と Cloud Logging API を有効にします。

API を有効にするために必要なロール

API を有効にするには、serviceusage.services.enable 権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を介してこの権限がすでに付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を介してこの権限を取得できます。ロールを付与する方法をご覧ください。

API を有効にする

Cloud Shell を設定する

このチュートリアルでは、Cloud Shell を使用して gcloud コマンドと kubectl コマンドを実行します。Cloud Shell は、 Cloud de Confiance by S3NSでホストされているリソースを管理するためのシェル環境です。Google Cloud CLIkubectl コマンドライン ツールがプリインストールされています。

Cloud de Confiance コンソールで Cloud Shell をアクティブにします。

Cloud Shell をアクティブにする

コンソールの下部にあるフレーム内で Cloud Shell セッションが開きます。

このチュートリアルでコマンドを実行する前に、デフォルト プロジェクトがサンプルアプリをデプロイするプロジェクト ID に設定されていることを確認します。まだ設定していない場合は、Cloud Shell で次のコマンドを実行します。

gcloud config set project PROJECT_ID

PROJECT_ID は、実際のプロジェクト ID に置き換えます。

必要なロールと権限

ログの生成を有効にする権限、ログにアクセスして処理する権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

  • クラスタで垂直 Pod 自動スケーリングのイベントのロギングを有効にする: Kubernetes Engine クラスタ管理者 roles/container.clusterAdmin
  • ログにアクセスし、ログ エクスプローラとオブザーバビリティ分析を使用する: ログ閲覧者 roles/logging.viewer

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

要件

  • GKE クラスタでバージョン 1.36.0-gke.1601000 以降を実行している必要があります。
  • GKE クラスタで Cloud Logging を有効にします。
  • モニタリングする垂直 Pod オートスケーラーがあることを確認します。垂直 Pod 自動スケーラーのフィールドに機密情報が含まれていないことを確認します。

費用

Cloud Logging を有効にして垂直 Pod オートスケーラーの決定ログを収集すると、Cloud Logging の料金が適用されます。

垂直 Pod 自動スケーラーの決定ログを有効にする

次のセクションのコマンドを使用すると、KCP_VPA によって生成されたログをエクスポートし、Cloud Logging の logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fvpa-controller" に保存できます。

新しいクラスタでログを有効にする

KCP_VPA 意思決定ログを有効にして新しいクラスタを作成するには、次のコマンドを実行します。

gcloud container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID \
    --logging=SYSTEM,KCP_VPA

次のように置き換えます。

既存のクラスタでログを有効にする

既存のクラスタで KCP_VPA の決定ログを有効にするには、次の操作を行います。

  1. クラスタの既存の構成を確認します。クラスタに特定のロギング コンポーネントがすでに構成されている場合は、既存のロギング構成に追加するか、上書きするかを決定します。

  2. 垂直 Pod 自動スケーラーの決定ログを有効にするには、次のコマンドを実行します。既存の構成に追加する場合は、既存のロギング構成もコマンドに追加します。

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --project=PROJECT_ID \
        --logging=SYSTEM,KCP_VPA
    

    次のように置き換えます。

ロギングが有効になっていることを確認する

クラスタで KCP_VPA の決定ログが有効になっていることを確認するには、クラスタの更新されたロギング構成を取得してログのリストを確認します。これを行うには、次のコマンドを実行します。

gcloud container clusters describe CLUSTER_NAME \
    --location=LOCATION \
    --flatten=loggingConfig \
    --format='csv[delimiter=",",no-heading](componentConfig.enableComponents)'

次のように置き換えます。

クラスタで KCP_VPA の決定ログが有効になっている場合、出力は次のようになります。

SYSTEM_COMPONENTS,APISERVER,CONTROLLER_MANAGER,SCHEDULER,KCP_VPA

ログ エクスプローラで垂直 Pod オートスケーラー ログを表示する

垂直 Pod オートスケーラーの動作は、ログ エクスプローラでモニタリングできます。垂直 Pod 自動スケーラーのログを表示する手順は次のとおりです。

  1. [ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. [すべてのログ名] を選択し、ログ名で vpa-controller を検索します。

    ログ エクスプローラには、プロジェクトで垂直 Pod オートスケーラー ログを有効にしたすべてのクラスタのログなど、すべての垂直 Pod オートスケーラー ログが表示されます。

  3. クラスタ名またはワークロード名を使用してログをフィルタできます。たとえば、クラスタ内の特定のワークロードのイベントを一覧表示するには、次のクエリを使用してクラスタ名とワークロード名を指定します。

    resource.labels.cluster_name="CLUSTER_NAME" AND
    jsonPayload.target.name="WORKLOAD_NAME"
    

    次のように置き換えます。

    • CLUSTER_NAME: クラスタの名前。
    • WORKLOAD_NAME: ワークロードの名前。

垂直 Pod 自動スケーリングの決定ログを無効にする

  1. 既存のクラスタで KCP_VPA の決定ログを無効にするには、次のコマンドを実行します。

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --project=PROJECT_ID \
        --logging=SYSTEM
    
  2. KCP_VPA 決定ログが無効になっていることを確認します。これを行うには、次のコマンドを実行します。

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --flatten=loggingConfig \
        --format='csv[delimiter=",",no-heading](componentConfig.enableComponents)'
    

    クラスタで KCP_VPA の決定ログが無効になっている場合、出力は次のようになります。

    SYSTEM_COMPONENTS,APISERVER,CONTROLLER_MANAGER,SCHEDULER
    

ログの種類

垂直 Pod 自動スケーリングの決定イベントは、GKE クラスタと同じプロジェクトの _Default bucket にある Cloud Logging の logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fvpa-controller" ロケーションに保存されます。ログに記録されるイベントはすべて JSON 形式で、ログエントリの jsonPayload フィールドで確認できます。

生成されるログのタイプと頻度は、ワークロード用に構成された垂直 Pod 自動スケーリング モードによって異なります。VPA ログには、実行するオペレーションによって分類される 4 種類があります。

  • 推奨事項の更新: 各垂直 Pod 自動スケーラーは、1 分ごとに新しい推奨事項の更新ログを 1 つ生成します。
  • Pod の強制排除: 垂直 Pod 自動スケーラーが Recreate モードでサイズ変更を決定すると、各垂直 Pod 自動スケーラーは Pod ごとに 1 つの Pod 強制排除ログを生成します。
  • 強制排除時に推奨事項を適用する: 垂直 Pod 自動スケーラーが Recreate モードでサイズ変更を決定すると、各垂直 Pod 自動スケーラーは Pod ごとに 1 つの推奨事項適用ログを生成します。
  • 推奨事項をインプレースで適用する: 垂直 Pod オートスケーラーが InPlaceOrRecreate モードでサイズ変更を決定すると、各垂直 Pod オートスケーラーは Pod ごとに 1 つの推奨事項をインプレースで適用するログを生成します。

コントローラが出力できるログの種類は、垂直 Pod オートスケーラーのモードによって異なります。次の表に、各モードで出力できるログを示します。

垂直 Pod オートスケーラーのモード 出力できるログの種類
Auto(非推奨)または Recreate
  • 最適化案を更新する
  • Pod を強制排除する
  • 削除時に推奨事項を適用する
InPlaceOrRecreate
  • 最適化案を更新する
  • 最適化案をその場で適用する
  • Pod の強制排除(このタイプのログは In-place のサイズ変更が失敗した場合に発生する可能性があります)
  • 削除時に推奨事項を適用する(このタイプのログは In-place のサイズ変更が失敗した場合に発生する可能性があります)

InPlaceOrRecreate モードの垂直 Pod オートスケーラーの場合、In-place resize が失敗すると、オートスケーラーは Recreate モードと同じ動作をします。

最適化案を更新する

更新推奨ログは、次の垂直 Pod 自動スケーラー モードで生成できます。Auto(非推奨)、RecreateInPlaceOrRecreate

この決定ログの jsonPayload には、次のフィールドが含まれます。

フィールド 説明
vpaName VPA の名前。
vpaNamespace VPA の Namespace。
target この VPA がターゲットとするワークロード。
  • name: ワークロードの名前。
  • kind: ワークロードの種類。
  • apiVersion: ワークロードの API バージョン。
operation 実行中のオペレーション。値は次のいずれかです。
  • UPDATE_RECOMMENDATION
  • EVICT_POD
  • APPLY_RECOMMENDATION_IN_PLACE
  • APPLY_RECOMMENDATION_ON_EVICTION
state オペレーションの状態。値は次のいずれかです。
  • SUCCEEDED
  • SKIPPED
  • FAILED
reason

この理由は、オペレーションがスキップまたは失敗した理由を説明します。

オペレーション APPLY_RECOMMENDATION_IN_PLACEAPPLY_RECOMMENDATION_ON_EVICTION の成功例では、適用された最適化案は、適用された変更(上限設定や Autopilot リソース比率など)により、オペレーション UPDATE_RECOMMENDATION の元の最適化案と異なる可能性があることを明確にしています。

recommendedResources 未加工の推奨事項。これは、VPA オブジェクトの Status.Recommendation フィールドとまったく同じです。
  • containerName: この推奨事項の対象となるコンテナの名前。
  • target: 適用される可能性のある実際の推奨事項。
  • lowerBound: 推奨の下限。
  • upperBound: 推奨の上限。
  • uncappedTarget: 下限または上限で上限を設定する前の推奨事項。
confidence 推奨事項の信頼度。このフィールドは、状態が succeeded の場合に存在します。値は次のいずれかです。
  • LOW: VPA が処理した指標サンプルが 10 個未満です。
  • HIGH: VPA が 10 個以上の指標サンプルを処理しました。

更新の推奨事項ログの例:

{
 "insertId": "ehz6w9d304v4zttg",
 "jsonPayload": {
   "state": "SUCCEEDED",
   "instance": {
     "vm_name": "my-unique-vm-identifier",
     "zone": "us-central1-c"
   },
   "recommendedResources": [
     {
       "lowerBound": {
         "memory": "5Mi",
         "cpu": "5m"
       },
       "containerName": "nginx",
       "uncappedTarget": {
         "memory": "5Mi",
         "cpu": "1m"
       },
       "upperBound": {
         "memory": "5Mi",
         "cpu": "5m"
       },
       "target": {
         "memory": "5Mi",
         "cpu": "5m"
       }
     }
   ],
   "operation": "UPDATE_RECOMMENDATION",
   "target": {
     "name": "my-workload",
     "kind": "Deployment",
     "apiVersion": "apps/v1"
   },
   "vpaNamespace": "default",
   "vpaName": "my-vpa"
 },
 "resource": {
   "type": "k8s_control_plane_component",
   "labels": {
     "component_location": "us-central1-c",
     "project_id": "my-project",
     "cluster_name": "my-cluster",
     "location": "us-central1-c",
     "component_name": "vpa-controller"
   }
 },
 "timestamp": "2026-01-22T19:28:16.069635605Z",
 "severity": "INFO",
 "labels": {
   "compute.googleapis.com/resource_name": "my-unique-vm-identifier"
 },
 "logName": "projects/my-project/logs/container.googleapis.com%2Fvpa-controller",
 "sourceLocation": {
   "file": "vpa_event_logger.go",
   "line": "23"
 },
 "receiveTimestamp": "2026-01-22T19:28:17.750678359Z"
}

Pod を強制排除する

Pod の削除ログは、VPA モード Auto(非推奨)と Recreate で使用できます。このログタイプは、In-place resize オペレーションが失敗した場合、VPA モード InPlaceOrRecreate でも可能です。

この決定ログの jsonPayload には、次のフィールドが含まれます。

フィールド 説明
vpaName VPA の名前。
vpaNamespace VPA の Namespace。
target この VPA がターゲットとするワークロード。
  • name: ワークロードの名前。
  • kind: ワークロードの種類。
  • apiVersion: ワークロードの API バージョン。
operation 実行中のオペレーション。値は次のいずれかです。
  • UPDATE_RECOMMENDATION
  • EVICT_POD
  • APPLY_RECOMMENDATION_IN_PLACE
  • APPLY_RECOMMENDATION_ON_EVICTION
state オペレーションの状態。値は次のいずれかです。
  • SUCCEEDED
  • SKIPPED
  • FAILED
reason

この理由は、オペレーションがスキップまたは失敗した理由を説明します。

オペレーション APPLY_RECOMMENDATION_IN_PLACEAPPLY_RECOMMENDATION_ON_EVICTION の成功例では、適用された推奨事項が、適用された変更(上限設定や Autopilot リソース比率など)により、オペレーション UPDATE_RECOMMENDATION の元の推奨事項と異なる可能性があることが理由で明確に示されています。

pod Pod の名前。

Pod の削除ログの例:

{
 "insertId": "8x278gc4f75oowf4",
 "jsonPayload": {
   "target": {
     "kind": "Deployment",
     "apiVersion": "apps/v1",
     "name": "my-deployment"
   },
   "operation": "EVICT_POD",
   "vpaName": "my-vpa",
   "pod": "my-deployment-856ff7966-gr4rh",
   "state": "SUCCEEDED",
   "vpaNamespace": "default",
   "instance": {
     "vm_name": "my-unique-vm-identifier",
     "zone": "us-central1-c"
   }
 },
 "resource": {
   "type": "k8s_control_plane_component",
   "labels": {
     "component_name": "vpa-controller",
     "cluster_name": "my-cluster",
     "component_location": "us-central1-c",
     "location": "us-central1-c",
     "project_id": "my-project"
   }
 },
 "timestamp": "2026-01-22T19:26:25.283067078Z",
 "severity": "INFO",
 "labels": {
   "compute.googleapis.com/resource_name": "my-unique-vm-identifier"
 },
 "logName": "projects/my-project/logs/container.googleapis.com%2Fvpa-controller",
 "sourceLocation": {
   "file": "vpa_event_logger.go",
   "line": "23"
 },
 "receiveTimestamp": "2026-01-22T19:26:27.766941073Z"
}

削除時に推奨事項を適用する

削除ログの推奨事項の適用は、VPA モード Auto(非推奨)と Recreate で使用できます。このログタイプは、In-place resize が失敗した場合、VPA モード InPlaceOrRecreate でも可能です。

この決定ログの jsonPayload には、次のフィールドが含まれます。

フィールド 説明
vpaName VPA の名前。
vpaNamespace VPA の Namespace。
target この VPA がターゲットとするワークロード。
  • name: ワークロードの名前。
  • kind: ワークロードの種類。
  • apiVersion: ワークロードの API バージョン。
operation 実行中のオペレーション。値は次のいずれかです。
  • UPDATE_RECOMMENDATION
  • EVICT_POD
  • APPLY_RECOMMENDATION_IN_PLACE
  • APPLY_RECOMMENDATION_ON_EVICTION
state オペレーションの状態。値は次のいずれかです。
  • SUCCEEDED
  • SKIPPED
  • FAILED
reason

この理由は、オペレーションがスキップまたは失敗した理由を説明します。

オペレーション APPLY_RECOMMENDATION_IN_PLACEAPPLY_RECOMMENDATION_ON_EVICTION の成功例では、適用された最適化案は、適用された変更(上限設定や Autopilot リソース比率など)により、オペレーション UPDATE_RECOMMENDATION の元の最適化案と異なる可能性があることを明確にしています。

pod Pod の名前。
appliedResources Pod に適用されるリソース。
  • containerName: コンテナの名前。
  • requests: 適用されたリソース リクエスト。
    • cpu: 適用された CPU。
    • memory: 適用されたメモリ。
  • limits: 適用されたリソース上限。
    • cpu: 適用された CPU。
    • memory: 適用されたメモリ。
confidence 推奨事項の信頼度。このフィールドは、状態が succeeded の場合に存在します。値は次のいずれかです。
  • LOW: VPA が処理した指標サンプルが 10 個未満です。
  • HIGH: VPA が 10 個以上の指標サンプルを処理しました。

削除ログに最適化案を適用する例:

{
 "insertId": "366tcmgdkq94eppg",
 "jsonPayload": {
   "appliedResources": [
     {
       "containerName": "my-container",
       "requests": {
         "memory": "15Mi",
         "cpu": "15m"
       }
     }
   ],
   "vpaName": "my-vpa",
   "vpaNamespace": "default",
   "instance": {
     "zone": "us-central1-c",
     "vm_name": "my-unique-vm-identifier"
   },
   "pod": "my-deployment-856ff7966-%",
   "state": "SUCCEEDED",
   "target": {
     "name": "my-deployment",
     "kind": "Deployment",
     "apiVersion": "apps/v1"
   },
   "operation": "APPLY_RECOMMENDATION_ON_EVICTION"
 },
 "resource": {
   "type": "k8s_control_plane_component",
   "labels": {
     "location": "us-central1-c",
     "component_location": "us-central1-c",
     "cluster_name": "my-cluster",
     "component_name": "vpa-controller",
     "project_id": "my-project"
   }
 },
 "timestamp": "2026-01-22T19:26:25.344313199Z",
 "severity": "INFO",
 "labels": {
   "compute.googleapis.com/resource_name": "my-unique-vm-identifier"
 },
 "logName": "projects/my-project/logs/container.googleapis.com%2Fvpa-controller",
 "sourceLocation": {
   "file": "vpa_event_logger.go",
   "line": "23"
 },
 "receiveTimestamp": "2026-01-22T19:26:32.744122156Z"
}

最適化案をその場で適用する

VPA モード InPlaceOrRecreate で、適用された推奨事項のログを利用できます。

この決定ログの jsonPayload には、次のフィールドが含まれます。

フィールド 説明
vpaName VPA の名前。
vpaNamespace VPA の Namespace。
target この VPA がターゲットとするワークロード。
  • name: ワークロードの名前。
  • kind: ワークロードの種類。
  • apiVersion: ワークロードの API バージョン。
operation 実行中のオペレーション。値は次のいずれかです。
  • UPDATE_RECOMMENDATION
  • EVICT_POD
  • APPLY_RECOMMENDATION_IN_PLACE
  • APPLY_RECOMMENDATION_ON_EVICTION
state オペレーションの状態。値は次のいずれかです。
  • SUCCEEDED
  • SKIPPED
  • FAILED
reason

この理由は、オペレーションがスキップまたは失敗した理由を説明します。

オペレーション APPLY_RECOMMENDATION_IN_PLACEAPPLY_RECOMMENDATION_ON_EVICTION の成功例では、適用された推奨事項が、適用された変更(上限設定や Autopilot リソース比率など)により、オペレーション UPDATE_RECOMMENDATION の元の推奨事項と異なる可能性があることが理由で明確に示されています。

pod Pod の名前。
appliedResources Pod に適用されるリソース。
  • containerName: コンテナの名前。
  • requests: 適用されたリソース リクエスト。
    • cpu: 適用された CPU。
    • memory: 適用されたメモリ。
  • limits: 適用されたリソース上限。
    • cpu: 適用された CPU。
    • memory: 適用されたメモリ。
confidence 推奨事項の信頼度。このフィールドは、状態が succeeded の場合に存在します。値は次のいずれかです。
  • LOW: VPA が処理した指標サンプルが 10 個未満です。
  • HIGH: VPA が 10 個以上の指標サンプルを処理しました。

推奨事項の適用ログの例:

{
 "insertId": "suzfuepgyiwap7hb",
 "jsonPayload": {
   "pod": "my-deployment-cdc7fd7b4-grxlk",
   "vpaNamespace": "default",
   "state": "SUCCEEDED",
   "target": {
     "name": "my-deployment",
     "apiVersion": "apps/v1",
     "kind": "Deployment"
   },
   "operation": "APPLY_RECOMMENDATION_IN_PLACE",
   "appliedResources": [
     {
       "containerName": "my-container",
       "limits": {
         "cpu": "10m",
         "memory": "10Mi"
       },
       "requests": {
         "cpu": "5m",
         "memory": "5Mi"
       }
     }
   ],
   "instance": {
     "zone": "us-central1-c",
     "vm_name": "my-unique-vm-identifier"
   },
   "vpaName": "my-vpa"
 },
 "resource": {
   "type": "k8s_control_plane_component",
   "labels": {
     "project_id": "my-project",
     "component_location": "us-central1-c",
     "cluster_name": "my-cluster",
     "location": "us-central1-c",
     "component_name": "vpa-controller"
   }
 },
 "timestamp": "2026-01-22T19:26:25.214095375Z",
 "severity": "INFO",
 "labels": {
   "compute.googleapis.com/resource_name": "my-unique-vm-identifier"
 },
 "logName": "projects/my-project/logs/container.googleapis.com%2Fvpa-controller",
 "sourceLocation": {
   "file": "vpa_event_logger.go",
   "line": "23"
 },
 "receiveTimestamp": "2026-01-22T19:26:27.766941073Z"
}

トラブルシューティング

このセクションでは、垂直 Pod 自動スケーラーのイベントに関連する問題と解決手順について説明します。

予定はありません

垂直 Pod 自動スケーリングの決定イベントが表示されない場合は、次のすべてを行っていることを確認してください。

  • クラスタで Cloud Logging を有効にしている。
  • クラスタの KCP_VPA ログを有効にしている。
  • 正しく構成された vpa オブジェクトを少なくとも 1 つクラスタにデプロイしている。

vpa オブジェクトの構成を確認するには、次のコマンドを実行します。

kubectl describe vpa $VPA_NAME

それでも KCP_VPA ログが表示されない場合は、Cloud de Confiance サポートにお問い合わせください。

次のステップ