本页面介绍了如何使用外部事件驱动型指标自动扩缩 Cloud Run 工作器池。Cloud Run 外部指标自动扩缩 (CREMA) 通过利用基于 Kubernetes 的事件驱动型自动扩缩 (KEDA) 来根据外部事件源扩缩工作负载,从而实现此功能。
如需了解支持的调节器以及与 Cloud Run 的兼容性,请参阅 Google Cloud GitHub 文档中的 Cloud Run 外部指标自动扩缩 (CREMA)。
自动扩缩器服务简介
如需自动扩缩工作器池,请将 CREMA 自动扩缩器服务部署到 Cloud Run。此服务执行以下操作:
轮询外部事件源,例如 Apache Kafka 主题或 GitHub Runner Scaler。
根据您的 YAML 配置计算所需的实例数量。
自动更新工作器池的实例数量。
准备工作
确保您已按照设置页面中的说明为 Cloud Run 设置了新项目。
启用 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配置事件驱动型或基于请求的工作负载,例如 GitHub Runner 或 Apache Kafka。如需验证您的工作负载来源是否受支持,请参阅 Google Cloud GitHub 文档中的 CREMA 兼容性列表。
查看价格计算器以估算费用。您需要根据触发伸缩的频率为 Cloud Run 伸缩服务付费。
所需的角色
如需获得自动扩缩工作器池所需的权限,请让管理员向您授予项目的以下 IAM 角色:
-
Artifact Registry Repository Administrator (
roles/artifactregistry.repoAdmin) -
Cloud Build Editor (
roles/cloudbuild.builds.editor) -
Cloud Run Admin (
roles/run.admin) -
Create Service Accounts (
roles/iam.serviceAccountCreator) -
Secret Manager Admin (
roles/secretmanager.admin) -
Service Account User (
roles/iam.serviceAccountUser) -
Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer) -
Storage Admin (
roles/storage.admin) -
Parameter Manager Admin (
roles/parametermanager.admin)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
创建自定义服务账号
创建具有所需最低权限的自定义服务账号,以便使用工作负载所需的预配资源。如需设置服务账号,请执行以下操作:
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 自动扩缩器服务存储参数版本,请按以下步骤操作:
在参数管理器中创建参数:
gcloud parametermanager parameters create PARAMETER_ID --location=global --parameter-format=YAML将 PARAMETER_ID 替换为您的参数名称。
将本地 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 配置文件的路径。
- PARAMETER_VERSION:您要分配给参数版本的 ID,例如
如需了解详情,请参阅创建形参。
向您的 CREMA 服务账号授予其他权限
如需扩缩 YAML 配置中指定的工作器池,请向自定义服务账号授予以下权限:
向您的 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 服务账号的名称。
向您的 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:工作器池的区域。
向您的 CREMA 服务账号授予写入指标的权限:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:CREMA_SERVICE_ACCOUNT_NAME" \ --role="roles/monitoring.metricWriter"向您的 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_NAME:CREMA 服务账号的名称。
PROJECT_ID:您的 Google Cloud 项目的 ID。
PARAMETER_REGION、PARAMETER_ID 和 PARAMETER_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 ...