Cloud Monitoring の指標に基づくスケーリング

このドキュメントでは、Monitoring の指標に基づいてマネージド インスタンス グループ(MIG)をスケーリングする方法を説明します。

CPU 使用率外部 HTTP(S) ロードバランサの処理能力に基づいて MIG をスケーリングすることもできます。

Monitoring の指標に基づいて MIG をスケーリングする場合、次の指標タイプに基づいてスケーリングできます。

  • インスタンスごとの指標。選択した指標は、MIG 内の各仮想マシン(VM)インスタンスに関するリソース使用率データを示します。
  • グループごとの指標。マネージド インスタンス グループ全体に関する値を示す指標に基づいて各グループがスケールされます。

指標には、Cloud Monitoring サービスで提供されている標準指標とユーザーが作成するカスタムの Cloud Monitoring 指標があります。

制限事項

Cloud Monitoring の指標に基づくスケーリングには、すべてのオートスケーラーの制限事項と以下の制限事項が適用されます。

  • Cloud Monitoring のログベースの指標に基づいて自動スケーリングを行うことはできません。
  • リソース メタデータ ラベルを使用して、自動スケーリングの指標をフィルタリングすることはできません。使用できるのは、指標とモニタリング対象リソースタイプで定義されたラベルのみです。

始める前に

インスタンスごとの指標

インスタンスごとの指標は、MIG 内の各 VM に関するリソース使用率データを示します。インスタンスごとの指標では、MIG のサイズが 1 VM を下回ることはできません。オートスケーラーが動作するには、少なくとも 1 つの実行中 VM に関する指標が必要です。

個々の VM に固有ではない Cloud Monitoring 指標を使用してスケーリングする必要がある場合や、MIG をゼロにスケールダウンする必要がある場合は、グループごとの指標を使用してスケーリングするように MIG を構成できます。

インスタンスごとの標準指標

Cloud Monitoring には、VM のモニタリングに使用できる一連の標準指標があります。ただし、オートスケーラーがスケーリングのために使用できる有効な使用率指標は標準指標の一部だけです。

スケーリングに有効な使用率指標は以下の条件を満たすものです。

  • 標準指標に gce_instance モニタリング対象リソースのデータが含まれていること。timeSeries.list API を使用して、特定の指標がこのリソースのデータをエクスポートするかどうかを確認できます。

  • 標準指標はインスタンスの稼働状況を表し、その値はグループ内の VM 数に比例して増減します。

次の指標はスケーリングには有効ではありません。この指標の値は使用率に基づいて変化せず、オートスケーラーがその値に比例してスケーリングを行うことができないためです。

compute.googleapis.com/instance/cpu/reserved_cores

オートスケーラーに使用する標準指標を選択したら、その指標を使用する自動スケーリングを構成できます。

カスタム指標

Cloud Monitoring を使用してカスタム指標を作成し、独自のモニタリング データを Monitoring サービスに書き込むことができます。これにより、使い慣れたデータ構造と一貫したクエリ構文を使用して、Google Cloud の標準データと独自のカスタム モニタリング データに並列にアクセスできるようになります。カスタム指標がある場合は、それらの指標のデータに基づいたスケーリングを選択できます。

前提条件

カスタム指標を使用するには、まず次の手順を行います。

  • カスタム指標を作成する。カスタム指標の作成方法については、カスタム指標の使用をご覧ください。
  • グループ内のすべての VM からカスタム指標をエクスポートするように MIG を設定します。

有効なカスタム指標の選択

すべてのカスタム指標をオートスケーラーで使用できるとは限りません。有効なカスタム指標を選択するには、指標が以下の条件を満たしている必要があります。

  • インスタンスごとの指標である。特定の Compute Engine VM インスタンスごとに関連するデータをエクスポートする指標でなければなりません。
  • インスタンスごとにエクスポートされた値が gce_instance モニタリング対象リソースに関連付けられていること。このような指標には、次のラベルが含まれています。
    • zone。インスタンスが存在するゾーンの名前が設定されます。
    • instance_id。VM に割り当てられた固有の数値 ID が設定されます。
  • データのエクスポート間隔が 60 秒以内の指標であること。60 秒よりも短い間隔でデータをエクスポートすると、オートスケーラーがより迅速に負荷の変化に対応できます。60 秒よりも長い間隔でデータをエクスポートすると、オートスケーラーが負荷の変化に迅速に対応しきれない場合があります。
  • 指標は有効な使用率指標である必要があります。そうすることで、指標のデータを使用して VM の数を比例的にスケールアウトまたはスケールインできます。
  • int64 または double のデータ値をエクスポートする指標であること。

オートスケーラーでカスタム指標を使用できるようにするには、MIG 内のすべての VM から、そのカスタム指標のデータをエクスポートする必要があります。

インスタンスごとのモニタリング指標を使用する自動スケーリングの構成

標準指標とカスタム指標のどちらを使用する場合でも、オートスケーラーをセットアップする処理は同じです。Cloud Monitoring の指標を使用するオートスケーラーを作成するには、指標 ID、ターゲット使用率レベル、使用率のターゲット タイプを指定する必要があります。これらの各プロパティについて、以下で説明します。

  • 指標 ID: 使用する指標の名前。カスタム指標を使用する場合は、指標を作成したときにこの名前を定義しています。指標 ID は次の形式になります。

    custom.googleapis.com/path/to/metric
    

    指標の作成、参照、および読み込みの詳細については、カスタム指標の使用をご覧ください。

  • 目標使用率レベル: オートスケーラーが維持するレベル。この値は正の数値でなければなりません。たとえば、24.51100 とはどちらも許容される値です。この値は、0.0~1.0 の範囲の浮動小数点値である CPU や負荷分散とは異なることに注意してください。

  • ターゲット タイプ: インスタンスから収集したデータをオートスケーラーがどのように計算するか。使用可能なターゲット タイプ:

    • GAUGE。オートスケーラーが直近数分間に収集したデータの平均値を計算して、それをオートスケーラーのターゲット使用率と比較します。
    • DELTA_PER_MINUTE。オートスケーラーは 1 分あたりの平均増加率を計算して、それをターゲット使用率と比較します。
    • DELTA_PER_SECOND。オートスケーラーは 1 秒あたりの平均増加率を計算して、それをターゲット使用率と比較します。

    正確な比較のために、ターゲット使用率を秒単位で設定する場合は、オートスケーラーのターゲット タイプとして DELTA_PER_SECOND を使用します。同様に、分単位でのターゲット使用率には DELTA_PER_MINUTE を使用します。

Console

  1. Google Cloud Console で、[インスタンス グループ] ページに移動します。

    [インスタンス グループ] に移動

  2. マネージド インスタンス グループがない場合は作成します。マネージド インスタンス グループがある場合は、リストにある MIG の名前をクリックして、インスタンス グループの概要ページを開きます。

  3. インスタンス グループの概要ページで [編集] をクリックします。

  4. 自動スケーリング構成が存在しない場合は、[自動スケーリング] で [自動スケーリングを構成] をクリックします。

  5. [自動スケーリング モード] で [オン: グループに対してインスタンスを追加および削除します] を選択して、自動スケーリングを有効にします。

  6. [自動スケーリング指標] セクションで、既存の指標が存在する場合、それをクリックして編集するか、[指標を追加] をクリックして別の指標を追加します。

  7. [指標タイプ] を [Cloud Monitoring の指標] に設定します。

  8. [指標のエクスポート スコープ] セクションで、[インスタンスあたりの時系列] を選択して、インスタンスごとの指標を使用する自動スケーリングを構成します。

  9. [指標 ID] セクションで、指標名を example.googleapis.com/path/to/metric の形式で入力します。

  10. [その他のフィルタ式] セクションで次の操作を行います。

    • ゾーン MIG の場合は、必要に応じてフィルタを入力して、複数のストリームやラベルを持つ指標の個別の値を使用します。詳細については、インスタンスごとの指標のフィルタリングをご覧ください。
    • リージョン MIG の場合、このセクションは空白のままにします。
  11. [使用率のターゲット] セクションで、ターゲット値を指定します。

  12. [使用率のターゲットのタイプ] セクションで、ターゲット タイプが指標の測定値の種類と一致することを確認します。

  13. 完了したら変更内容を保存します。

gcloud

たとえば、Google Cloud CLI では、次のコマンドによって、GAUGE ターゲット タイプを使用するオートスケーラーが作成されます。オートスケーラーを作成する場合は、--custom-metric-utilization パラメータだけではなく、--max-num-replicas パラメータも必要です。

gcloud compute instance-groups managed set-autoscaling example-managed-instance-group \
    --custom-metric-utilization metric=example.googleapis.com/path/to/metric,utilization-target-type=GAUGE,utilization-target=10 \
    --max-num-replicas 20 \
    --cool-down-period 90 \
    --region us-west1

--cool-down-period フラグを使用して、アプリケーションの初期化に要する時間をオートスケーラーに指定できます。正確なクールダウン期間を指定することで、オートスケーラーによる判断が向上します。たとえば、スケールアウト時、オートスケーラーは初期化中の VM のデータを無視します。初期化中の VM はアプリケーションの通常の使用状況を表していない可能性があるためです。クールダウン期間のデフォルト値は 60 秒です。

gcloud CLI の使用可能なコマンドとフラグの全一覧を確認するには、gcloud リファレンスをご覧ください。

API

API で、次の URL への POST リクエストを作成します。myproject は自分のプロジェクト ID に置き換え、us-central1-f は任意のゾーンに置き換えます。

POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/autoscalers/

リクエスト本文には name フィールド、target フィールド、autoscalingPolicy フィールドを含める必要があります。autoscalingPolicy には、maxNumReplicascustomMetricUtilizations プロパティを指定します。

coolDownPeriodSec フィールドを使用して、アプリケーションの初期化に要する時間をオートスケーラーに指定できます。正確なクールダウン期間を指定することで、オートスケーラーによる判断が向上します。たとえば、スケールアウト時、オートスケーラーは初期化中の VM のデータを無視します。初期化中の VM はアプリケーションの通常の使用状況を表していない可能性があるためです。クールダウン期間のデフォルト値は 60 秒です。

POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/autoscalers

{
 "name": "example-autoscaler",
 "target": "zones/us-central1-f/instanceGroupManagers/example-managed-instance-group",
 "autoscalingPolicy": {
  "maxNumReplicas": 10,
  "coolDownPeriodSec": 90,
  "customMetricUtilizations": [
   {
    "metric": "example.googleapis.com/some/metric/name",
    "utilizationTarget": 10,
    "utilizationTargetType": "GAUGE"
   }
  ]
 }
}

インスタンスごとの指標のフィルタリング

インスタンスごとの Cloud Monitoring 指標にフィルタを適用すると、ストリームまたはラベルを複数持つ指標の個別の値を使用して、MIG をスケールできます。

インスタンスごとの指標のフィルタ要件

オートスケーラーのフィルタは Cloud Monitoring のフィルタ構文に対応していますが、いくつかの制限があります。インスタンスごとの指標のフィルタは次の要件を満たしている必要があります。

  • 結合セレクタに使用できるのは AND 演算子だけです。
  • = 直接等価性比較演算子だけが使用可能ですが、この演算子は関数では使用できません。たとえば、startswith() 関数で = 比較演算子は使用できません。
  • フィルタの値は二重引用符で囲む必要があります(例: metric.labels.state = "used")。
  • ワイルドカードは使用できません。
  • resource.typeresource.labels.* セレクタは設定できません。インスタンスごとの指標では、常にグループのすべてのインスタンス リソースが使用されます。
  • 最適な結果を得るために、インスタンスごとに 1 つの時系列だけを返すフィルタを作成します。フィルタによって複数の時系列が返される場合、時系列はまとめられます。

指標をフィルタするためのオートスケーラーの構成

Google Cloud Console、Google Cloud CLI、または Compute Engine API を使用して、MIG の自動スケーリングに使用する指標のフィルタを追加します。

Console

インスタンスごとの指標をフィルタリングするオートスケーラーの作成方法は通常のインスタンスごとのオートスケーラーの作成方法と同様ですが、指標フィルタも指定する必要があります。たとえば、compute.googleapis.com/instance/network/received_bytes_count 指標にラベル instance_nameloadbalanced が含まれているとします。loadbalanced ブール値に基づいてフィルタするには:

  1. Cloud Console で、[インスタンス グループ] ページに移動します。

    [インスタンス グループ] に移動

  2. MIG がない場合は作成します。それ以外の場合は、MIG の名前をクリックして、インスタンス グループの概要ページを開きます。

  3. インスタンス グループの概要ページで [編集] をクリックします。

  4. 自動スケーリング構成が存在しない場合は、[自動スケーリング] で [自動スケーリングを構成] をクリックします。

  5. [自動スケーリング モード] で [オン: グループに対してインスタンスを追加および削除します] を選択して、自動スケーリングを有効にします。

  6. [自動スケーリング指標] セクションで、既存の指標が存在する場合、それをクリックして編集するか、[指標を追加] をクリックして別の指標を追加します。

  7. [指標タイプ] セクションで、[Stackdriver Monitoring の指標] を選択します。

  8. [指標のエクスポート スコープ] セクションで、[インスタンスあたりの時系列] を選択して、インスタンスごとの指標を使用する自動スケーリングを構成します。

  9. [指標 ID] セクションに指標名を入力します。例: compute.googleapis.com/instance/network/received_bytes_count

  10. [その他のフィルタ式] セクションにフィルタを入力します。例: 'metric.labels.loadbalanced = true'

  11. 完了したら変更内容を保存します。

gcloud

インスタンスごとの指標をフィルタするオートスケーラーの作成方法は通常のインスタンスごとのオートスケーラーの作成方法と同様ですが、指標フィルタを指定し、使用率のターゲットとターゲット タイプのフラグを個別に指定する必要があります。たとえば、compute.googleapis.com/instance/network/received_bytes_count 指標にラベル instance_nameloadbalanced が含まれているとします。loadbalanced ブール値に基づいてフィルタするには、--stackdriver-metric-filter フィルタフラグに 'metric.labels.loadbalanced = true' 値を指定します。使用率のターゲットとターゲット タイプのフラグを個別に含めます。

gcloud compute instance-groups managed set-autoscaling example-managed-instance-group \
    --update-stackdriver-metric=compute.googleapis.com/instance/network/received_bytes_count \
    --stackdriver-metric-utilization-target=10 \
    --stackdriver-metric-utilization-target-type=delta-per-second \
    --stackdriver-metric-filter='metric.labels.loadbalanced = true' \
    --max-num-replicas 20 \
    --cool-down-period 90 \
    --zone us-central1-f

この例では、使用率のターゲットとして loadbalanced トラフィック データのみを使用するように自動スケーリングを構成しています。

使用可能な gcloud コマンドとフラグの全一覧を確認するには、gcloud CLI リファレンスをご覧ください。

API

ゾーン MIG の指標フィルタを追加するには、autoscalers リソースを使用します。リージョン MIG の場合は、ベータ版の regionAutoscalers リソースを使用します。

インスタンスごとの指標をフィルタするオートスケーラーの作成方法は通常のインスタンスごとのオートスケーラーの作成方法と同様ですが、指標フィルタを指定し、使用率のターゲットとターゲット タイプのフラグを個別に指定する必要があります。たとえば、compute.googleapis.com/instance/network/received_bytes_count 指標にラベル instance_nameloadbalanced が含まれているとします。loadbalanced ブール値に基づいてフィルタするには、filter パラメータに "metric.labels.loadbalanced = true" 値を指定します。

API では、次の URL への POST リクエストを作成します。myproject は自分のプロジェクト ID に置き換え、us-central1-f は任意のゾーンに置き換えます。リクエスト本文には name フィールド、target フィールド、autoscalingPolicy フィールドを含める必要があります。autoscalingPolicy には、maxNumReplicascustomMetricUtilizations プロパティを指定します。

POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/autoscalers

{
 "name": "example-autoscaler",
 "target": "zones/us-central1-f/instanceGroupManagers/example-managed-instance-group",
 "autoscalingPolicy": {
  "maxNumReplicas": 10,
  "coolDownPeriodSec": 90,
  "customMetricUtilizations": [
   {
    "metric": "compute.googleapis.com/instance/network/received_bytes_count",
    "filter": "metric.labels.loadbalanced = true",
    "utilizationTarget": 10,
    "utilizationTargetType": "DELTA_PER_SECOND"
   }
  ]
 }
}

この例では、使用率のターゲットとして loadbalanced トラフィ