使用 Cloud Run 部署网站

1. 准备工作

由于创建和管理虚拟机 (VM) 实例、集群、Pod、服务等产生的所有开销,网站运行起来可能会很困难。这对较大的多层应用来说没什么问题,但如果您只努力部署和显示网站,那就要耗费大量开销。

借助 Cloud Run(Knative 的 Google Cloud 实现方案),您可以管理和部署您的网站,而不会产生基于虚拟机或 Kubernetes 的部署所需的任何开销。这不仅在管理角度是更简单的方法,而且还使您能够在没有请求到达您的网站时实现缩减至零。

Cloud Run 不仅为容器引入无服务器开发,而且可以在您自己的 Google Kubernetes Engine (GKE) 集群上运行,也可以在 Cloud Run 提供的全代管式平台即服务 (PaaS) 解决方案上运行。您将在此 Codelab 中测试后一种场景。

下图说明了部署和 Cloud Run 托管的流程。首先创建一个通过 Cloud Build 创建的 Docker 映像,您将在 Cloud Shell 中触发该映像。然后,在 Cloud Shell 中使用命令将该映像部署到 Cloud Run。

db5f05c090d5ebcb.png

前提条件

学习内容

  • 如何使用 Cloud Build 构建 Docker 映像并将其上传到 gcr.io
  • 如何将 Docker 映像部署到 Cloud Run
  • 如何管理 Cloud Run 部署
  • 如何在 Cloud Run 上为应用设置端点

构建内容

  • 在 Docker 容器内运行的静态网站
  • 位于 Container Registry 中的此容器的版本
  • 为静态网站部署 Cloud Run

所需条件

  • 拥有创建项目管理员权限的 Google 账号或具有 Project-Owner 角色的项目

2. 环境设置

自定进度的环境设置

如果您还没有 Google 账号,则必须创建一个。然后,登录 Google Cloud 控制台并点击项目 >创建项目

53dad2cefdae71da.png

faab21976aabeb4c.png

记住项目 ID,该 ID 会自动填充到项目名称下。项目 ID 是所有 Google Cloud 项目中的唯一名称,因此屏幕截图中的名称已被占用,您无法使用。在下文中,我们会用 PROJECT_ID 来指代它。

接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Google Cloud 资源并启用 Cloud Run API。

启用 Cloud Run API

点击导航菜单 ☰ >API 和服务 >信息中心 >启用 API 和服务。.

5dbb2e6e27a55fcf.png

搜索“Cloud Run API”然后点击 Cloud Run API >启用

f1fd486174a744cf.png

运行此 Codelab 应该不会花费超过几美元,但如果您决定使用更多资源或让它们继续运行,费用可能更高(请参阅最后的清理部分)。如需了解详情,请参阅价格

Google Cloud 的新用户有资格获享$300 免费试用

Cloud Shell

虽然可以通过笔记本电脑远程操作 Google Cloud 和 Cloud Run,但您需要使用 Cloud Shell,这是一个在 Google Cloud 中运行的命令行环境。该环境预先配置了您需要的所有客户端库和框架。

基于 Debian 的这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证。这意味着在本 Codelab 中,您只需要一个浏览器(没错,它适用于 Chromebook)。

  1. 如需从 Cloud Console 激活 Cloud Shell,只需点击激活 Cloud ShellfEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q(预配和连接到环境仅需花费一些时间)。

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 2017-06-14 at 10.13.43 PM.png

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

gcloud auth list

命令输出

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

命令输出

[core]
project = <PROJECT_ID>

如果出于某种原因未设置项目,只需发出以下命令即可:

gcloud config set project <PROJECT_ID>

正在查找您的 PROJECT_ID?检查您在设置步骤中使用的 ID,或在 Cloud Console 信息中心查找该 ID:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

默认情况下,Cloud Shell 还会设置一些环境变量,这对您日后运行命令可能会很有用。

echo $GOOGLE_CLOUD_PROJECT

命令输出

<PROJECT_ID>
  1. 最后,设置默认可用区和项目配置。
gcloud config set compute/zone us-central1-f

您可以选择各种不同的可用区。如需了解详情,请参阅区域和可用区

3. 克隆源代码库

鉴于您要部署一个现有网站,您只需从代码库克隆源代码,即可专注于创建 Docker 映像并部署到 Cloud Run。

运行以下命令,将代码库克隆到 Cloud Shell 实例并切换到相应目录。您还将安装 Node.js 依赖项,以便在部署前测试应用。

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

这会克隆您的代码库,对目录进行更改,并安装在本地运行应用所需的依赖项。脚本可能需要几分钟时间才能运行完毕。

请进行尽职调查并测试您的应用。运行以下命令以启动 Web 服务器:

cd ~/monolith-to-microservices/monolith
npm start

输出:

Monolith listening on port 8080!

您可以点击网页预览acc630712255c604.png,然后选择在端口 8080 上预览来预览应用。

5869738f0e9ec386

此操作会打开一个新窗口,您可以在其中查看 Fancy 商店的实际展示情况!

9ed25c3f0cbe62fa.png

查看网站后,您可以关闭此窗口。如需停止 Web 服务器进程,请在终端窗口中按 CONTROL+C(在 Macintosh 上按 Command+C)。

4. 使用 Cloud Build 创建 Docker 容器

现在,您的源文件已准备就绪,是时候对应用进行 Docker 化了!

通常,您必须采取两个步骤,包括构建 Docker 容器并将其推送到注册表以存储映像供 GKE 拉取。但是,您可以使用 Cloud Build 构建 Docker 容器,并将映像放入 Container Registry,只需一个命令,即可让工作更轻松!如需查看手动创建 Dockerfile 并推送它的过程,请参阅 Container Registry 快速入门

Cloud Build 会压缩目录中的文件,并将其移至 Cloud Storage 存储分区。然后,构建流程会从存储分区中获取所有文件并使用 Dockerfile,Dockerfile 存在于运行 Docker 构建流程的同一目录中。如果您为 Docker 映像指定了 --tag 标志,并将主机设置为 gcr.io,则生成的 Docker 映像将被推送到 Container Registry。

首先,您需要确保已启用 Cloud Build API。运行以下命令可将其启用:

gcloud services enable cloudbuild.googleapis.com

启用 API 后,在 Cloud Shell 中运行以下命令以启动构建流程:

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 .

此过程需要几分钟的时间,但完成后,终端中会显示类似于以下内容的输出:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                  IMAGES                              STATUS
1ae295d9-63cb-482c-959b-bc52e9644d53  2019-08-29T01:56:35+00:00  33S       gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz  gcr.io/<PROJECT_ID>/monolith:1.0.0  SUCCESS

如需查看构建记录或实时观察构建过程,您可以转到 Cloud 控制台,然后点击导航菜单 ☰ >Cloud Build >历史记录。您可以在其中看到自己之前所有 build 的列表,但其中应该只有您创建的 build。

4c753ede203255f6

如果您点击 Build id,可以查看该构建的所有详细信息,包括日志输出。您可以点击映像旁边的链接来查看创建的容器映像。

6e88ed1643dfe629

5. 将容器部署到 Cloud Run

现在,您已将网站容器化并推送到了 Container Registry,是时候部署到 Cloud Run 了!

您可以通过以下两种方法部署到 Cloud Run:

  • Cloud Run(全代管式)是一种 PaaS 模型,在这种模式下管理整个容器生命周期。在此 Codelab 中,您将使用该方法。
  • Cloud Run for Anthos 是 Cloud Run,具有额外的控制层,可让您从 GKE 迁移集群和 Pod。如需了解详情,请参阅设置 Cloud Run for Anthos on Google Cloud

Cloud Shell 中的命令行示例将使用您之前设置的环境变量。

命令行

运行以下命令来部署您的应用:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed 

系统会要求您指定要在哪个区域运行。选择离您最近的区域,然后接受默认的建议服务名称(单体式应用)。

d52d9419c5166674.png

出于测试目的,允许向应用发送未经身份验证的请求。在提示符处输入 y

3a57b32f133dad61

验证部署

如需验证 Deployment 是否已成功创建,请运行以下命令。Pod status 可能需要一些时间才能变为 Running

gcloud run services list

选择 [1] Cloud Run(全代管式)

输出:

SERVICE   REGION    URL  LAST DEPLOYED BY          LAST DEPLOYED AT
✔  monolith  us-east1 <your url>  <your email>  2019-09-16T21:07:38.267Z

输出会显示以下内容。您可以看到您的部署、部署部署的用户(您的电子邮件地址)以及可用于访问应用的网址。看起来所有内容都已成功创建!

在网络浏览器中打开服务列表中提供的网址,您应该会看到与本地预览的同一个网站。

6. 创建具有较低并发数的新修订版本

现在,再次部署应用,但这次要调整其中一个参数。

默认情况下,Cloud Run 应用的并发值为 80,这意味着每个容器实例一次最多可处理 80 个请求。这与函数即服务 (FaaS) 模式大不相同,即一个实例一次处理一个请求。

使用并发值为 1 重新部署同一容器映像(仅用于测试目的),看看会发生什么。

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 1

按照第一次的操作,回答后面的问题。命令成功后,检查 Cloud 控制台以查看结果。

在 Cloud Run 信息中心内,点击单体式应用服务以查看详细信息。

7d1eed2e4728a4f2

点击修订版本标签页。 您应该会看到两个修订版本。点击 monolith-00002 并查看详细信息。您应该会看到并发值降低到 1。

217185c0eccc87dd]

4ad481b8bcd0343d

虽然该配置足以满足测试需求,但在大多数生产场景中,您会拥有支持多个并发请求的容器。

现在,无需重新部署即可恢复原始并发设置。您可以将并发值设置为默认值 80 或 0,这将移除所有并发限制,并将其设置为默认的最大值(编写本文时,该值恰好为 80)。

在 Cloud Shell 中运行以下命令,以更新当前修订版本:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 80

请注意,系统已创建了另一个修订版本,该流量已重定向,并且并发设置已恢复到 80。

7. 更改网站

您的营销团队要求您更改公司网站的首页。他们认为,该公司的经营范围和销售情况应该更加丰富。在此部分中,您将在首页添加一些文字,让营销团队满意!

您的某个开发者似乎已经使用文件名“index.js.new”创建了更改。您只需将该文件复制到 index.js,您所做的更改就会体现出来。按照说明进行适当的更改。

运行以下命令,将更新后的文件复制到正确的文件名,然后输出其内容以验证更改:

cd ~/monolith-to-microservices/react-app/src/pages/Home
mv index.js.new index.js
cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js

最终代码应如下所示:

/*
Copyright 2019 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Typography from "@material-ui/core/Typography";
const useStyles = makeStyles(theme => ({
  root: {
    flexGrow: 1
  },
  paper: {
    width: "800px",
    margin: "0 auto",
    padding: theme.spacing(3, 2)
  }
}));
export default function Home() {
  const classes = useStyles();
  return (
    <div className={classes.root}>
      <Paper className={classes.paper}>
        <Typography variant="h5">
          Fancy Fashion &amp; Style Online
        </Typography>
        <br />
        <Typography variant="body1">
          Tired of mainstream fashion ideas, popular trends and societal norms?
          This line of lifestyle products will help you catch up with the Fancy trend and express your personal style.
          Start shopping Fancy items now!
        </Typography>
      </Paper>
    </div>
  );
}

您更新了 React 组件,但需要构建 React 应用以生成静态文件。运行以下命令,构建 React 应用并将其复制到单体式应用公共目录:

cd ~/monolith-to-microservices/react-app
npm run build:monolith

现在您的代码已更新,接下来您需要重新构建 Docker 容器并将其发布到 Container Registry。您可以使用与之前相同的命令,但这次您需要更新版本标签!

运行以下命令,使用更新后的映像版本 2.0.0 触发新的 Cloud Build:

cd ~/monolith-to-microservices/monolith

#Feel free to test your application
npm start

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .

在下一部分中,您将使用该映像在不停机的情况下更新应用。

8. 零停机更新网站

更改已完成,营销团队对您的更新感到满意!是时候在不中断用户的情况下更新网站了。

Cloud Run 将每个部署视为新修订版本,该修订版本将在线,然后将流量重定向到它。

按照接下来的说明更新您的网站。

命令行

在命令行中,您可以使用以下命令重新部署该服务,以将映像更新为新版本:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --platform managed

验证部署

通过运行以下命令来验证部署更新:

gcloud run services describe monolith --platform managed 

输出结果如下所示:

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  annotations:
    client.knative.dev/user-image: gcr.io/my-cloudrun-codelab/monolith:2.0.0
...

您会看到您的服务正在使用新修订版本中部署的最新版本映像。

如需验证您的更改,请再次导航到 Cloud Run 服务的外部网址,您会注意到应用标题已更新。

运行以下命令列出服务,如果您忘记了 IP 地址,请查看:

gcloud run services list

现在,您的网站应该会显示您添加到首页组件的文字了!

451ca252acae6928

9. 清理

删除 Container Registry 映像

# Delete the container image for version 1.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --quiet

# Delete the container image for version 2.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --quiet

从 Cloud Storage 中删除 Cloud Build 制品

# The following command will take all source archives from all builds and delete them from cloud storage

# Run this command to print all sources:
# gcloud builds list | awk 'NR > 1 {print $4}' 

gcloud builds list | awk 'NR > 1 {print $4}' | while read line; do gsutil rm $line; done

删除 Cloud Run 服务

gcloud run services delete monolith --platform managed

10. 恭喜

您已使用 Cloud Run 部署、扩缩和更新网站。

了解详情