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

本页面介绍了如何使用外部事件驱动型指标自动扩缩 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 运行程序或 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"
    

    替换以下内容:

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

    • CREMA_SERVICE_ACCOUNT_NAME:CREMA 服务账号的名称。

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

后续步骤