使用 Cloud Scheduler 和 Cloud Run 安排工作站操作


本教程介绍如何使用 Cloud Scheduler 和 Cloud Run 自动执行

  • 安排快速启动池大小自动增加和减少。
  • 定期自动启动工作站。

本教程可帮助您增加和减少快速启动池大小,以与正常营业时间保持一致。

目标

  1. 编写和部署 Cloud Run 服务,该服务会更新工作站配置的快速入门池大小
  2. 配置一个 Cloud Scheduler 作业,将第 1 步中创建的服务安排在周一至周五的 09:00-17:00 运行,以与太平洋标准时间 (PST) 保持一致。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

  • Cloud Scheduler
  • Cloud Run

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 Cloud Run, Cloud Scheduler, Cloud Workstations API。

    启用 API

  5. 安装 Google Cloud CLI。
  6. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  7. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  8. 确保您的 Google Cloud 项目已启用结算功能

  9. 启用 Cloud Run, Cloud Scheduler, Cloud Workstations API。

    启用 API

  10. 安装 Google Cloud CLI。
  11. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init

准备环境

设置以下环境变量,以供稍后创建的自动化脚本使用。

  1. 设置您打算使用的 PROJECT_IDREGION 变量:

    PROJECT_ID=$PROJECT_ID
    REGION=$REGION
    

    $REGION 替换为您计划使用的区域名称,例如 us-central1

    如需详细了解可用区域,请参阅 Cloud Workstations 位置

应用架构

此解决方案包含以下 Google Cloud 组件:

  • Cloud Run,用于更新 WorkstationConfig快速启动池大小
  • Cloud Scheduler 作业:根据设置的时间表进行调用以更新 WorkstationConfig

显示使用 Cloud Scheduler 和 Cloud Run 安排工作站操作的系统架构图

创建 Cloud Run 服务

第一步是设置一个简单的 Web 服务器,以监听您在端口 8080 上收到的 HTTP 请求。由于该应用已容器化,因此您可以使用任何语言编写服务器。

若要使用 Python 编写 Web 服务器监听器应用,请执行以下操作:

  1. 创建名为 workstation-config-updater 的新目录,并转到此目录中:

    mkdir workstation-config-updater
    cd workstation-config-updater
    
  2. 创建名为 app.py 的文件,并将以下代码粘贴到其中:

    import os, subprocess
    from flask import Flask, request, abort
    
    app = Flask(__name__)
    
    @app.route("/", methods=["POST"])
    def update():
        app.logger.info("Update request received.")
        data = request.json
        cluster = data["cluster"]
        region = data["region"]
        pool_size = data["pool-size"]
    
        path = os.path.join(app.root_path, "update_config.sh")
        o = subprocess.run(
            [path, cluster, region, pool_size],
            stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True
        )
        app.logger.info("Sending response:", o.stdout)
        return o.stdout
    
    if __name__ == "__main__":
        app.run(host="0.0.0.0", port=8080, debug=True)
    

    此代码会创建一个基本 Web 服务器,该服务器监听由 PORT 环境变量定义的端口,并执行脚本 update_config.sh

  3. 创建名为 update_config.sh 的文件,并将以下代码粘贴到其中:

    #!/bin/bash
    
    set -e
    
    if [ $# -ne 3 ]
    then
       echo "Usage: update_config.sh CLUSTER REGION POOL_SIZE"
       exit 1
    fi
    
    CLUSTER=$1
    REGION=$2
    POOL_SIZE=$3
    
    # list workstation configs
    echo "Attempting to list workstation configs in cluster $CLUSTER and region $REGION ..."
    for CONFIG in $(gcloud  workstations configs list --cluster $CLUSTER --region $REGION --format="value(NAME)"); do
        echo "Attempting to update Quick Pool Size to $POOL_SIZE for config $CONFIG ..."
        # update the workstation config pool-size
        RET=$(gcloud workstations configs update $CONFIG --cluster $CLUSTER  --region $REGION --pool-size=$POOL_SIZE)
        if [[ $RET -eq 0 ]]; then
            echo "Workstation config $CONFIG updated."
        else
            echo "Workstation config $CONFIG update failed."
        fi
    done
    
    

    此脚本使用 gcloud 命令列出给定集群中的所有 WorkstationConfig,并将其快速启动池大小更新为 POOL_SIZE

  4. 创建名为 Dockerfile 的文件,并将以下代码粘贴到其中:

    FROM google/cloud-sdk
    
    RUN apt-get update && apt-get install -y python3-pip python3
    
    # Copy local code to the container image.
    ENV APP_HOME /app
    WORKDIR $APP_HOME
    COPY . ./
    
    RUN /bin/bash -c 'ls -la; chmod +x ./update_config.sh'
    
    # Install production dependencies.
    RUN pip3 install Flask gunicorn
    
    # Run the web service on container startup
    CMD exec gunicorn --bind :8080 --workers 1 --threads 8 app:app
    

    此代码将应用容器化,使其准备好在 Cloud Run 上部署。

部署到 Cloud Run

如需部署到 Cloud Run,请运行以下命令:

gcloud run deploy --source . --project $PROJECT_ID --region $REGION
  1. 当系统提示您输入服务名称时,请按 Enter 接受默认名称 workstation-config-updater

  2. 如果系统提示您启用 Artifact Registry API 或允许创建 Artifact Registry 代码库,请按 y 键。

  3. 当系统提示您允许未通过身份验证的调用时,请按 n

  4. 等待部署完成。

  5. 当服务网址按以下格式显示时,请复制该网址:

SERVICE_URL=$SERVICE_URL

配置服务帐号以调用 Cloud Run

您部署的 station-config-updater 服务不允许未经身份验证的调用。

Cloud Scheduler 需要具有适当凭据的服务帐号才能调用 station-config-updater 服务。

设置服务账号

  1. 如果您还没有要用于 Cloud Scheduler 作业的服务帐号,请创建一个新服务帐号

    gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME \
        --description="$DESCRIPTION" \
        --display-name="$DISPLAY_NAME"
    
  2. 添加必要的 IAM 角色绑定,以允许您的服务帐号调用 Cloud Run。

    gcloud run services add-iam-policy-binding workstation-config-updater \
        --member=serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com \
        --region $REGION \
        --role=roles/run.invoker
    

创建使用身份验证的 Cloud Scheduler 配置

  1. 创建一个作业,并指定您从部署到 Cloud Run 中复制的 URL

    gcloud scheduler jobs create http workstation-pool-increaser-cron \
        --http-method=POST \
        --location=us-central1 \
        --schedule="0 9 * * 1-5" \
        --time-zone="America/Los_Angeles" \
        --headers "Content-Type=application/json" \
        --message-body='{"cluster":"$CLUSTER", "region":"$REGION", "pool-size": "2"}' \
        --uri=$SERVICE_URL \
        --oidc-service-account-email=$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
    

    此命令会安排一项作业,在周一至周五上午 9 点(太平洋标准时间)将 WorkstationCluster $CLUSTER 中所有 WorkstationConfigs快速启动池大小增加到上午 2 点。

    有关更多信息,请参阅配置作业时间表

  2. 同样,如需在工作日结束时将工作站配置的池大小减少到 0,请运行以下命令

    gcloud scheduler jobs create http workstation-pool-decreaser-cron \
        --http-method=POST \
        --location=$REGION \
        --schedule="0 17 * * 1-5" \
        --time-zone="America/Los_Angeles" \
        --headers "Content-Type=application/json" \
        --message-body='{"cluster":"$CLUSTER", "region":"$REGION", "pool-size": "0"}' \
        --uri=$SERVICE_URL \
        --oidc-service-account-email=$SERVICE-ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
    

可选:验证作业

为了确保您的作业按预期运行,您可以验证作业。

  1. 前往 Google Cloud 控制台中的 Cloud Scheduler 页面。

    转到 Cloud Scheduler

    workstation-pool-increaser-cron 应显示在作业列表中。

  2. workstation-pool-increaser-cron 作业对应的行中,点击 操作 > 强制运行作业

    在项目中创建的第一个作业可能需要几分钟才能运行。

  3. 上次执行状态列中,Success 状态表示您已成功运行作业。

如需验证工作站配置是否已更新,请执行以下操作:

  1. 前往 Google Cloud 控制台中的工作站配置页面。

    前往“工作站配置”

  2. 确认快速入门池大小为 2。

  3. 查看 Cloud Run 服务的日志

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

移除测试项目

虽然 Cloud Run 不会对未在使用中的服务计费,但您可能仍然需要支付将容器映像存储在 Artifact Registry 中而产生的相关费用。为避免产生费用,您可以删除容器映像或删除 Google Cloud 项目。删除 Google Cloud 项目后,系统会停止对该项目中使用的所有资源计费。

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除 Cloud Scheduler 作业

如需删除单个 Cloud Scheduler 资源,

  1. 在 Google Cloud 控制台中,转到 Cloud Scheduler 页面。

    转到 Cloud Scheduler

  2. 点击作业旁边的复选框。

  3. 点击页面顶部的删除按钮并确认删除操作。

后续步骤