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

本页面介绍了如何使用外部事件驱动型指标自动扩缩 Cloud Run 工作器池。Cloud Run 外部指标自动扩缩 (CREMA) 利用 基于 Kubernetes 的事件驱动型 自动扩缩 (KEDA) 来实现此功能,以根据外部事件来源 扩缩工作负载。

如需了解支持的扩缩器以及与 Cloud Run 的兼容性,请参阅 Cloud Run 外部指标自动扩缩 (CREMA) 在 Google Cloud GitHub 文档中。

关于自动扩缩器服务

如需自动扩缩工作器池,请将 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 Runners 或 Apache Kafka。如需验证您的工作负载来源是否受支持,请参阅GitHub 文档中的 Google Cloud 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. 格式的服务帐号。

创建 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. 在 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_REGIONPARAMETER_IDPARAMETER_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 ...

后续步骤