Prometheus 指標に基づいてワーカープールを自動スケーリングする

このチュートリアルでは、Cloud Run External Metrics Autoscaling(CREMA)を使用して、Prometheus 指標に基づいて Cloud Run ワーカープールを自動スケーリングする方法について説明します。

CREMA 自動スケーラー サービスは、Prometheus のデータを使用して比率ベースの計算を行います。オートスケーラー サービスは、インスタンス数を動的に調整して、現在のワークロードに適した量のリソースがワーカープールに確保されるようにします。CREMA は、特定の期間のワーカープールの CPU 使用率を計算し、構成されたしきい値と比較してインスタンスを調整します。

目標

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

費用

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

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。

新規の Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

  1. Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud 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

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud 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

  5. Verify that billing is enabled for your Google Cloud project.

  6. Cloud Run、Parameter Manager、Artifact Registry、Cloud Build、Cloud Monitoring の各 API を有効にします。

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

    API を有効にするには、serviceusage.services.enable 権限を含む Service Usage 管理者 IAM ロール(roles/serviceusage.serviceUsageAdmin)が必要です。詳しくは、ロールを付与する方法をご覧ください。

    API を有効にする

  7. gcloud CLI をインストールして初期化します
  8. コンポーネントを更新します。
    gcloud components update
  9. このチュートリアルで使用する CREMA の構成変数を次のように設定します。
    export PROJECT_ID=PROJECT_ID
    export REGION=us-central1
    export CREMA_SA_NAME=crema-service-account
    export CONSUMER_SA_NAME=consumer-service-account
    export CONSUMER_WORKER_POOL_NAME=worker-pool-consumer
    export CREMA_SERVICE_NAME=my-crema-service
    PROJECT_ID は、 Google Cloud プロジェクトの ID に置き換えます。
  10. 次のコマンドを実行して、プロジェクト ID を設定します。
    gcloud config set project $PROJECT_ID
  11. Cloud Run スケーリング サービスの料金は、スケーリングをトリガーする頻度に基づいて発生します。詳細については、料金計算ツールで費用を見積もってください。

必要なロール

チュートリアルを完了するために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

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

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

カスタム サービス アカウントを作成する

このチュートリアルでは、プロビジョニングされたリソースを使用するために必要な最小権限を持つ次の 2 つのサービス アカウントが必要です。

  • コンシューマー サービス アカウント: バックグラウンド ワークロードを実行するワーカープールの ID。次のコマンドを実行して、コンシューマー サービス アカウントを作成します。

    gcloud iam service-accounts create $CONSUMER_SA_NAME \
      --display-name="Consumer service account"
    
  • CREMA サービス アカウント: オートスケーラーの ID。次のコマンドを実行して、CREMA サービス アカウントを作成します。

    gcloud iam service-accounts create $CREMA_SA_NAME \
      --display-name="CREMA service account"
    

カスタム サービス アカウントに追加の権限を付与する

ワーカープールをスケーリングするには、カスタム サービス アカウントに次の権限を付与します。

  1. CREMA サービス アカウントに Parameter Manager から読み取る権限を付与します。

    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/parametermanager.parameterViewer"
    
  2. ワーカープールをスケーリングする権限を CREMA サービス アカウントに付与します。

    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/run.developer"
    
  3. CREMA サービス アカウントにサービス アカウント ユーザーロールを付与します。

    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/iam.serviceAccountUser"
    
  4. CREMA サービス アカウントに指標を表示する権限を付与します。

     gcloud projects add-iam-policy-binding $PROJECT_ID \
       --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
       --role="roles/monitoring.viewer"
    
  5. CREMA サービス アカウントに指標を書き込む権限を付与します。

     gcloud projects add-iam-policy-binding $PROJECT_ID \
       --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
       --role="roles/monitoring.metricWriter"
    

Cloud Run ワーカープールをデプロイする

CREMA がスケールアップできるように、インスタンス数 0 のワーカープールをデプロイします。

gcloud run worker-pools deploy $CONSUMER_WORKER_POOL_NAME \
  --image us-docker.pkg.dev/cloudrun/container/worker-pool:latest \
  --instances 0 \
  --region $REGION \
  --memory 4G \
  --cpu 4 \
  --service-account="$CONSUMER_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com"

オートスケーラー CREMA サービスをデプロイする

Prometheus 指標に基づいてワーカープールを自動スケーリングする CREMA サービスをデプロイします。

オートスケーラーを構成する

このチュートリアルでは、Parameter Managerを使用して、CREMA の YAML 構成ファイルを保存します。

  1. Parameter Manager でパラメータを作成して、CREMA のパラメータ バージョンを保存します。

    PARAMETER_ID=crema-config
    PARAMETER_REGION=global
    gcloud parametermanager parameters create $PARAMETER_ID --location=$PARAMETER_REGION --parameter-format=YAML
    
  2. ルート ディレクトリに、オートスケーラー構成を定義する YAML ファイル my-crema-config.yaml を作成します。自動スケーリングのしきい値を CPU 使用率 50% に設定します。

    apiVersion: crema/v1
    kind: CremaConfig
    spec:
      pollingInterval: 30
      triggerAuthentications:
        - metadata:
            name: google-crema-auth
          spec:
            podIdentity:
              provider: gcp
      scaledObjects:
        - spec:
            scaleTargetRef:
              name: projects/PROJECT_ID/locations/us-central1/workerPools/worker-pool-consumer
            minReplicaCount: 1
            maxReplicaCount: 20
            triggers:
              - type: prometheus
                metadata:
                  serverAddress: https://monitoring.googleapis.com/v1/projects/PROJECT_ID/location/global/prometheus
                  threshold: "0.5"
                  query: |
                    histogram_quantile(
                      0.50,
                      sum by (le) (
                        increase(
                          run_googleapis_com:container_cpu_utilizations_bucket{
                            monitored_resource="cloud_run_worker_pool",
                            worker_pool_name="worker-pool-consumer",
                            location="us-central1",
                            project_id="PROJECT_ID"
                          }[2m]
                        )
                      )
                    )
                authenticationRef:
                  name: google-crema-auth
            advanced:
              horizontalPodAutoscalerConfig:
                behavior:
                  scaleDown:
                    stabilizationWindowSeconds: 300
    

    PROJECT_ID は、 Google Cloud プロジェクト ID に置き換えます。

  3. ローカルの YAML ファイルを新しいパラメータ バージョンとしてアップロードします。

    LOCAL_YAML_CONFIG_FILE=my-crema-config.yaml
    PARAMETER_VERSION=1
    
    gcloud parametermanager parameters versions create $PARAMETER_VERSION \
      --location=$PARAMETER_REGION \
      --parameter=$PARAMETER_ID \
      --payload-data-from-file=$LOCAL_YAML_CONFIG_FILE
    
  4. 次のコマンドを実行して、パラメータの追加が成功したことを確認します。

    gcloud parametermanager parameters versions list \
    --parameter=$PARAMETER_ID \
    --location=$PARAMETER_REGION
    

    projects/PROJECT_ID/locations/global/parameters/crema-config/versions/1 などのパラメータ パスが表示されます。

ワークロードをスケーリングするサービスをデプロイする

ワーカープールをスケーリングするサービスをデプロイするには、次のコマンドを事前構築済みのコンテナ イメージで実行します。

CREMA_CONFIG_PARAM_VERSION=projects/$PROJECT_ID/locations/$PARAMETER_REGION/parameters/$PARAMETER_ID/versions/$PARAMETER_VERSION
IMAGE=us-central1-docker.pkg.dev/cloud-run-oss-images/crema-v1/autoscaler:1.0

gcloud run deploy $CREMA_SERVICE_NAME \
  --image=${IMAGE} \
  --region=${REGION} \
  --service-account="${CREMA_SA_NAME}" \
  --no-allow-unauthenticated \
  --no-cpu-throttling \
  --base-image=us-central1-docker.pkg.dev/serverless-runtimes/google-24/runtimes/java25 \
  --labels=created-by=crema \
  --set-env-vars="CREMA_CONFIG=${CREMA_CONFIG_PARAM_VERSION},OUTPUT_SCALER_METRICS=True"

自動スケーリング サービスをテストする

自動スケーリング サービスが正しく機能していることを確認するには、Cloud Run サービスの [ログ] タブを確認します。CREMA オートスケーラー サービスは、コンシューマー ワーカー インスタンスを 0 からスケールアップします。

指標が更新されるたびに、サービスのログに次のログが表示されます。

[INFO] [METRIC-PROVIDER] Starting metric collection cycle
[INFO] [METRIC-PROVIDER] Successfully fetched scaled object metrics ...
[INFO] [METRIC-PROVIDER] Sending scale request ...
[INFO] [SCALER] Received ScaleRequest ...
[INFO] [SCALER] Current instances ...
[INFO] [SCALER] Recommended instances ...

Cloud Run は、各ログ メッセージに、そのメッセージを出力したコンポーネントのラベルを付けます。

クリーンアップ

Google Cloud アカウントで追加料金が発生しないようにするには、このチュートリアルでデプロイしたすべてのリソースを削除します。

プロジェクトを削除する

このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで行った変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。

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

プロジェクトを削除するには:

  1. Google Cloud コンソールで [リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

チュートリアル リソースの削除

  1. このチュートリアルでデプロイした Cloud Run サービスを削除します。Cloud Run サービスの費用は、リクエストを受け取るまでは発生しません。

    Cloud Run サービスを削除するには、次のコマンドを実行します。

    gcloud run services delete SERVICE-NAME

    SERVICE-NAME は、サービスの名前に置き換えます。

    Cloud Run サービスは Google Cloud コンソールで削除することもできます。

  2. チュートリアルの設定時に追加した gcloud のデフォルトのリージョン構成を削除します。

     gcloud config unset run/region
    
  3. プロジェクト構成を削除します。

     gcloud config unset project
    
  4. このチュートリアルで作成した他の Google Cloud リソースを削除します。

次のステップ