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

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

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

目標

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

費用

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

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

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

始める前に

  1. アカウントにログインします。 Google Cloud を初めて使用する場合は、 アカウントを作成して、実際のシナリオで Google プロダクトのパフォーマンスを評価してください。 Google Cloud新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $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. Parameter Manager から読み取る権限を CREMA サービス アカウントに付与します。

    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 beta 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 beta 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 を入力し、 [Shut down] をクリックしてプロジェクトを削除します。

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

  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 リソースを削除します。

次のステップ