外部指標を使用してワーカープールを自動スケーリングする

このページでは、外部のイベント ドリブン指標を使用して Cloud Run ワーカープールを自動スケーリングする方法について説明します。Cloud Run 外部指標自動スケーリング(CREMA)は、Kubernetes ベースのイベント ドリブン自動スケーリング(KEDA)を活用して、外部イベントソースに基づいてワークロードをスケーリングすることで、この機能を実現します。

サポートされているスケーラーと Cloud Run との互換性については、 Google Cloud GitHub ドキュメントの Cloud Run 外部指標自動スケーリング(CREMA)をご覧ください。

オートスケーラー サービスについて

ワーカープールを自動スケーリングするには、CREMA オートスケーラー サービスを Cloud Run にデプロイします。このサービスは次のアクションを実行します。

  1. Apache Kafka トピックや GitHub Runner Scaler などの外部イベントソースをポーリングします。

  2. YAML 構成に基づいて、必要なインスタンス数を計算します。

  3. ワーカープールのインスタンス数を自動的に更新します。

始める前に

  1. 設定ページの説明に従って、Cloud Run に新しいプロジェクトを設定したことを確認してください。

  2. Artifact Registry、Cloud Build、Cloud Run Admin API、Secret Manager、Parameter Manager API を有効にします。

    gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        run.googleapis.com \
        secretmanager.googleapis.com \
        parametermanager.googleapis.com
    
  3. GitHub ランナーや Apache Kafka などのイベント ドリブン ワークロードまたはリクエスト ベースのワークロードを構成します。ワークロード ソースがサポートされていることを確認するには、 Google Cloud GitHub ドキュメントの CREMA 互換性リストをご覧ください。

  4. 料金計算ツールで費用を見積もります。Cloud Run スケーリング サービスでは、スケーリングをトリガーする頻度に基づいて料金が発生します。

必要なロール

ワーカープールを自動スケーリングするために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

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

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

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

ワークロードに必要なプロビジョニングされたリソースを使用するために必要な最小権限を持つカスタム サービス アカウントを作成します。サービス アカウントを設定するには、次の操作を行います。

gcloud iam service-accounts create CREMA_SERVICE_ACCOUNT \
  --display-name="CREMA Service Account"

CREMA_SERVICE_ACCOUNT は、カスタム サービス アカウントの名前(crema-service-account など)に置き換えます。このコマンドは、crema-service-account@example-project.iam.gserviceaccount.com という形式のサービス アカウントを作成します。

CREMA 構成ファイルを作成する

スケーリング ロジックを定義するには、ルート ディレクトリに YAML 構成ファイルを作成します。このファイルは、モニタリングする外部ソース、リソースでの認証方法、スケーリングするワーカープールを CREMA サービスに指示します。

YAML の例

次の例は、GitHub ランナーの指標を使用して Cloud Run ワーカープール(example-workerpool)をスケーリングする構成ファイルを示しています。github_runner_token という名前の Secret Manager シークレットを使用して GitHub で認証し、指標を読み取ります。

  apiVersion: crema/v1
  kind: CremaConfig
  metadata:
    name: gh-demo
  spec:
    triggerAuthentications:
      - metadata:
          name: github-trigger-auth
        spec:
          gcpSecretManager:
            secrets:
              - parameter: personalAccessToken
                id: github_runner_token
                version: latest
    scaledObjects:
      - spec:
          scaleTargetRef:
            name: projects/example-project/locations/us-central1/workerpools/example-workerpool
          triggers:
            - type: github-runner
              name: example-runner
              metadata:
                owner: repo-owner
                runnerScope: repo
                repos: repo-name
                targetWorkflowQueueLength: 1
              authenticationRef:
                name: github-trigger-auth
          advanced:
            horizontalPodAutoscalerConfig:
              behavior:
                scaleDown:
                  stabilizationWindowSeconds: 10
                  policies:
                    - type: Pods
                      value: 100
                      periodSeconds: 10
                scaleUp:
                  stabilizationWindowSeconds: 10
                  policies:
                    - type: Pods
                      value: 2
                      periodSeconds: 10
        pollingInterval: 10

YAML 構成では、次の高レベルのパラメータを使用します。

  • triggerAuthentications: CREMA が外部サービスを認証する方法を決定します。たとえば、Secret Manager に保存されているトークンを使用します。

  • scaledObjects: Cloud Run ワーカープールと外部指標リソースのマッピングを定義します。このパラメータには以下が含まれます。

    • scaleTargetRef: スケーリングする Cloud Run サービスまたはワーカープール。

    • triggers: スケーリングに使用される特定の外部指標。外部指標ソースで認証が必要な場合は、authenticationRef フィールドを設定して、認証情報の TriggerAuthentications オブジェクトのいずれかを指定します。

  • pollingInterval: CREMA が指標を更新する間隔(秒単位)を制御します。このパラメータを省略すると、CREMA は自動的にポーリングしません。サービスに POST リクエストを送信して、スケーリング チェックを手動でトリガーする必要があります。

基本構成指標と高度な構成指標の定義の詳細については、 Google Cloud GitHub ドキュメントの構成リファレンスをご覧ください。

互換性のあるスケーラーの構成定義の完全なリストについては、KEDA ドキュメントのスケーラーをご覧ください。

CREMA 構成を Parameter Manager に保存する

CREMA オートスケーラー サービスのパラメータ バージョンを保存する手順は次のとおりです。

  1. Parameter Manager でパラメータを作成します。

    gcloud parametermanager parameters create PARAMETER_ID --location=global  --parameter-format=YAML
    

    PARAMETER_ID は、パラメータの名前に置き換えます。

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

    gcloud parametermanager parameters versions create PARAMETER_VERSION \
      --location=global \
      --parameter=PARAMETER_ID \
      --payload-data-from-file=LOCAL_YAML_CONFIG_FILE
    

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

    • PARAMETER_VERSION: パラメータ バージョンに割り当てる ID(例: 1)。
    • LOCAL_YAML_CONFIG_FILE: YAML 構成ファイルのパス。

詳細については、パラメータを作成するをご覧ください。

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

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

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

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:CREMA_SERVICE_ACCOUNT_NAME \
      --role="roles/parametermanager.parameterViewer"
    

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

  2. CREMA サービス アカウントに、ワーカープールの roles/run.developer ロールを付与します。これにより、CREMA サービスは指標の変化に応じてワーカープールのインスタンス数を変更できます。

    WORKER_POOL_NAME=WORKER_POOL_NAME
    WORKER_POOL_REGION=WORKER_POOL_REGION
    gcloud run worker-pools add-iam-policy-binding $WORKER_POOL_NAME \
      --region=$WORKER_POOL_REGION \
      --member="serviceAccount:CREMA_SERVICE_ACCOUNT_NAME" \
      --role="roles/run.developer"
    

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

    • WORKER_POOL_NAME: ワーカープールの名前。
    • WORKER_POOL_REGION: ワーカープールのリージョン。
  3. CREMA サービス アカウントに指標の書き込み権限を付与します。

     gcloud projects add-iam-policy-binding PROJECT_ID \
       --member="serviceAccount:CREMA_SERVICE_ACCOUNT_NAME" \
       --role="roles/monitoring.metricWriter"
    
  4. CREMA サービス アカウントにサービス アカウント ユーザーのロールを付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:CREMA_SERVICE_ACCOUNT_NAME" \
      --role="roles/iam.serviceAccountUser"
    

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

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

gcloud run deploy SERVICE_NAME\
  --image=us-central1-docker.pkg.dev/cloud-run-oss-images/crema-v1/autoscaler:1.0 \
  --region=SERVICE_REGION \
  --service-account="CREMA_SERVICE_ACCOUNT_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=projects/PROJECT_ID/locations/PARAMETER_REGION/parameters/PARAMETER_ID/versions/PARAMETER_VERSION,OUTPUT_SCALER_METRICS=True"

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

  • SERVICE_NAME: オートスケーラー サービスの名前。

  • SERVICE_REGION: サービスのリージョン。

  • CREMA_SERVICE_ACCOUNT_NAME: CREMA サービス アカウントの名前。

  • PROJECT_ID: 実際の Google Cloud プロジェクト ID。

  • PARAMETER_REGION、PARAMETER_ID、PARAMETER_VERSION: Parameter Manager に保存した値。

Cloud Build を使用してソースコードからビルドしたカスタム コンテナ イメージを使用して、CREMA サービスをデプロイすることもできます。

CREMA サービスをテストする

自動スケーリング サービスが正しく機能していることを確認するには、Cloud Run サービスの [ログ] タブを確認します。

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

各ログ メッセージには、それを生成したコンポーネントのラベルが付けられます。

[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 ...

次のステップ