1. 简介
概览
借助 Cloud Run functions,您可以指定应该接收流量的修订版本,并指定修订版本所收到的流量百分比。借助修订版本,您可以回滚到之前的修订版本,逐步发布修订版本,以及将流量拆分到多个修订版本。
此 Codelab 介绍了如何使用修订版本来管理发送到 Cloud Run functions 函数的流量。如需详细了解修订版本,请参阅 Cloud Run 文档。
学习内容
- 如何在 Cloud Run 函数的两个或更多个修订版本之间拆分流量
- 如何逐步发布新的修订版本
- 如何回滚到先前的修订版本
2. 设置和要求
前提条件
- 您已登录 Cloud 控制台。
- 您之前已部署过 Cloud Run 函数。例如,您可以按照部署 Cloud Run 函数中的步骤开始操作。
激活 Cloud Shell
- 在 Cloud Console 中,点击激活 Cloud Shell
。

如果您是第一次启动 Cloud Shell,系统会显示一个介绍其功能的过渡页面。如果您看到了过渡页面,请点击继续。

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

这个虚拟机已加载了所需的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证。只需使用一个浏览器即可完成本 Codelab 中的大部分工作。
连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且相关项目已设置为您的项目 ID。
- 在 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`
- 在 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 中的 darkseagreen 颜色,也可以使用浏览器直接访问该端点以查看背景颜色。
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 Function。
首先,将背景颜色设置为 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
现在,假设我们想逐步发布一个背景颜色为淡紫色的新修订版本。
首先,我们将当前修订版本(米色)设置为接收 100% 的流量。这样可确保您将来部署的 Cloud Functions 函数不会接收任何流量。默认情况下,Cloud Functions 会将 100% 的流量分配给带有 latest 标志的修订版本。通过手动指定当前修订版本(米色)应接收所有流量,带有 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% 的流量发送到薰衣草版本。
gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-tags lavender=1
如需将 50% 的流量发送到薰衣草版本,您可以使用相同的命令,但指定 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 查看所有可用项目的列表。