HorizontalPodAutoscaler のイベントログを収集する

このページでは、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 CLI と kubectl コマンドライン ツールがプリインストールされています。

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.31.5-gke.1090000 以降または 1.32.1-gke.1260000 以降を実行している必要があります。
  • GKE クラスタで Cloud Logging を有効にします。Cloud Logging の料金が適用されます。
  • モニタリングする HorizontalPodAutoscaler があることを確認します。水平 Pod 自動スケーラーのフィールドにセンシティブ データが含まれていないことを確認します。

費用

Cloud Logging を有効にして水平 Pod 自動スケーリングの決定ログを収集すると、Cloud Logging の料金が適用されます。

HorizontalPodAutoscaler の決定イベントを有効にする

gcloud

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

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

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

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

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

Terraform

Terraform を使用して KCP_HPA 決定ログを有効にするには、google_container_cluster リソースを更新します。logging_config ブロックで、enable_components フィールドのリストに KCP_HPA 値を追加します。

resource "google_container_cluster" "primary" {
  name     = "CLUSTER_NAME"
  location = "LOCATION"

  # ... other configuration ...

  logging_config {
    enable_components = ["SYSTEM_COMPONENTS", "KCP_HPA"]
  }
}

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

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

クラスタの更新されたロギング構成を取得してログのリストを調べ、KCP_HPA ログが有効になっていることを確認します。

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

出力は次のようになります。

SYSTEM_COMPONENTS,APISERVER,CONTROLLER_MANAGER,SCHEDULER,KCP_HPA

Cloud de Confiance コンソールで HorizontalPodAutoscaler のログを表示する

Horizontal Pod Autoscaler の動作は、Cloud de Confiance コンソールでモニタリングできます。このビューを使用すると、ワークロードのコンテキストを離れることなく、Cloud Logging で利用可能な同じアトミックな最終推奨ログを簡単に確認できます。

Cloud de Confiance コンソールで水平 Pod 自動スケーラーのログを表示するには、次の操作を行います。

  1. Cloud de Confiance コンソールで、[ワークロード] ページに移動します。

    [ワークロード] に移動

  2. 水平 Pod オートスケーラーによって管理されているワークロードを選択します。

  3. [スケーリング] タブをクリックします。

このタブには、リソース使用量、効率データ、ログなど、スケーリングに関連する情報が表示されます。このタブのデータは、ワークロードの自動スケーリングに最も効果的な構成を特定するのに役立ちます。[ログ] セクションでは、[ログ] と同じ情報を確認できます。また、これらのログを「イベント」、「最終的な推奨事項」、「アトミックな推奨事項」などの種類でフィルタすることもできます。さまざまなログの詳細については、ログの種類をご覧ください。

HorizontalPodAutoscaler の決定イベントを無効にする

gcloud

クラスタを更新して、--logging フラグから KCP_HPA コンポーネントを削除します。

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

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

Terraform

Terraform を使用して KCP_HPA 決定ログを無効にするには、google_container_cluster リソースを更新します。logging_config ブロックで、enable_components フィールドのリストから KCP_HPA 値を削除します。

resource "google_container_cluster" "primary" {
  name     = "CLUSTER_NAME"
  location = "LOCATION"

  # ... other configuration ...

  logging_config {
    enable_components = ["SYSTEM_COMPONENTS"]
  }
}

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

このコマンドにより、KCP_HPA によって生成されたログのエクスポートが無効化されます。Cloud Logging の logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fhpa-controller" フィルタを使用して取得することはできません。

クラスタの更新されたロギング構成を取得してログのリストを調べ、KCP_HPA ログが無効になっていることを確認します。

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

出力は次のようになります。

SYSTEM_COMPONENTS,APISERVER,CONTROLLER_MANAGER,SCHEDULER

ログの種類

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

パフォーマンスや費用への影響だけでなく、想定されるログボリュームのストレージ要件も把握してください。次の例は、水平 Pod 自動スケーリングが各タイプの決定イベントを生成する頻度を示しています。

  • アトミックな推奨事項: 水平 Pod 自動スケーリングは、クラスタ内の各 HPA オブジェクトによってモニタリングされている指標ごとに、15 秒ごとに 1 つのアトミックな推奨事項イベントを生成します。たとえば、クラスタに 2 つの HPA オブジェクトがあり、それぞれの HPA オブジェクトが 3 つの指標をモニタリングしている場合、15 秒ごとに 6 つのアトミックな推奨事項がログに記録されます。

  • 最終的な推奨事項: 水平 Pod 自動スケーリングは、クラスタ内の HPA オブジェクトごとに最終的な推奨事項のイベントを 15 秒ごとに 1 つ生成します。たとえば、クラスタに 2 つの HPA オブジェクトがある場合、15 秒ごとに最終的な推奨事項が 2 つ記録されます。

2 つの HPA オブジェクトがそれぞれ 3 つの指標をモニタリングすると、KCP_HPA ログには 15 秒ごとに合計 8 個の決定イベント エントリが送信されます。

アトミックな推奨事項

アトミックな推奨事項ログには、水平 Pod 自動スケーリングで指定された個々の指標に基づく推奨事項が記載されます。

アトミックログには次のフィールドがあります。

フィールド 説明
start_time HPA が推奨事項の計算を開始した時刻。
hpa 推奨事項に関連付けられている HPA オブジェクトの名前。
pod_count 推奨の作成時に HPA に関連付けられる Pod の合計数。この数には、準備完了、準備完了でない、無視された Pod も含まれます。
metric 推奨事項に使用される指標の仕様とステータスに関する情報。metric フィールドには次のサブフィールドがあります。
  • index: Spec metrics 配列内の指標のインデックス。
  • type: MetricSourceType の値を持つ指標のタイプ(Resource、External など)。
  • spec: 指標の名前と、その指標に設定されたターゲット。
  • status: スケーラビリティとスケーリングの制限に関するステータス条件。
  • newest_sample_time: 最新の指標サンプルのタイムスタンプ。
  • newest_sample_age_seconds: 最新のサンプルの経過時間(推奨事項の計算開始からの秒数)。指標のサンプルが計算の開始より前の場合は、負の値になります。
summary summary フィールドには、推奨されるレプリカ数など、推奨結果に関する情報が表示されます。推奨事項を提案できない場合は、エラー メッセージが表示されます。summary フィールドには次のサブフィールドがあります。
  • dampening: HPA では、推奨事項とその増減で調整が行われ、スケール増大の可能性が抑えられます。増減は次のように行われます。
    • up: 増大の場合、HPA が指標のない Pod を、指標の使用率が 100% であると想定することを意味します。
    • down: 減少の場合、HPA が指標のない Pod を、指標の使用率が 0% であると想定することを意味します。
    • none: 増減は行われません。
  • override: HPA によって提案された推奨事項が適用されない理由(許容範囲が原因など)。オーバーライドが行われない場合は none。
  • result: 推奨の結果。推奨されるレプリカ数が提案されるか、推奨値を計算できない場合はエラー メッセージが表示されます。

アトミックな推奨事項のログの例:

{
  "insertId": "xiu4bty9k5b279wu",
  "jsonPayload": {
    "instance": {
      "vm_name": "my-unique-vm-identifier",
      "zone": "us-central1-a"
    },
    "atomicRecommendation": {
      "startTime": "2025-02-06T20:07:00.573419526Z",
      "hpa": "gke-managed-cim/kube-state-metrics",
      "metric": {
        "newestSampleAgeSeconds": -39.573419526,
        "status": {
          "averageValue": "25849856"
        },
        "newestSampleTime": "2025-02-06T20:06:21Z",
        "type": "Resource",
        "spec": {
          "target": {
            "averageValue": "400Mi"
          },
          "name": "memory"
        }
      },
      "podCount": {
        "ready": 1,
        "total": 1
      },
      "summary": {
        "override": "none",
        "replicas": 1,
        "dampening": "none"
      }
    }
  },
  "resource": {
    "type": "k8s_control_plane_component",
    "labels": {
      "project_id": "my-project-id",
      "cluster_name": "my-cluster",
      "location": "us-central1-a",
      "component_location": "us-central1-a",
      "component_name": "hpa-controller"
    }
  },
  "timestamp": "2025-02-06T20:07:00.593777835Z",
  "severity": "INFO",
  "labels": {
    "compute.googleapis.com/resource_name": "my-unique-vm-identifier"
  },
  "logName": "projects/my-project-id/logs/container.googleapis.com%2Fhpa-controller",
  "sourceLocation": {
    "file": "event_logger.go",
    "line": "61"
  },
  "receiveTimestamp": "2025-02-06T20:07:05.284753647Z"
}

最終的な推奨事項

最終的な推奨事項ログには、水平 Pod 自動スケーリングによって提案された統合された推奨事項が記述されます。水平 Pod 自動スケーリングは、さまざまな指標からすべてのアトミックな推奨事項を組み合わせて最終的な推奨事項を作成し、最終的な推奨事項を作動させます。作動とは、HPA が Deployment に、推奨値と一致するようにレプリカの数を調整するよう指示することを意味します。最終的な推奨値が実行中の Pod の数とは異なる Pod 数になっている場合、水平 Pod 自動スケーリングはスケールアップまたはスケールダウン イベントをトリガーして、Deployment を適切に調整します。

最終的な推奨事項ログには、次のフィールドがあります。

フィールド 説明
start_time HPA が推奨事項の計算を開始した時刻。
hpa 推奨事項に関連付けられている HPA オブジェクトの名前。
target_ref 推奨事項に関連付けられた HPA ScaleTargetRef オブジェクト。
configured_size HPA がこの推奨事項を計算して適用する前に最後に記録されたレプリカの数。
top_level_override HPA によって提案された推奨事項が適用されない理由(許容範囲が原因など)。オーバーライドがない場合、none と表示されます。
top_level_limit HPA によって提案された推奨事項を調整する必要がある場合の理由(HPA 仕様の MinReplicas フィールドまたは MaxReplicas フィールドで定義されたレプリカ数など)。
leading_metric_index Spec metrics 配列の先頭の指標は、関連するアトミックな推奨事項が最終的な推奨事項として使用される指標です。
normalization 安定化と制限の概要(ある場合)。

stabilization: 適用された場合の安定化の状態。安定化は、スケーリングに使用される指標が変動し続けている場合に、レプリカ数のフラッピングを制限するために使用されます。stabilization フィールドは次のサブフィールドで構成されています。

  • replicas: 安定化後のレプリカ数。
  • reason: 適用された安定化タイプ - scaleUp または scaleDown。
  • stabilization_window: 関連付けられた安定化の期間(秒単位)。
  • replicas_before_stabilization: 安定化前の推奨レプリカ数。

limitation: スケーリングの上限が適用された場合の処理方法。この方法によって、適用されている制限に基づいて HPA が提案する推奨事項が変更されます。limitation フィールドは次のサブフィールドで構成されています。

  • replicas: 制限後のレプリカ数。
  • reason: レプリカの最小数または最大数を超えたらスケーリングを行わない理由。
  • scaling_policy: 適用されるスケーリング ポリシー。
  • selectPolicy: 特定の方向にスケーリングするときにポリシーを選択する方法。MaxChange は MaxChangePolicySelect に、MinChange は MinChangePolicySelect に対応します。スケーリングが無効になっている場合、selectPolicy フィールドは表示されません。
  • replicas_before_limitation: 制限前の推奨レプリカ数。
replicas 推奨されるレプリカ数。
actuation_error 動作が失敗した際のエラーに関連付けられたエラー メッセージ。
actuation_time 正常に動作した際のタイムスタンプ。
actuation_latency_seconds 推奨事項の計算が開始されて動作が成功するまでの経過時間(秒単位)。

最終的な推奨事項ログの例:

{
  "insertId": "qzyv7alfv1sm19ns",
  "jsonPayload": {
    "finalRecommendation": {
      "actuationTime": "2025-02-06T20:06:57.487786873Z",
      "targetRef": {
        "name": "kube-state-metrics",
        "kind": "StatefulSet",
        "apiVersion": "apps/v1"
      },
      "topLevelLimit": "none",
      "hpa": "gke-managed-cim/kube-state-metrics",
      "topLevelOverride": "noRecommendation",
      "replicas": 1,
      "configuredSize": 1,
      "actuationLatencySeconds": 0.003722451,
      "startTime": "2025-02-06T20:06:57.484064422Z"
    },
    "instance": {
      "vm_name": "my-unique-vm-identifier",
      "zone": "us-central1-a"
    }
  },
  "resource": {
    "type": "k8s_control_plane_component",
    "labels": {
      "cluster_name": "my-cluster",
      "component_location": "us-central1-a",
      "component_name": "hpa-controller",
      "location": "us-central1-a",
      "project_id": "my-project-id"
    }
  },
  "timestamp": "2025-02-06T20:06:57.488193527Z",
  "severity": "INFO",
  "labels": {
    "compute.googleapis.com/resource_name": "my-unique-vm-identifier"
  },
  "logName": "projects/my-project-id/logs/container.googleapis.com%2Fhpa-controller",
  "sourceLocation": {
    "file": "event_logger.go",
    "line": "61"
  },
  "receiveTimestamp": "2025-02-06T20:06:57.844898727Z"
}

トラブルシューティング

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

予定はありません

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

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

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

  kubectl describe hpa $HPA_NAME

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

次のステップ