使用 Cloud Run 部署网站

运行和管理虚拟机 (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。

前提条件

学习内容

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

构建内容

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

您需要满足的条件

  • 拥有管理员权限的 Google 帐号,可以创建项目或拥有项目所有者角色的项目

自定进度的环境设置

如果您还没有 Google 帐号,则必须先创建一个。然后,登录 Google Cloud Console,并点击项目 &gt 创建项目

请记住项目 ID,它会自动填充在您的项目名称下。项目 ID 在所有 Google Cloud 项目中都是唯一名称,因此屏幕截图中的名称已被占用,您无法使用。它稍后将称为 PROJECT_ID

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

启用 Cloud Run API

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

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

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

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

Cloud Shell

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

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

要激活 Google Cloud Shell,只需在开发者控制台中点击右上方的按钮(配置和连接到环境应该只需要片刻时间):

activateCloudShell.png

点击“启动 Cloud Shell”按钮:

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>

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

echo $GOOGLE_CLOUD_PROJECT

命令输出

<PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

正在查找您的 PROJECT_ID?请查看您在设置步骤中使用的 ID,或在控制台信息中心内查找:

Project_ID.png

重要提示:最后,设置默认可用区和项目配置:

gcloud config set compute/zone us-central1-f

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

鉴于您正在部署现有网站,您只需从代码库中克隆源代码,因此您可以专注于创建 Docker 映像并将其部署到 Cloud Run。

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

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

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

尽职调查并测试应用。运行以下命令以启动网络服务器:

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

输出:

Monolith listening on port 8080!

您可以通过点击网页预览 并选择在端口 8080 上预览来预览应用。

这将打开一个新窗口,您可以在其中查看 Fancy Store 的实际应用!

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

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

通常,您必须采用一个两步方法,这需要构建 Docker 容器并将其推送到注册表,以存储供 GKE 拉取的映像。但是,您可以使用 Cloud Build 构建 Docker 容器,然后通过一个命令将映像放入 Container Registry 来简化操作!如需查看手动创建 Dockerfile 并推送其过程,请参阅 Container Registry 快速入门

Cloud Build 会对目录中的文件进行压缩,并将其移至 Cloud Storage 存储分区。然后,构建过程将从存储分区获取所有文件并使用 Dockerfile,该文件位于运行 Docker 构建流程的同一目录中。假设您将 --tag 标记指定为 Docker 映像的主机的 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 Console,然后点击导航菜单 ☰&gt;Cloud Build &gt;历史记录。在该页面中,您可以看到先前所有 build 的列表,不过应该只有您创建的 build。

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

现在,您已将网站容器化并推送到 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 

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

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

验证部署

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

输出结果会显示一些信息。您可以看到您的部署、部署它的用户(您的电子邮件地址)以及您可以用来访问该应用的网址。看起来一切都已成功创建!

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

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

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

重新部署并发值为 1 的同一容器映像(仅用于测试目的),并查看结果。

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

像第一次一样回答接下来的问题。命令运行成功后,请在 Cloud Console 中查看结果。

在 Cloud Run 信息中心内,点击 nonolith 服务以查看详情。

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

]

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

现在,恢复原始并发,而不重新部署。您可以将并发值设置为默认值 80 或 0,这样将移除任何并发限制并将其设置为默认最大值(在撰写本文时,恰好是 80)。

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

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

请注意,此时已创建另一个修订版本,流量已经重定向,并且并发回到 80。

您的营销团队要求您更改公司网站的首页。他们认为应该更多地了解公司的情况以及销售的产品。在本部分中,您将向首页添加一些文字,让营销团队满意!

您的某位开发者似乎已创建了文件名为“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 .

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

更改已完成,营销团队将对您最新动态感到满意!请在不干扰用户的情况下更新网站。

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 地址时查看 IP 地址:

gcloud run services list

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

删除 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

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

了解详情