使用外部指标自动扩缩工作器池

本页面介绍了如何使用外部事件驱动型指标自动扩缩 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 API、Cloud Build API、Cloud Run Admin API、Secret Manager API 和 Parameter Manager API:

    gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        run.googleapis.com \
        secretmanager.googleapis.com \
        parametermanager.googleapis.com
    
  3. 配置事件驱动型或基于请求的工作负载,例如 GitHub Runner 或 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:确定 CREMA 如何对外部服务进行身份验证,例如使用存储在 Secret Manager 中的令牌。

  • scaledObjects:定义 Cloud Run 工作器池与外部指标资源之间的映射。此形参包括:

    • scaleTargetRef:要扩缩的 Cloud Run 服务或工作器池。

    • triggers:用于伸缩的具体外部指标。如果您的外部指标源需要身份验证,请设置 authenticationRef 字段以指定凭据的 TriggerAuthentications 对象之一。

  • pollingInterval:控制 CREMA 刷新其指标的间隔时间(以秒为单位)。如果您省略此参数,CREMA 不会自动轮询,您必须使用向服务发送 POST 请求的方式手动触发伸缩检查。

如需详细了解如何定义基本和高级配置指标,请参阅 Google Cloud GitHub 文档中的配置参考

如需查看兼容的扩缩器的完整配置定义列表,请参阅 KEDA 文档中的扩缩器

在 Parameter Manager 中存储 CREMA 配置

如需为 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"
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目的 ID。

    • CREMA_SERVICE_ACCOUNT_NAMECREMA 服务账号的名称。

  2. 向您的 CREMA 服务账号授予工作器池的 roles/run.developer 角色。这样一来,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"

替换以下内容:

  • SERVICE_NAME:自动扩缩器服务的名称。

  • SERVICE_REGION:服务所在的区域。

  • CREMA_SERVICE_ACCOUNT_NAMECREMA 服务账号的名称。

  • PROJECT_ID:您的 Google Cloud 项目的 ID。

  • PARAMETER_REGIONPARAMETER_IDPARAMETER_VERSION:您在参数管理器中存储的值。

您还可以使用 通过 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 ...

后续步骤