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

本教程介绍了如何使用 Cloud Scheduler 和 Cloud Run 自动执行以下操作:

  • 安排自动增加和减少快速启动池大小
  • 按常规时间表自动启动工作站。

本教程可帮助您根据典型营业时间增加和减少快速启动池大小

准备环境

设置以下环境变量,这些变量将由您稍后创建的自动化脚本使用。

  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

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

Cloud Scheduler 需要一个具有适当凭据的服务账号才能调用 workstation-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

    此命令会安排一项作业,以将 WorkstationCluster $CLUSTER 中所有 WorkstationConfigs快速启动池大小从周一到周五每天上午 9 点(太平洋标准时间)增加到 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 服务的日志