使用 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. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Run, Cloud Scheduler, Cloud Workstations APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Cloud Run, Cloud Scheduler, Cloud Workstations APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

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

    此命令会安排一个作业,在周一至周五上午 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 状态表示 成功运行您的作业。

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

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

    前往“工作站配置”

  2. 验证快速入门池大小为 2。

  3. 查看 Cloud Run 服务的日志

清理

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

移除测试项目

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

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

删除 Cloud Scheduler 作业

如需删除个别 Cloud Scheduler 资源,请执行以下操作:

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

    转到 Cloud Scheduler

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

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

后续步骤

  • 探索有关 Google Cloud 的参考架构、图表和最佳做法。查看我们的 Cloud 架构中心