在 Cloud Run 函数中使用修订版本来实现流量拆分、逐步发布和回滚

1. 简介

概览

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

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

学习内容

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

2. 设置和要求

前提条件

  • 您已登录 Cloud Console。
  • 您之前部署过 Cloud Run 函数。例如,您可以按照部署 Cloud Run 函数中的说明开始使用。

激活 Cloud Shell

  1. 在 Cloud Console 中,点击激活 Cloud Shelld1264ca30785e435.png

cb81e7c8e34bc8d.png

如果这是您首次启动 Cloud Shell,系统会显示一个中间屏幕,介绍 Cloud Shell 是什么。如果系统显示中间屏幕,请点击继续

d95252b003979716.png

预配和连接到 Cloud Shell 只需花几分钟时间。

7833d5e1c5d18f54.png

此虚拟机已加载所需的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证。您在此 Codelab 中的大部分(甚至全部)工作都可以使用浏览器完成。

在连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且相关项目已设置为您的项目 ID。

  1. 在 Cloud Shell 中运行以下命令以确认您已通过身份验证:
gcloud auth list

命令输出

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. 在 Cloud Shell 中运行以下命令,以确认 gcloud 命令了解您的项目:
gcloud config list project

命令输出

[core]
project = <PROJECT_ID>

如果不是上述结果,您可以使用以下命令进行设置:

gcloud config set project <PROJECT_ID>

命令输出

Updated property [core/project].

3. 流量拆分

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

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

设置环境变量

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

REGION=<YOUR_REGION>
PROJECT_ID=<YOUR-PROJECT-ID>
BG_COLOR=darkseagreen

创建函数

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

mkdir revisions-gcf-codelab && cd $_

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

{
    "dependencies": {
        "@google-cloud/functions-framework": "^3.0.0"
    }
}

接下来,创建一个包含以下内容的 index.js 源文件:

const functions = require('@google-cloud/functions-framework');

const BG_COLOR = process.env.BG_COLOR;
const K_REVISION = process.env.K_REVISION;

functions.http('helloWorld', (req, res) => {
    res.writeHead(200, { 'Content-Type': 'text/html' });
    res.end('<html><body style="background-color:' + BG_COLOR + ';"' + '><div><p>' + 'Hello from ' + K_REVISION + ' using color ' + BG_COLOR + '</p></div></body>' + '</html>');
});

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

gcloud beta run deploy traffic-splitting-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --set-env-vars BG_COLOR=$BG_COLOR

如果您想以 Cloud Functions (第 2 代) 的形式进行部署,请使用以下命令:

gcloud functions deploy traffic-splitting-gcf \
  --gen2 \
  --runtime=nodejs20 \
  --region=$REGION \
  --source=. \
  --entry-point=helloWorld \
  --trigger-http \
  --no-allow-unauthenticated \
  --set-env-vars BG_COLOR=$BG_COLOR

如需测试该函数,您可以使用 curl 命令调用现有端点,以查看 HTML 中的深海绿色,也可以使用浏览器直接访问端点,以查看背景颜色。

SERVICE_URL=$(gcloud run services describe traffic-splitting-gcf --platform managed --region $REGION --format 'value(status.url)')

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

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

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

# update the env var
BG_COLOR=tan

gcloud beta run deploy traffic-splitting-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

如果您想以 Cloud Functions (第 2 代) 的形式进行部署,请使用以下命令:

# update the env var
BG_COLOR=tan

gcloud functions deploy traffic-splitting-gcf \
  --gen2 \
  --runtime nodejs20 \
  --entry-point helloHttp \
  --source . \
  --region $REGION \
  --trigger-http \
  --no-allow-unauthenticated \
  --update-env-vars BG_COLOR=$BG_COLOR

现在,当您 curl 该端点时,您会看到棕色背景颜色。

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

按 50-50 的比例分配流量

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

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

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

traffic-splitting-gcf-00003-qoq
traffic-splitting-gcf-00002-zag

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

gcloud run services update-traffic traffic-splitting-gcf \
  --region $REGION \
  --to-revisions <REVISION1>=50,<REVISION2>=50

测试流量拆分

您可以通过访问函数的公开网址(通过 curl 或直接在浏览器中)来测试该函数。

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" $SERVICE_URL

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

<html><body style="background-color:tan;"><div><p>Hello traffic-splitting-gcf-00006-qoq</p></div></body></html>

4. 逐步推出

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

您将使用与上一部分相同的代码,但将其作为新的 Cloud Functions 函数进行部署。

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

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

# update the env var
BG_COLOR=beige

gcloud beta run deploy gradual-rollouts-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

如果您想以 Cloud Functions (第 2 代) 的形式进行部署,请使用以下命令:

# update the env var
BG_COLOR=beige

# deploy the function
gcloud functions deploy gradual-rollouts-gcf \
  --gen2 \
  --runtime nodejs20 \
  --entry-point helloHttp \
  --source . \
  --region $REGION \
  --trigger-http \
  --no-allow-unauthenticated \
  --update-env-vars BG_COLOR=$BG_COLOR

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

首先,我们将当前修订版本 beige 设置为接收 100% 的流量。这样可确保您日后部署的 Cloud Functions 函数不会收到任何流量。默认情况下,Cloud Functions 会将 100% 的流量设置为使用 latest 标志的修订版本。通过手动指定当前版本 beige 应接收所有流量,具有 latest 标志的版本将不再接收 100% 的流量。请参阅文档

# get the revision name

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

# now set 100% traffic to that revision

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

您将看到类似于 Traffic: 100% gradual-rollouts-gcf2-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-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

如果您想以 Cloud Functions (第 2 代) 的形式进行部署,请使用以下命令:

# update color

BG_COLOR=lavender

# deploy the function that will not receive any traffic
gcloud functions deploy gradual-rollouts-gcf \
  --gen2 \
  --runtime nodejs20 \
  --entry-point helloHttp \
  --source . \
  --region $REGION \
  --trigger-http \
  --no-allow-unauthenticated \
  --update-env-vars BG_COLOR=$BG_COLOR \
  --tag $BG_COLOR

现在,更新 SERVICE_网址 环境变量以使用 gradual-rollouts-gcf 函数

SERVICE_URL=$(gcloud run services describe gradual-rollouts-gcf --platform managed --region $REGION --format 'value(status.url)')

现在,当您 curl 该服务时

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

您会看到米色,即使薰衣草色是最近部署的修订版本也是如此。

<html><body style="background-color:beige;"><div><p>Hello from gradual-rollouts-gcf-24jan16-staging-2-00001-kop using color beige</p></div></body></html>

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

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

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

首先,获取该修订版本的图片网址。

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

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

gcloud run deploy gradual-rollouts-gcf --image $IMAGE_URL --no-traffic --tag $BG_COLOR --region $REGION --no-allow-unauthenticated

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

The revision can be reached directly at https://lavender---gradual-rollouts-gcf-k6msmyp47q-lz.a.run.app

现在,您可以直接 curl 此修订版

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET <DIRECT_REVISION_URL>

并在结果中看到淡紫色:

<html><body style="background-color:lavender;"><div><p>Hello from gradual-rollouts-gcf-24jan16-00003-xik using color lavender</p></div></body></html>

逐步增加流量

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

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

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

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

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

Traffic:
  50% gradual-rollouts-gcf-00001-hos
  50% gradual-rollouts-gcf-00004-mum
        lavender: https://lavender---gradual-rollouts-gcf-k6msmyp47q-uc.a.run.app

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

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

现在,当您访问或 curl 函数服务网址 gradual-rollouts-gcf 时,

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

您只会看到淡紫色。

<html><body style="background-color:lavender;"><div><p>Hello gradual-rollouts-gcf-00004-mum</p></div></body></html>

5. 回滚

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

您可以通过运行此命令回滚到先前的修订版(米色)。

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

现在,当您 curl 或访问函数网址端点时,

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

您会看到系统返回“米色”。

<html><body style="background-color:beige;"><div><p>Hello gradual-rollouts-gcf-00001-hos</p></div></body></html>

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

6. 恭喜!

恭喜您完成此 Codelab!

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

所学内容

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

7. 清理

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

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

如需删除作为第 2 代函数部署的 Cloud Run 函数,请前往 Cloud 控制台中的 Cloud Functions(网址为 https://console.cloud.google.com/functions/),然后删除您在此 Codelab 中创建的函数。

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