1. 简介
概览
借助 Cloud Run functions,您可以指定应该接收流量的修订版本,并指定修订版本所收到的流量百分比。借助修订版本,您可以回滚到之前的修订版本、逐步发布修订版本,以及将流量拆分到多个修订版本。
此 Codelab 将介绍如何使用修订版本来管理发送到 Cloud Run 函数的流量。如需详细了解修订版,请参阅 Cloud Run 文档。
学习内容
- 如何在 Cloud Run 函数的两个或更多个修订版本之间拆分流量
- 如何逐步发布新的修订版本
- 如何回滚到先前的修订版本
2. 设置和要求
前提条件
- 您已登录 Cloud Console。
- 您之前部署过 Cloud Run 函数。例如,您可以按照部署 Cloud Run 函数中的说明开始使用。
激活 Cloud Shell
- 在 Cloud Console 中,点击激活 Cloud Shell。
如果这是您首次启动 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 中的深海绿色,也可以使用浏览器直接访问端点,以查看背景颜色。
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
来查看所有可用项目的列表。