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

このページでは、外部イベント ドリブン指標を使用して Cloud Run ワーカープールを自動スケーリングする方法について説明します。Cloud Run External Metrics Autoscaling(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 Runners や 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 Runner 指標を使用して 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: Secret Manager に保存されているトークンを使用するなど、CREMA が外部サービスを認証する方法を決定します。

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

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

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

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

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

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

CREMA 構成を Parameter Manager に保存する

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

  1. パラメータ マネージャーでパラメータを作成します。

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

    WORKER_POOL_NAME=WORKER_POOL_NAME
    WORKER_POOL_REGION=WORKER_POOL_REGION
    gcloud beta 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 beta 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"

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

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

次のステップ