使用 Cloud Run 部署网站

1. 准备工作

由于创建和管理虚拟机 (VM) 实例、集群、Pod、服务等所需的开销,运行网站可能很困难。对于大型的多层级应用,这种做法没问题,但如果您只是想部署和展示网站,那么这样做会产生大量开销。

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

在此 Codelab 中,您将从通过 Cloud Build 创建的 Docker 映像开始,并在 Cloud Shell 中触发该映像。然后,您将使用 Cloud Shell 中的命令将该映像部署到 Cloud Run。

前提条件

学习内容

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

构建内容

  • 在 Docker 容器中运行的静态网站
  • 此容器在 Container Registry 中的一个版本
  • 静态网站的 Cloud Run 部署

所需条件

  • 具有创建项目的管理员权限的 Google 账号,或具有项目所有者角色的项目

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 > Enable(启用)。

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.png

系统随即会打开一个新窗口,您可以在其中查看 Fancy Store 的实际运作情况!

9ed25c3f0cbe62fa.png

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

4. 使用 Cloud Build 创建 Docker 容器

现在,源文件已准备就绪,接下来可以将应用容器化了!

通常,您必须采用两步方法,即构建 Docker 容器并将其推送到注册表以存储映像,以便 GKE 从中拉取。不过,您可以使用 Cloud Build 构建 Docker 容器,并通过单个命令将映像放入 Container Registry,从而简化工作!如需查看创建 Dockerfile 并将其推送到 Container Registry 的手动流程,请参阅 Container Registry 快速入门

Cloud Build 会压缩目录中的文件,并将其移至 Cloud Storage 存储分区。然后,构建流程会从存储分区中提取所有文件,并使用位于同一目录中的 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

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

4c753ede203255f6.png

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

6e88ed1643dfe629.png

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.png

验证部署

如需验证部署是否已成功创建,请运行以下命令。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.png

点击修订版本标签页。 您应该会看到系统创建了两个修订版本。点击 monolith-00002 并查看详细信息。您应该会看到并发值减小到 1。

217185c0eccc87dd.png]

4ad481b8bcd0343d.png

虽然此配置足以进行测试,但在大多数生产场景中,您需要容器支持多个并发请求。

现在,无需重新部署即可恢复原始并发性。您可以将并发值设置为默认值 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。您可以使用之前的相同命令,只不过这次要更新版本标签!

运行以下命令,以触发新的 Cloud Build 作业,并将映像版本更新为 2.0.0:

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.png

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 部署、扩缩和更新了网站。

了解详情