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
来查看所有可用项目的列表。