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

1. 简介

概览

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

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

学习内容

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

2. 设置和要求

前提条件

  • 您已登录 Cloud 控制台。
  • 您之前已部署过 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

为服务创建制品注册库

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,颜色为 darkseagreen:

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 Service 修订版本。如需详细了解逐步推出,请参阅相关文档

您将使用与上一部分相同的代码,但会将其部署为新的 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

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

首先,我们将当前修订版本(米色)设置为接收 100% 的流量。这样可确保您的未来修订版本不会获得任何流量。默认情况下,Cloud Run 会将 100% 的流量分配给带有 latest 标志的修订版本。通过手动指定当前修订版本(米色)应接收所有流量,带有 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 修订版本,您可以向该修订版本应用标记。通过标记,您可以直接测试特定网址处的新修订版本,而无需处理流量。

首先,获取相应最新修订版本(即淡紫色)的图片网址。

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% 的流量发送到薰衣草版本。

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

如需将 50% 的流量发送到薰衣草版本,您可以使用相同的命令,但指定 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 查看所有可用项目的列表。