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 トラフィック データのみを使用するように自動スケーリングを構成しています。

グループごとの指標

グループごとの指標では、インスタンスごとの使用率データをエクスポートしない標準指標やカスタム指標による自動スケーリングが可能になります。グループはグループ全体に適用される値に基づいてスケーリングされ、グループで処理可能な作業量やグループの稼働状況に応じたサイズになります。グループは、そのグループの指標の値とユーザーが定義した構成の変動に基づいてスケーリングされます。

グループごとの指標に基づいて自動スケーリングを構成する場合は、指標に対してどのようにオートスケーラーがインスタンスをプロビジョニングするかを示す必要があります。

  • インスタンスの割り当て: 各 VM に割り当て可能な作業量に応じて VM を追加または削除するよう、オートスケーラーに指示するには、インスタンスの割り当てを指定します。このパラメータには、各 VM が処理できる想定作業量を表す値を指定します。たとえば、各 VM に 2 作業単位を割り当てるには「2」と指定し、1/2 作業単位を割り当てるには「0.5」と指定します。オートスケーラーは MIG をスケーリングして、指標が示す作業量を完了するために十分な VM を確保します。指標の値が 10 の場合に各 VM に 0.5 作業単位を割り当てると、オートスケーラーは MIG に 20 個の VM を作成します。インスタンスの割り当てによるスケーリングでは、指標の値が 0 に減るとインスタンス グループの VM 数が 0 に縮小されます。指標の値が 0 を超えると、VM 数が元に戻ります。次の図は、インスタンスの割り当てポリシーによってスケーリングを行う場合の指標の値と VM 数の比例関係を示しています。 指標の値とインスタンス数の比例関係。
  • 使用率のターゲット: VM を追加または削除して指定された指標の値を維持するよう、オートスケーラーに指示するには、使用率のターゲットを指定します。指標が指定されたターゲットを超えると、オートスケーラーは指標がターゲット値に下がるまで VM を追加していきます。指標が指定されたターゲット値を下回ると、指標がターゲット値に上がるまでオートスケーラーは VM を削除していきます。使用率のターゲットによるスケーリングでは、グループの VM 数を 0 まで縮小できません。次の図は、使用率のターゲットを維持するためにオートスケーラーが指標の値に応じて VM を追加、削除する様子を示しています。 ターゲット使用率を維持するために VM を追加、削除するオートスケーラー

各オプションのユースケースを以下に示します。

  • インスタンスの割り当て: Pub/Sub サブスクリプション内の未確認メッセージ数、またはネットワーク エンドポイントの合計 QPS レートに基づいて、MIG のサイズをスケールします。
  • 使用率のターゲット: MIG のサイズを、カスタム指標(標準のインスタンスごとの CPU 使用量やメモリ使用量の指標ではない)の使用率のターゲットに基づいてスケールします。たとえば、レイテンシのカスタム指標に基づいてグループをスケールします。

グループごとの指標に基づいて自動スケーリングを構成し、インスタンスの割り当てを指定する場合、MIG の VM 数は 0 までスケールインできます。インスタンス グループが行う作業がないことを指標が示した場合、新しい作業が用意されたことを指標が検出するまで、そのグループの VM 数は 0 にスケールインされます。グループごとの指標に基づくスケーリングとは対照的に、インスタンスごとの自動スケーリングでは少なくとも 1 つの VM からリソース使用率の指標を取得する必要があるため、グループのサイズが 1 を下回ることはできません。

グループごとの指標のフィルタ

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

グループごとの指標のフィルタ要件

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

  • 結合セレクタに使用できるのは AND 演算子だけです。
  • = 直接等価性比較演算子は、各セレクタのどの関数にも使用できません。たとえば、startswith() 関数で = 比較演算子は使用できません。
  • ワイルドカードは使用できません。
  • フィルタの値は二重引用符で囲む必要があります(例: metric.labels.state = "used")。
  • フィルタには指標タイプセレクタ metric.type = "..." を指定でき、元の metric フィールドも含めることができます。必要に応じて、metric フィールドだけを使用することも可能です。この指標の要件は次のとおりです。
    • 少なくとも 1 つの場所に指標を指定する必要があります。
    • 両方の場所に指標を指定できますが、同じ指標を指定する必要があります。
  • resource.type セレクタを指定する必要がありますが、グループごとの指標を使用してスケーリングを行う場合は gce_instance に設定できません。
  • 最適な結果を得るために、具体的なフィルタを使用して、グループに対して 1 つの時系列だけが返されるようにします。フィルタによって複数の時系列が返される場合、時系列はまとめられます。

グループごとのモニタリング指標を使用した自動スケーリングの構成

Google Cloud Console、Google Cloud CLI、または Compute Engine API を使用して、グループごとの指標で自動スケーリングを構成します。

Console

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

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

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

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

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

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

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

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

  8. [指標のエクスポート スコープ] セクションで、[グループあたりの単一時系列] を選択します。

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

  10. [モニタリング対象のリソースタイプ] を指定します。

  11. 複数のストリームやラベルを持つ指標の個別の値を使用する場合は、追加のフィルタ式を使用します。 このフィルタはオートスケーラーのフィルタ要件を満たしている必要があります。

  12. [スケーリング ポリシー] セクションで、[単一のインスタンスの割り当て] か [使用率のターゲット] を選択します。

    • インスタンスの割り当てポリシーを選択した場合、MIG 内の各 VM に割り当てる作業量を表す値を [単一インスタンスの割り当て] に指定します。たとえば、各 VM に 2 作業単位を割り当てるには「2」と指定します。オートスケーラーは(指標が示した)作業量を完了するために十分な VM を維持します。指標の値が 10 の場合に各 VM に 2 作業単位を割り当てると、オートスケーラーは MIG に 5 個の VM を作成します。
    • 使用率のターゲット ポリシーを選択した場合は、次のようにします。
      • オートスケーラーが維持する指標の値を表す値を [使用率のターゲット] に指定します。
      • 指標の値のタイプを表す [使用率のターゲットのタイプ] を選択します。
  13. 完了したら変更内容を保存します。

gcloud

グループごとの指標に基づいてスケーリングを行うオートスケーラーの作成方法は、インスタンスごとの指標に基づいてスケーリングを行うオートスケーラーの作成方法と同様です。ただし、指定するフラグは異なります。このコマンドで --update-stackdriver-metric フラグを使用して、モニタリング指標の URL を指定します。次のいずれかのフラグを使用して、オートスケーラーがインスタンスをプロビジョニングする方法も指定する必要があります。

  • インスタンスの割り当て: --stackdriver-metric-single-instance-assignment フラグを指定します。
  • 使用率のターゲット: --stackdriver-metric-utilization-target フラグを指定します。

インスタンスの割り当て:

測定する指標を指定し、--stackdriver-metric-single-instance-assignment フラグを指定して各インスタンスが処理する想定作業量を示します。--stackdriver-metric-filter フラグを使用して指標のフィルタを指定する必要もあります。

次のコマンドでは、--stackdriver-metric-single-instance-assignment フラグを使用して、グループごとの指標に基づいてオートスケーラーを作成します。

gcloud compute instance-groups managed set-autoscaling GROUP_NAME \
    --max-num-replicas=MAX_INSTANCES \
    --min-num-replicas=MIN_INSTANCES \
    --update-stackdriver-metric='METRIC_URL' \
    --stackdriver-metric-filter='METRIC_FILTER' \
    --stackdriver-metric-single-instance-assignment=INSTANCE_ASSIGNMENT \
    [--zone=ZONE | --region=REGION]

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

  • GROUP_NAME: オートスケーラーを追加する MIG の名前。
  • MAX_INSTANCES: MIG が持つ VM の最大数。
  • MIN_INSTANCES: MIG が持つ VM の最小数。
  • METRIC_URL: Monitoring 指標のプロトコルフリーの URL。
  • METRIC_FILTER: Cloud Monitoring フィルタ。関連する TimeSeriesMonitoredResource を含むモニタリング フィルタを指定します。このフィルタはオートスケーラーのフィルタ要件を満たしている必要があります。
  • INSTANCE_ASSIGNMENT: MIG 内の各 VM インスタンスに割り当てる作業量。たとえば、各 VM に 2 作業単位を割り当てるには「2」と指定し、1/2 作業単位を割り当てるには「0.5」と指定します。オートスケーラーは MIG をスケーリングして、指標が示す作業量の完了に必要な VM を確保します。指標の値が 10 の場合に各 VM に 0.5 作業単位を割り当てると、オートスケーラーは MIG に 20 個の VM をプロビジョニングします。
  • ZONE: ゾーン MIG の場合、MIG が配置されているゾーン。
  • REGION: リージョン MIG の場合、MIG が配置されているリージョン。

使用率のターゲット:

オートスケーラーが測定する指標の値に基づいてインスタンス数を指定するのではなく、グループごとの指標で使用率のターゲットを使用した方が適切な場合があります。この場合でもオートスケーラーでグループごとの指標を参照できますが、オートスケーラーは指定された使用率のターゲットを維持しようとします。ターゲットとターゲットのタイプは --stackdriver-metric-utilization-target フラグを使用して指定します。--stackdriver-metric-filter フラグを使用して指標のフィルタを指定する必要もあります。

次のコマンドでは、--stackdriver-metric-utilization-target フラグを使用して、グループごとの指標に基づいてオートスケーラーを作成します。

gcloud compute instance-groups managed set-autoscaling GROUP_NAME \
    --max-num-replicas=MAX_INSTANCES \
    --min-num-replicas=MIN_INSTANCES \
    --update-stackdriver-metric='METRIC_URL' \
    --stackdriver-metric-filter='METRIC_FILTER' \
    --stackdriver-metric-utilization-target=TARGET_VALUE \
    --stackdriver-metric-utilization-target-type=TARGET_TYPE \
    [--zone=ZONE | --region=REGION]

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

  • GROUP_NAME: オートスケーラーを追加する MIG の名前。
  • MAX_INSTANCES: MIG が持つ VM の最大数。
  • MIN_INSTANCES: MIG が持つ VM の最小数。
  • METRIC_URL: Monitoring 指標のプロトコルフリーの URL。
  • METRIC_FILTER: Cloud Monitoring フィルタ。関連する TimeSeriesMonitoredResource を含むモニタリング フィルタを指定します。resource.type 値を指定する必要がありますが、グループごとの指標を使用してスケーリングを行う場合は gce_instance を指定できません。このフィルタはオートスケーラーのフィルタ要件を満たしている必要があります。
  • TARGET_VALUE: オートスケーラーが維持しようとする指標の値。
  • TARGET_TYPE: 指標の値のタイプ。オートスケーラーが指標を GAUGE としてモニターすることを設定できます。または、値の delta-per-minutedelta-per-second のいずれかをモニタリング対象にできます。
  • ZONE: ゾーン MIG の場合、MIG が配置されているゾーン。
  • REGION: リージョン MIG の場合、MIG が配置されているリージョン。

グループごとの自動スケーリングと連動する利用可能なオートスケーラーの Google Cloud CLI コマンドとフラグのリストを確認するには、Google Cloud CLI リファレンスをご覧ください。

API

グループごとのモニタリング指標を使用してゾーン MIG に自動スケーリングを構成するには、autoscalers リソース、リージョン MIG の場合は、regionAutoscalers リソースを使用します。

次のいずれかのパラメータを使用して、オートスケーラーがインスタンスをプロビジョニングする方法を指定します。

  • インスタンスの割り当て: singleInstanceAssignment パラメータを指定します。
  • 使用ターゲット: utilizationTarget パラメータを指定します。

インスタンスの割り当て:

この singleInstanceAssignment パラメータは各 VM が処理する想定作業量を指定します。

たとえば、次の呼び出しを行って、グループごとの指標のインスタンス割り当てに基づいてゾーン MIG をスケーリングするオートスケーラーを作成します。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/autoscalers

{
 "name": "example-autoscaler",
 "target": "zones/ZONE/instanceGroupManagers/GROUP_NAME",
 "autoscalingPolicy": {
  "maxNumReplicas": MAX_INSTANCES,
  "minNumReplicas": MIN_INSTANCES,
  "customMetricUtilizations": [
    {
      "metric": "METRIC_URL",
      "filter": "METRIC_FILTER",
      "singleInstanceAssignment": INSTANCE_ASSIGNMENT
    }
  ],
 }
}

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

  • PROJECT_ID: プロジェクト ID。
  • ZONE: MIG が配置されているゾーン。
  • GROUP_NAME: オートスケーラーを追加する MIG の名前。
  • MAX_INSTANCES: MIG が持つ VM の最大数。
  • MIN_INSTANCES: MIG が持つ VM の最小数。
  • METRIC_URL: Monitoring 指標のプロトコルフリーの URL。
  • METRIC_FILTER: Cloud Monitoring フィルタ。関連する TimeSeriesMonitoredResource を含むモニタリング フィルタを指定します。resource.type 値を指定する必要がありますが、グループごとの指標を使用してスケーリングを行う場合は gce_instance を指定できません。このフィルタはオートスケーラーのフィルタ要件を満たしている必要があります。
  • INSTANCE_ASSIGNMENT: MIG 内の各 VM インスタンスに割り当てる作業量。たとえば、各 VM に 2 作業単位を割り当てるには「2」と指定し、1/2 作業単位を割り当てるには「0.5」と指定します。オートスケーラーは MIG をスケーリングして、指標が示す作業量の完了に必要な VM を確保します。指標の値が 10 の場合に各 VM に 0.5 作業単位を割り当てると、オートスケーラーは MIG に 20 個の VM をプロビジョニングします。

使用率のターゲット:

オートスケーラーが測定する指標の値に基づいてインスタンス数を指定するのではなく、グループごとの指標で使用率のターゲットを使用した方が適切な場合があります。この場合でもオートスケーラーでグループごとの指標を参照できますが、オートスケーラーは指定された使用率のターゲットを維持しようとします。このターゲットは utilizationTarget パラメータで指定します。filter パラメータを使用して指標のフィルタを指定する必要もあります。

たとえば、次の呼び出しを行って、グループごとの指標の使用率のターゲットに基づいてゾーン MIG をスケーリングするオートスケーラーを作成します。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/autoscalers

    {
     "name": "example-autoscaler",
     "target": "zones/ZONE/instanceGroupManagers/GROUP_NAME",
     "autoscalingPolicy": {
      "maxNumReplicas": MAX_INSTANCES,
      "minNumReplicas": MIN_INSTANCES,
      "customMetricUtilizations": [
        {
          "metric": "METRIC_URL",
          "filter": "METRIC_FILTER",
          "utilizationTarget": TARGET_VALUE,
          "utilizationTargetType": TARGET_TYPE
        }
      ],
     }
    }

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

  • PROJECT_ID: プロジェクト ID。
  • ZONE: MIG が配置されているゾーン。
  • GROUP_NAME: オートスケーラーを追加する MIG の名前。
  • MAX_INSTANCES: MIG が持つ VM の最大数。
  • MIN_INSTANCES: MIG が持つ VM の最小数。
  • METRIC_URL: Monitoring 指標のプロトコルフリーの URL。
  • METRIC_FILTER: Cloud Monitoring フィルタ。関連する TimeSeriesMonitoredResource を含むモニタリング フィルタを指定します。resource.type 値を指定する必要がありますが、グループごとの指標を使用してスケーリングを行う場合は gce_instance を指定できません。このフィルタはオートスケーラーのフィルタ要件を満たしている必要があります。
  • TARGET_VALUE: オートスケーラーが維持しようとする指標の値。
  • TARGET_TYPE: 指標の値のタイプ。オートスケーラーが指標を GAUGE としてモニターすることを設定できます。または、値の DELTA_PER_MINUTEDELTA_PER_SECOND のいずれかをモニタリング対象にできます。

例: インスタンスの割り当てを使用して Pub/Sub キューに基づいてスケーリングする

次のように設定されているものとします。

  • アクティブな Pub/Sub トピックは、一部のソースからメッセージを受信します。
  • アクティブな Pub/Sub サブスクリプションが pull 構成内でそのトピックに接続されています。サブスクリプションの名前は our-subscription です。
  • ワーカーの集合(プール)がそのサブスクリプションからメッセージを pull して処理します。そのプールは our-instance-group という名前のゾーン MIG で、ゾーン us-central1-a にあります。このプールに含まれるワーカー数は 100 を超えることはできません。キューにメッセージがない場合はワーカー数を 0 にスケールインする必要があります。
  • 平均して、1 ワーカーが 1 分間に処理するメッセージは 1 つです。

インスタンスの割り当てに最適な値を判断するために、いくつかの方法を検討します。

  • キュー内のすべてのメッセージをできるだけ迅速に処理しようとする場合は、インスタンスの割り当て値として 1 を選択します。これで、キュー内のメッセージごとに VM が 1 つ作成されます(このグループ内の VM の最大数を限度とします)。ただし、これによってオーバープロビジョニングが起こる可能性があります。最悪の場合、作成された VM が、オートスケーラーによってシャットダウンされるまでの間にメッセージを 1 つしか処理しないという状況も生じます。この場合、リソースの利用時間は実際の作業時間をはるかに超えます。
    • ワーカーが複数のメッセージを並行して処理できる場合、この値を並列プロセスの数に増やすことが適切です。
    • この例の場合、1 つのメッセージを複数のワーカーが処理するのはあり得ないため、この値を 1 より小さい値に設定するのは妥当ではありません。
  • あるいは、処理レイテンシがリソースの使用率やオーバーヘッド コストに比べてそれほど重要でない場合、各 VM がその存続期間中にいくつのメッセージを処理すれば利用効率が高いとみなせるかを計算できます。起動とシャットダウンにかかる時間、そして自動スケーリングが VM をすぐに削除するわけではないという点を考慮してください。たとえば、スタートアップとシャットダウンにかかる時間が合計 5 分、自動スケーリングによって VM が削除されるまでの時間が約 10 分とします。オートスケーラーによってシャットダウンされるまでの間に、追加 VM が少なくとも 15 件のメッセージを処理できるのであれば、追加 VM をグループ内に作成することが効率的であると計算します。結果、VM の作成、スタートアップ、シャットダウンにかかる合計時間を考慮すると、オーバーヘッドは最大 25% です。この場合、インスタンスの割り当ての値として 15 を選択できます。
  • どちらの方法も、処理レイテンシとリソース使用率のどちらを優先するかに応じてバランスを取ることができ、最終的に 1 から 15 の間の数値になります。

使用可能な Pub/Sub 指標を調べると、サブスクリプション キューの長さを表す指標 subscription/num_undelivered_messages が見つかります。

この指標は、キュー内のすべてのメッセージ(現在処理中で、まだ確認応答が行われていないメッセージを含む)をエクスポートします。処理中のメッセージを含まない指標の使用はおすすめできません。こうした指標は作業が残っている場合でも 0 に下がる場合があるため、自動スケーリングによって縮小が行われ、実際の作業が中断されるおそれがあります。

これで、キューに応じた自動スケーリングを構成できます。

gcloud compute instance-groups managed set-autoscaling \
    our-instance-group \
    --zone=us-central1-a \
    --max-num-replicas=100 \
    --min-num-replicas=0 \
    --update-stackdriver-metric=pubsub.googleapis.com/subscription/num_undelivered_messages \
    --stackdriver-metric-filter="resource.type = pubsub_subscription AND resource.labels.subscription_id = our-subscription" \
    --stackdriver-metric-single-instance-assignment=15

例: 使用率のターゲットを使用して平均レイテンシに基づいてスケーリングする

関連する徴候を示す指標が、前の例のような、処理可能な作業量の合計やグループに適用可能な別のリソースを表さず、代わりに、平均やパーセンタイルなどの統計プロパティを表す場合があります。この例では、グループの平均処理レイテンシに基づいてスケーリングすることを想定しています。

次のように設定されているものとします。

  • our-instance-group という名前の MIG に特定のタスクの実行が割り当てられています。このグループはゾーン us-central1-a にあります。
  • 特定のレベルに維持する値をエクスポートする Cloud Monitoring カスタム指標があります。この例では、この指標がグループに割り当てられたクエリ処理の平均レイテンシを表すと想定します。
    • カスタム指標の名前は custom.googleapis.com/example_average_latency です。
    • カスタム指標のラベルのキーは group_name、値は MIG の名前 our-instance-group と同じです。
    • カスタム指標は、グローバル モニタリング対象リソース(特定の VM に関連付けられていないリソース)に関するデータをエクスポートします。

指標の値が特定の値を超えたら、負荷に対応するためにグループに VM を追加し、その値を下回ったら一部のリソースを解放することにします。自動スケーリングでは、指標がターゲットをどの程度超えたか、あるいは下回ったかに比例して、VM を徐々に追加または削除していきます。この例では、計算で得られたターゲット値は 100 と想定しています。

これで、グループごとの使用率のターゲット 100 を使用してグループの自動スケーリングを構成できます。この数値は、オートスケーラーが維持しなければならない指標の値を表します。

gcloud compute instance-groups managed set-autoscaling \
    our-instance-group \
    --zone=us-central1-a \
    --max-num-replicas=100 \
    --min-num-replicas=0 \
    --update-stackdriver-metric=custom.googleapis.com/example_average_latency \
    --stackdriver-metric-filter "resource.type = global AND metric.labels.group_name = our-instance-group" \
    --stackdriver-metric-utilization-target=100 \
    --stackdriver-metric-utilization-target-type=delta-per-second

次のステップ