在 Cloud Run 中使用修订版本进行流量拆分、逐步发布和回滚

1. 简介

概览

借助 Cloud Run 修订版本,您可以指定哪些修订版本应接收流量,以及要将哪个百分比的流量发送到每个修订版本。借助修订版本功能,您可以回滚到之前的修订版本、逐步发布修订版本,以及将流量拆分到多个修订版本。

此 Codelab 介绍了如何使用修订版本来管理发送到 Cloud Run 服务的流量。如需详细了解修订版,请参阅 Cloud Run 文档

学习内容

  • 如何在 Cloud Run 服务的两个或更多个修订版本之间拆分流量
  • 如何逐步发布新的修订版本
  • 如何回滚到先前的修订版本

2. 设置和要求

前提条件

  • 您已登录 Cloud Console。
  • 您之前部署过 Cloud Run 服务。例如,您可以按照部署 Cloud Run 服务中的说明开始操作。

设置环境变量

您可以设置将在此 Codelab 中全程使用的环境变量。

PROJECT_ID=YOUR-PROJECT-ID
REGION=YOUR_REGION

BG_COLOR=darkseagreen
SERVICE_NAME=traffic-revisions-color
AR_REPO=traffic-revisions-color-repo

为服务创建 Artifact Registry 仓库

gcloud artifacts repositories create $AR_REPO \
    --repository-format=docker \
    --location=$REGION \
    --description="codelab for finetuning using CR jobs" \
    --project=$PROJECT_ID

3. 流量拆分

此示例展示了如何创建一个 Cloud Run 服务,该服务会读取颜色环境变量,并使用该背景颜色响应回修订版本名称。

虽然此 Codelab 使用的是 Python,但您也可以使用任何运行时。

设置环境变量

您可以设置将在此 Codelab 中全程使用的环境变量。

REGION=<YOUR_REGION>
PROJECT_ID=<YOUR-PROJECT-ID>
BG_COLOR=darkseagreen
SERVICE_NAME=traffic-revisions-color
AR_REPO=traffic-revisions-color-repo

创建服务

首先,为源代码创建一个目录,然后通过 cd 命令进入该目录。

mkdir traffic-revisions-codelab && cd $_

然后,创建一个包含以下内容的 main.py 文件:

import os
from flask import Flask, render_template_string

app = Flask(__name__)

TEMPLATE = """
<!doctype html>
<html lang="en">
<head>
    <title>Cloud Run Traffic Revisions</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 50vh;
            background-color: {{ bg_color }}; /* Set by environment variable */
            font-family: sans-serif;
        }
        .content {
            background-color: rgba(255, 255, 255, 0.8); /* Semi-transparent white background */
            padding: 2em;
            border-radius: 8px;
            text-align: center;
            box-shadow: 0 4px 8px rgba(0,0,0,0.1);
        }
    </style>
</head>
<body>
    <div class="content">
        <p>background color: <strong>{{ color_name }}</strong></p>
    </div>
</body>
</html>
"""

@app.route('/')
def main():
    """Serves the main page with a background color from the ENV."""
    # Get the color from the 'BG_COLOR' environment variable.
    # Default to 'white' if the variable is not set.
    color = os.environ.get('BG_COLOR', 'white').lower()

    return render_template_string(TEMPLATE, bg_color=color, color_name=color)

if __name__ == '__main__':
    port = int(os.environ.get('PORT', 8080))
    app.run(debug=True, host='0.0.0.0', port=port)

接下来,创建一个包含以下内容的 requirements.txt 文件:

Flask>=2.0.0
gunicorn>=20.0.0

最后,创建一个 Dockerfile

FROM python:3.12-slim

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8080

ENV PYTHONPATH /app

CMD ["gunicorn", "--bind", "0.0.0.0:8080", "main:app"]

使用 Cloud Build 通过 Buildpack 在 Artifact Registry 中创建映像:

gcloud builds submit \
   --tag $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME

并将第一个修订版本部署到 Cloud Run,颜色为深海绿:

gcloud run deploy $SERVICE_NAME \
    --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
    --region $REGION \
    --allow-unauthenticated \
    --set-env-vars BG_COLOR=darkseagreen

如需测试该服务,您可以直接在网络浏览器中打开该端点,以查看背景颜色为深海绿。

现在,部署第二个修订版,并为其设置棕褐色背景颜色。

# update the env var
BG_COLOR=tan

gcloud run deploy $SERVICE_NAME \
    --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
    --region $REGION \
    --set-env-vars BG_COLOR=tan

现在,刷新网站后,您会看到棕色背景颜色。

按 50-50 的比例分配流量

如需在深海绿色和浅棕色修订版本之间分配流量,您需要查找底层 Cloud Run 服务的修订版本 ID。您可以通过运行以下命令来查看修订 ID:

gcloud run revisions list --service $SERVICE_NAME \
  --region $REGION --format 'value(REVISION)'

您应该会看到类似如下的结果

traffic-revisions-color-00003-qoq
traffic-revisions-color-00002-zag

您可以通过为修订版本运行以下命令,在两个修订版本之间按 50/50 的比例拆分流量:

gcloud run services update-traffic $SERVICE_NAME \
  --region $REGION \
  --to-revisions YOUR_REVISION_1=50,YOUR_REVISION_2=50

测试流量拆分

您可以通过在浏览器中刷新页面来测试该服务。

您应该会有一半的时间看到深海绿色修订版本,另一半时间看到浅棕色修订版本。您还会在输出中看到修订版本名称,例如

<html><body style="background-color:tan;"><div><p>Hello traffic-revisions-color-00003-qoq</p></div></body></html>

4. 逐步推出

在本部分中,您将学习如何逐步将更改发布到新的 Cloud 服务修订版本。如需详细了解逐步发布功能,请参阅文档

您将使用与上一部分相同的代码,但将其部署为新的 Cloud Run 服务。

首先,将背景颜色设置为 beige,然后部署名称为 gradual-rollouts-colors 的函数。

如需将 Cloud Run 函数直接部署到 Cloud Run,请运行以下命令:

# update the env var
BG_COLOR=beige

gcloud beta run deploy gradual-rollouts-colors \
      --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
      --region $REGION \
      --allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

现在,假设我们想要逐步发布背景颜色为淡紫色的新修订版本。

首先,我们将当前修订版本 beige 设置为接收 100% 的流量。这样可以确保您日后的修订版本不会获得任何流量。默认情况下,Cloud Run 会将 100% 的流量分配给带有 latest 标志的修订版本。通过手动指定当前版本 beige 应接收所有流量,具有 latest 标志的版本将不再接收 100% 的流量。请参阅文档

# get the revision name

BEIGE_REVISION=$(gcloud run revisions list --service gradual-rollouts-colors \
  --region $REGION --format 'value(REVISION)')

# now set 100% traffic to that revision

gcloud run services update-traffic gradual-rollouts-colors \
  --to-revisions=$BEIGE_REVISION=100 \
  --region $REGION

您将看到类似于 Traffic: 100% radual-rollouts-colors-00001-yox 的输出

现在,您可以部署一个不会接收任何流量的新修订版本。您可以更新此修订版本的 BG_COLOR 环境变量,而无需进行任何代码更改。

如需将 Cloud Run 函数直接部署到 Cloud Run,请运行以下命令:

# update color

BG_COLOR=lavender

# deploy the function that will not receive any traffic
gcloud beta run deploy gradual-rollouts-colors \
      --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
      --region $REGION \
      --allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

现在,当您在浏览器中访问该网站时,您会看到米色,即使薰衣草色是最近部署的修订版本也是如此。

测试流量为 0% 的修订版本

假设您已验证修订版本已成功部署,并且正在处理 0% 的流量。尽管该版本已通过健康检查,但您仍想验证此修订版是否使用了淡紫色背景颜色。

如需测试 lavender 修订版,您可以向该修订版应用代码。通过添加标记,您可以直接在特定网址测试新修订版本,而无需处理流量。

首先,获取该最新修订版本(即 lavender)的图片网址。

IMAGE_URL_LAVENDER=$(gcloud run services describe gradual-rollouts-colors --region $REGION --format 'value(IMAGE)')

现在,为该图片添加与其关联的颜色标签。

gcloud run deploy gradual-rollouts-colors --image $IMAGE_URL_LAVENDER --no-traffic --tag $BG_COLOR --region $REGION

您将会看到类似于以下内容的输出:

The revision can be reached directly at https://lavender---gradual-rollouts-colors-<hash>-<region>.a.run.app

现在,当您访问该特定修订版本网址时,您会看到淡紫色。

逐步增加流量

现在,您可以开始向 lavender 修订版发送流量了。以下示例展示了如何将 1% 的流量发送到 lavender。

gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-tags lavender=1

如需将 50% 的流量发送到 lavender,您可以使用相同的命令,但改为指定 50%。

gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-tags lavender=50

您应该会看到一个列表,其中显示了每个修订版本收到的流量。

Traffic:
  50% gradual-rollouts-colors-00001-hos
  50% gradual-rollouts-colors-00004-mum
        lavender: https://lavender---gradual-rollouts-colors-<hash>-<region>.a.run.app

当您准备好全面推出淡紫色时,可以将淡紫色设置为 100%,以替换米色。

gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-tags lavender=100

现在,当您访问该网站时,您将只看到薰衣草。

5. 回滚

假设您收到了早期用户体验反馈,其中指出客户更喜欢米色而非淡紫色,因此您需要回滚到米色。

您可以通过运行以下命令回滚到上一个修订版(米色):

gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-revisions $BEIGE_REVISION=100

现在,当您访问该网站时,您会看到米色背景。

如需详细了解回滚,请参阅文档

6. 恭喜!

恭喜您完成此 Codelab!

建议您查看有关发布、回滚和流量迁移的文档

所学内容

  • 如何在 Cloud Run 服务的两个或更多个修订版本之间拆分流量
  • 如何逐步发布新的修订版本
  • 如何回滚到先前的修订版本

7. 清理

为避免意外产生费用(例如,如果此 Cloud Run 函数意外被调用次数超过了免费层级的 Cloud Run 调用次数配额),您可以删除 Cloud Run 服务,也可以删除您在第 2 步中创建的项目。

如需删除 Cloud Run 服务,请前往 Cloud 控制台中的 Cloud Run(网址为 https://console.cloud.google.com/run/),然后删除您在此 Codelab 中创建的函数。

如果您选择删除整个项目,可以前往 https://console.cloud.google.com/cloud-resource-manager,选择您在第 2 步中创建的项目,然后选择“删除”。如果您删除该项目,则需要在 Cloud SDK 中更改项目。您可以通过运行 gcloud projects list 来查看所有可用项目的列表。