GSP662
![Google Cloud 自定进度实验](https://cdn.qwiklabs.com/GMOHykaqmlTHiqEeQXTySaMXYPHeIvaqa2qHEzw6Occ%3D)
概览
您可以通过多种方式在 Google Cloud 中部署网站。每种解决方案的特性、功能和控制级别各不相同。Compute Engine 可用于对运行网站所用的基础设施进行深层控制,但与 Google Kubernetes Engine (GKE)、App Engine 等其他解决方案相比,采用 Compute Engine 还需要进行更多的运营管理工作。利用 Compute Engine,您可以精细地全面控制基础设施,包括虚拟机、负载均衡器等。
在本实验中,您将部署一个示例应用,即“Fancy Store”电子商务网站,演示如何使用 Compute Engine 轻松部署和扩缩网站。
学习内容
在本实验中,您将学习如何完成以下操作:
实验结束时,您的托管式实例组中将会有多个实例,可为网站提供自动修复、负载均衡、自动扩缩和滚动更新功能。
设置和要求
点击“开始实验”按钮前的注意事项
请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。
此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。我们会为您提供新的临时凭据,让您可以在实验规定的时间内用来登录和访问 Google Cloud。
为完成此实验,您需要:
- 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
注意:请使用无痕模式或无痕浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。
注意:如果您已有自己的个人 Google Cloud 账号或项目,请不要在此实验中使用,以避免您的账号产生额外的费用。
如何开始实验并登录 Google Cloud 控制台
-
点击开始实验按钮。如果该实验需要付费,系统会打开一个弹出式窗口供您选择付款方式。左侧是实验详细信息面板,其中包含以下各项:
-
打开 Google Cloud 控制台按钮
- 剩余时间
- 进行该实验时必须使用的临时凭据
- 帮助您逐步完成本实验所需的其他信息(如果需要)
-
点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。
该实验会启动资源并打开另一个标签页,显示登录页面。
提示:请将这些标签页安排在不同的窗口中,并将它们并排显示。
注意:如果您看见选择账号对话框,请点击使用其他账号。
-
如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。
{{{user_0.username | "<用户名>"}}}
您也可以在实验详细信息面板中找到用户名。
-
点击下一步。
-
复制下面的密码,然后将其粘贴到欢迎对话框中。
{{{user_0.password | "<密码>"}}}
您也可以在实验详细信息面板中找到密码。
-
点击下一步。
重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。
注意:在本次实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
-
继续在后续页面中点击以完成相应操作:
- 接受条款及条件。
- 由于该账号为临时账号,请勿添加账号恢复选项或双重验证。
- 请勿注册免费试用。
片刻之后,系统会在此标签页中打开 Google Cloud 控制台。
注意:如需查看列有 Google Cloud 产品和服务的菜单,请点击左上角的导航菜单。
激活 Cloud Shell
Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。
- 点击 Google Cloud 控制台顶部的激活 Cloud Shell
。
如果您连接成功,即表示您已通过身份验证,且当前项目会被设为您的 PROJECT_ID 环境变量所指的项目。输出内容中有一行说明了此会话的 PROJECT_ID:
Your Cloud Platform project in this session is set to YOUR_PROJECT_ID
gcloud
是 Google Cloud 的命令行工具。它已预先安装在 Cloud Shell 上,且支持 Tab 自动补全功能。
- (可选)您可以通过此命令列出活跃账号名称:
gcloud auth list
-
点击授权。
-
现在,输出的内容应如下所示:
输出:
ACTIVE: *
ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (可选)您可以通过此命令列出项目 ID:
gcloud config list project
输出:
[core]
project = <project_ID>
输出示例:
[core]
project = qwiklabs-gcp-44776a13dea667a6
Note: For full documentation of gcloud
, in Google Cloud, refer to the gcloud CLI overview guide.
设置区域和可用区
某些 Compute Engine 资源位于区域和可用区内。区域是指某个地理位置,您可以在其中运行自己的资源。每个区域包含一个或多个可用区。
在 Cloud 控制台中运行以下 gcloud 命令,设置实验的默认区域和可用区:
gcloud config set compute/zone "{{{project_0.default_zone|ZONE}}}"
export ZONE=$(gcloud config get compute/zone)
gcloud config set compute/region "{{{project_0.default_region|REGION}}}"
export REGION=$(gcloud config get compute/region)
任务 1. 启用 Compute Engine API
gcloud services enable compute.googleapis.com
任务 2. 创建 Cloud Storage 存储桶
您将使用 Cloud Storage 存储桶来存储您构建的代码以及启动脚本。
- 在 Cloud Shell 中执行以下命令,创建新的 Cloud Storage 存储桶:
gsutil mb gs://fancy-store-$DEVSHELL_PROJECT_ID
注意:在 Cloud Shell 中使用 $DEVSHELL_PROJECT_ID
环境变量有助于确保对象名称是唯一的。由于 Google Cloud 内的所有项目 ID 都必须是唯一的,因此附加项目 ID 也可使其他名称具有唯一性。
点击检查我的进度以验证是否完成了以下目标:
创建 Cloud Storage 存储桶
任务 3. 克隆源代码库
根据 monolith-to-microservices
代码库,将现有 Fancy Store 电子商务网站作为您网站的基础。
克隆源代码,以便您专注于将网站部署到 Compute Engine。在本实验的后面部分,您将对代码进行细微更新,以演示在 Compute Engine 上进行更新有多么简单。
- 克隆源代码,然后前往
monolith-to-microservices
目录:
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
- 运行代码的初始 build,让应用在本地运行:
./setup.sh
该脚本需要几分钟才能完成。
- 完成后,运行以下命令,确保 Cloud Shell 运行的是兼容的 NodeJS 版本:
nvm install --lts
- 接下来,运行以下命令以测试应用,切换到
microservices
目录,然后启动 Web 服务器:
cd microservices
npm start
您应该会看到以下输出内容:
Products microservice listening on port 8082!
Frontend microservice listening on port 8080!
Orders microservice listening on port 8081!
- 点击“网页预览”图标,然后选择在端口 8080 上预览,即可预览应用。
![突出显示的“网页预览”图标和“在端口 8080 上预览”选项](https://cdn.qwiklabs.com/Dk9ATSH41enVkqcJ%2FyOYJYEcyKTSRj%2BlhCJLSXXP6AA%3D)
浏览器会打开一个新窗口,其中会展示 Fancy Store 的前端。
注意:通过“预览”选项,您应该能够看到前端;但是,Products 和 Orders 功能并未正常运作,因为这些服务尚未公开。
- 查看网站后关闭此窗口,然后在终端窗口中按 Ctrl+C 来停止 Web 服务器进程。
任务 4. 创建 Compute Engine 实例
接下来开始部署一些 Compute Engine 实例。
在后续步骤中,您将执行以下操作:
- 创建启动脚本以配置实例。
- 克隆源代码并将其上传至 Cloud Storage。
- 部署 Compute Engine 实例,用于托管后端微服务。
- 重新配置前端代码,以利用后端微服务实例。
- 部署 Compute Engine 实例,用于托管前端微服务。
- 配置网络以允许通信。
创建启动脚本
使用启动脚本可以告知实例每次启动时要执行哪些操作。这样便可以自动配置实例。
- 在 Cloud Shell 中运行以下命令,创建名为
startup-script.sh
的文件:
touch ~/monolith-to-microservices/startup-script.sh
- 在 Cloud Shell 功能区中点击打开编辑器,打开代码编辑器。
![“打开编辑器”按钮](https://cdn.qwiklabs.com/cLSDByRQwL60BI%2FwSnOn4sutVas9YQaekVTqPAJKWk4%3D)
-
找到 monolith-to-microservices
文件夹。
-
将以下代码添加到 startup-script.sh
文件中。添加之后,您需要修改部分代码:
#!/bin/bash
# Install logging monitor. The monitor will automatically pick up logs sent to
# syslog.
curl -s "https://storage.googleapis.com/signals-agents/logging/google-fluentd-install.sh" | bash
service google-fluentd restart &
# Install dependencies from apt
apt-get update
apt-get install -yq ca-certificates git build-essential supervisor psmisc
# Install nodejs
mkdir /opt/nodejs
curl https://nodejs.org/dist/v16.14.0/node-v16.14.0-linux-x64.tar.gz | tar xvzf - -C /opt/nodejs --strip-components=1
ln -s /opt/nodejs/bin/node /usr/bin/node
ln -s /opt/nodejs/bin/npm /usr/bin/npm
# Get the application source code from the Google Cloud Storage bucket.
mkdir /fancy-store
gsutil -m cp -r gs://fancy-store-[DEVSHELL_PROJECT_ID]/monolith-to-microservices/microservices/* /fancy-store/
# Install app dependencies.
cd /fancy-store/
npm install
# Create a nodeapp user. The application will run as this user.
useradd -m -d /home/nodeapp nodeapp
chown -R nodeapp:nodeapp /opt/app
# Configure supervisor to run the node app.
cat >/etc/supervisor/conf.d/node-app.conf << EOF
[program:nodeapp]
directory=/fancy-store
command=npm start
autostart=true
autorestart=true
user=nodeapp
environment=HOME="/home/nodeapp",USER="nodeapp",NODE_ENV="production"
stdout_logfile=syslog
stderr_logfile=syslog
EOF
supervisorctl reread
supervisorctl update
- 在文件中找到
[DEVSHELL_PROJECT_ID]
文本,并将其替换为您的项目 ID:
现在,startup-script.sh
文件中的这行代码应类似于以下内容:
gs://fancy-store-{{{project_0.project_id | Project ID}}}/monolith-to-microservices/microservices/* /fancy-store/
-
保存 startup-script.sh
文件,但不要关闭它。
-
查看 Cloud Shell 代码编辑器的右下角,确保“End of Line Sequence”(行尾序列)设为“LF”,而不是“CRLF”。
![“End of Line Sequence”(行尾序列)](https://cdn.qwiklabs.com/qx86NqNw9AZ2JE1oMYK9WwnmhhSuXgdzfh2U2%2F%2FTcKA%3D)
- 如果设为 CRLF,请点击 CRLF,然后在下拉菜单中选择 LF。
- 如果已设为 LF,则保留原样。
-
关闭 startup-script.sh
文件。
-
返回 Cloud Shell 终端,然后运行以下命令,将 startup-script.sh
文件复制到存储桶:
gsutil cp ~/monolith-to-microservices/startup-script.sh gs://fancy-store-$DEVSHELL_PROJECT_ID
现在可通过以下网址访问此文件:https://storage.googleapis.com/[BUCKET_NAME]/startup-script.sh
。
[BUCKET_NAME] 代表 Cloud Storage 存储桶的名称。默认情况下,只有获得授权的用户和服务账号才能查看此文件,因此无法通过网络浏览器访问它。Compute Engine 实例能够自动通过其服务账号访问此文件。
启动脚本会执行以下任务:
- 安装 Logging 代理。该代理会自动从 syslog 收集日志。
- 安装 Node.js 和 Supervisor。Supervisor 将应用作为守护程序运行。
- 从 Cloud Storage 存储桶克隆应用的源代码并安装依赖项。
- 将 Supervisor 配置为运行该应用。如果应用意外退出或者被管理员或进程停止,Supervisor 将确保应用重启。此外,它还会将应用的 stdout 和 stderr 发送到 syslog,以便 Logging 代理进行收集。
将代码复制到 Cloud Storage 存储桶
实例启动后,会从 Cloud Storage 存储桶中拉取代码,因此您可以在代码的 .env
文件中存储一些配置变量。
注意:您还可以编写代码来从其他地方拉取环境变量,但为了便于演示,本实验中采用简单方法来处理配置。在生产环境中,环境变量可能存储在代码之外。
- 将克隆的代码复制到存储桶:
cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/
注意:系统会删除 node_modules
依赖项目录,以确保尽可能快速、高效地完成复制。实例启动时,系统会在实例上重新创建这些目录。
点击检查我的进度以验证是否完成了以下目标:
将启动脚本和代码复制到 Cloud Storage 存储桶
部署后端实例
首先要部署的是后端实例,用于存储 Orders 和 Products 微服务。
注意:在生产环境中,您可能需要为每项微服务使用不同的实例和实例组,让它们能够独立扩缩。为了便于演示,将两个后端微服务(Orders 和 Products)放在同一个实例和实例组中。
- 执行以下命令,创建一个配置为使用启动脚本的
e2-standard-2
实例。此实例已标记为 backend
实例,因此您稍后可以对其应用特定防火墙规则:
gcloud compute instances create backend \
--zone=$ZONE \
--machine-type=e2-standard-2 \
--tags=backend \
--metadata=startup-script-url=https://storage.googleapis.com/fancy-store-$DEVSHELL_PROJECT_ID/startup-script.sh
配置与后端的连接
在部署应用的前端之前,您需要先更新配置,以指向刚才部署的后端。
- 运行以下命令来检索后端的外部 IP 地址,查看后端实例
EXTERNAL_IP
标签页下的内容:
gcloud compute instances list
输出示例:
NAME: backend
ZONE: {{{project_0.default_zone | zone}}}
MACHINE_TYPE: e2-standard-2
PREEMPTIBLE:
INTERNAL_IP: 10.142.0.2
EXTERNAL_IP: 35.237.245.193
STATUS: RUNNING
-
复制后端的外部 IP。
-
在 Cloud Shell 的“探索器”中,依次找到 monolith-to-microservices
> react-app
。
-
在代码编辑器中,依次选择 View(查看)> Toggle Hidden Files(切换隐藏文件)来查看 .env
文件。
在下一步中,您需要修改 .env
文件,以指向后端的外部 IP。[BACKEND_ADDRESS] 代表后端实例的外部 IP 地址,该地址通过前面的 gcloud
命令确定。
- 在
.env
文件中,将 localhost
替换为您的 [BACKEND_ADDRESS]
:
REACT_APP_ORDERS_URL=http://[BACKEND_ADDRESS]:8081/api/orders
REACT_APP_PRODUCTS_URL=http://[BACKEND_ADDRESS]:8082/api/products
-
保存文件。
-
在 Cloud Shell 中运行以下命令,重新构建 react-app
以更新前端代码:
cd ~/monolith-to-microservices/react-app
npm install && npm run-script build
- 然后,将应用代码复制到 Cloud Storage 存储桶:
cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/
部署前端实例
代码已配置完毕,现在来部署前端实例。
- 执行以下命令来部署
frontend
实例,此命令与前面的命令类似。出于防火墙用途,此实例已标记为 frontend
:
gcloud compute instances create frontend \
--zone=$ZONE \
--machine-type=e2-standard-2 \
--tags=frontend \
--metadata=startup-script-url=https://storage.googleapis.com/fancy-store-$DEVSHELL_PROJECT_ID/startup-script.sh
注意:由于代码已配置为默认启动所有微服务,为简单起见,我们将部署命令和启动脚本一起用于前端和后端实例。因此,在此示例中,所有微服务会在前端和后端运行。在生产环境中,您只需在每个组件上运行所需的微服务。
配置网络
- 创建防火墙规则,以允许前端访问端口 8080,后端访问端口 8081 和 8082。这些防火墙命令会使用在为应用创建实例时指定的标记:
gcloud compute firewall-rules create fw-fe \
--allow tcp:8080 \
--target-tags=frontend
gcloud compute firewall-rules create fw-be \
--allow tcp:8081-8082 \
--target-tags=backend
网站现在应该能够完全正常运作。
- 为了前往
frontend
的外部 IP,您需要知道地址。运行以下命令,确定 frontend
实例的 EXTERNAL_IP:
gcloud compute instances list
输出示例:
NAME: backend
ZONE: us-central1-f
MACHINE_TYPE: e2-standard-2
PREEMPTIBLE:
INTERNAL_IP: 10.128.0.2
EXTERNAL_IP: 34.27.178.79
STATUS: RUNNING
NAME: frontend
ZONE: us-central1-f
MACHINE_TYPE: e2-standard-2
PREEMPTIBLE:
INTERNAL_IP: 10.128.0.3
EXTERNAL_IP: 34.172.241.242
STATUS: RUNNING
该实例可能需要几分钟才能启动并完成配置。
-
等待 3 分钟,然后打开新的浏览器标签页,通过网址 http://[FRONTEND_ADDRESS]:8080
访问该网站,其中 [FRONTEND_ADDRESS] 是之前确定的 frontend 实例的 EXTERNAL_IP。
-
尝试前往 Products 和 Orders 页面;现在它们应该可以正常工作。
![Fancy Store 的“Products”标签页。产品图片采用平铺布局。](https://cdn.qwiklabs.com/6mhPhrVBDstCzOqIFqna6TEGaojlLuWfByWddSXAAfU%3D)
点击检查我的进度以验证是否完成了以下目标:
部署实例并配置网络
任务 5. 创建托管式实例组
为了让应用能够扩缩,需要创建托管式实例组,并将 frontend
和 backend
实例用作实例模板。
托管式实例组 (MIG) 包含多个相同实例,可将这些实例作为单个可用区内的单个实体进行管理。托管式实例组会主动让实例保持可用(即处于“正在运行”状态),以维持应用的高可用性。您将为前端和后端实例使用托管式实例组,以提供自动修复、负载均衡、自动扩缩和滚动更新功能。
基于源实例创建实例模板
在创建托管式实例组之前,您必须先创建实例模板,以用作实例组的基础。通过实例模板,您可以定义在创建新虚拟机实例时要使用的机器类型、启动磁盘映像或容器映像、网络和其他实例属性。您可以使用实例模板创建属于托管式实例组的实例,甚至是创建单独的实例。
若要创建实例模板,需使用您之前创建的现有实例。
- 首先,停止两个实例:
gcloud compute instances stop frontend --zone=$ZONE
gcloud compute instances stop backend --zone=$ZONE
- 然后,基于每个源实例创建实例模板:
gcloud compute instance-templates create fancy-fe \
--source-instance-zone=$ZONE \
--source-instance=frontend
gcloud compute instance-templates create fancy-be \
--source-instance-zone=$ZONE \
--source-instance=backend
- 确认实例模板已创建完成:
gcloud compute instance-templates list
输出示例:
NAME: fancy-be
MACHINE_TYPE: e2-standard-2
PREEMPTIBLE:
CREATION_TIMESTAMP: 2023-07-25T14:52:21.933-07:00
NAME: fancy-fe
MACHINE_TYPE: e2-standard-2
PREEMPTIBLE:
CREATION_TIMESTAMP: 2023-07-25T14:52:15.442-07:00
- 创建实例模板后,删除
backend
虚拟机以节省资源空间:
gcloud compute instances delete backend --zone=$ZONE
- 当系统提示时,输入 y。
正常情况下,您也可以删除 frontend
虚拟机,但在本实验的后面部分,您需要使用它来更新实例模板。
创建托管式实例组
- 接下来,创建两个托管式实例组,分别用于前端和后端:
gcloud compute instance-groups managed create fancy-fe-mig \
--zone=$ZONE \
--base-instance-name fancy-fe \
--size 2 \
--template fancy-fe
gcloud compute instance-groups managed create fancy-be-mig \
--zone=$ZONE \
--base-instance-name fancy-be \
--size 2 \
--template fancy-be
这些托管式实例组将使用实例模板,并配置为每个实例组内各有两个实例要启动。系统会根据指定的 base-instance-name
并附加随机字符来自动为实例命名。
- 对于 Fancy Store 应用,
frontend
微服务在端口 8080 上运行,backend
微服务在端口 8081(用于 orders
)和端口 8082(用于 products)上运行:
gcloud compute instance-groups set-named-ports fancy-fe-mig \
--zone=$ZONE \
--named-ports frontend:8080
gcloud compute instance-groups set-named-ports fancy-be-mig \
--zone=$ZONE \
--named-ports orders:8081,products:8082
这些是非标准端口,因此您可以指定已命名端口来标识它们。已命名端口是键值对元数据,代表服务名称以及运行服务的端口。可以将已命名端口分配给实例组,这表示该实例组中的所有实例都可以使用该服务。HTTP 负载均衡服务会使用这些信息,我们将在后面进行配置。
配置自动修复功能
若要提高应用本身的可用性,验证应用能否正常响应,可以为托管式实例组配置自动修复政策。
自动修复政策依赖于基于应用的健康检查来验证应用能否按预期响应。默认行为是仅验证实例是否处于“正在运行”状态,相比之下,检查应用能否正常响应可以获得更加精准的结果。
注意:应分别针对负载均衡和自动修复使用单独的健康检查。用于负载均衡的健康检查可能而且应该更加激进,因为这些检查将确定实例能否收到用户流量。您需要快速捕获无响应的实例,以便在必要时重定向流量。相对来说,用于自动修复的健康检查会导致 Compute Engine 主动替换出现故障的实例,因此这类健康检查应比负载均衡健康检查更为保守。
- 创建如下健康检查:如果检查连续 3 次针对
frontend
和 backend
返回“unhealthy”(健康状况不佳),则应修复实例:
gcloud compute health-checks create http fancy-fe-hc \
--port 8080 \
--check-interval 30s \
--healthy-threshold 1 \
--timeout 10s \
--unhealthy-threshold 3
gcloud compute health-checks create http fancy-be-hc \
--port 8081 \
--request-path=/api/orders \
--check-interval 30s \
--healthy-threshold 1 \
--timeout 10s \
--unhealthy-threshold 3
- 创建防火墙规则,允许健康检查探测连接到端口 8080 和 8081 上的微服务:
gcloud compute firewall-rules create allow-health-check \
--allow tcp:8080-8081 \
--source-ranges 130.211.0.0/22,35.191.0.0/16 \
--network default
- 将健康检查应用于对应的服务:
gcloud compute instance-groups managed update fancy-fe-mig \
--zone=$ZONE \
--health-check fancy-fe-hc \
--initial-delay 300
gcloud compute instance-groups managed update fancy-be-mig \
--zone=$ZONE \
--health-check fancy-be-hc \
--initial-delay 300
注意:自动修复功能可能需要 15 分钟才会开始监控实例组中的实例。
- 继续进行本实验,自动修复功能需要一些时间才会监控实例组中的实例。您将在本实验末尾模拟故障,测试自动修复能否正常运作。
点击检查我的进度以验证是否完成了以下目标:
创建托管式实例组
任务 6. 创建负载均衡器
若要对托管式实例组进行补充,可以使用 HTTP(S) 负载均衡器将流量传送给前端和后端微服务,然后使用映射根据路径规则将流量传送给适当的后端服务。这会对所有服务公开单个负载均衡 IP。
如需详细了解 Google Cloud 的负载均衡选项,请参阅 Cloud Load Balancing 概览。
创建 HTTP(S) 负载均衡器
Google Cloud 提供了许多不同类型的负载均衡器。在本实验中,您将使用 HTTP(S) 负载均衡器来处理流量。HTTP 负载均衡器的结构如下:
- 转发规则将传入的请求定向到目标 HTTP 代理。
- 目标 HTTP 代理根据网址映射检查每个请求,为请求确定适当的后端服务。
- 后端服务根据关联后端的服务能力、可用区和实例健康状况,将每个请求定向到适当的后端。系统会通过 HTTP 健康检查来验证每个后端实例的健康状况。如果将后端服务配置为使用 HTTPS 或 HTTP/2 健康检查,系统会在将请求发送到后端实例的过程中会对其进行加密。
- 负载均衡器与实例之间的会话可以使用 HTTP、HTTPS 或 HTTP/2 协议。如果您使用 HTTPS 或 HTTP/2,后端服务中的每个实例都必须具有 SSL 证书。
注意:为了在演示中避免与 SSL 证书相关的复杂问题,请使用 HTTP 而不是 HTTPS。对于生产环境,建议尽可能使用 HTTPS 进行加密。
- 创建健康检查,用于确定哪些实例能够为各项服务传送流量:
gcloud compute http-health-checks create fancy-fe-frontend-hc \
--request-path / \
--port 8080
gcloud compute http-health-checks create fancy-be-orders-hc \
--request-path /api/orders \
--port 8081
gcloud compute http-health-checks create fancy-be-products-hc \
--request-path /api/products \
--port 8082
注意:这些健康检查适用于负载均衡器,只会处理来自负载均衡器的定向流量,不会导致托管式实例组重新创建实例。
- 创建后端服务,作为经过负载均衡的流量的目标。后端服务将使用您创建的健康检查和已命名端口:
gcloud compute backend-services create fancy-fe-frontend \
--http-health-checks fancy-fe-frontend-hc \
--port-name frontend \
--global
gcloud compute backend-services create fancy-be-orders \
--http-health-checks fancy-be-orders-hc \
--port-name orders \
--global
gcloud compute backend-services create fancy-be-products \
--http-health-checks fancy-be-products-hc \
--port-name products \
--global
- 添加负载均衡器的后端服务:
gcloud compute backend-services add-backend fancy-fe-frontend \
--instance-group-zone=$ZONE \
--instance-group fancy-fe-mig \
--global
gcloud compute backend-services add-backend fancy-be-orders \
--instance-group-zone=$ZONE \
--instance-group fancy-be-mig \
--global
gcloud compute backend-services add-backend fancy-be-products \
--instance-group-zone=$ZONE \
--instance-group fancy-be-mig \
--global
- 创建网址映射。网址映射定义将哪些网址定向至哪些后端服务。
gcloud compute url-maps create fancy-map \
--default-service fancy-fe-frontend
- 创建路径匹配器,允许
/api/orders
和 /api/products
路径路由到它们各自的服务:
gcloud compute url-maps add-path-matcher fancy-map \
--default-service fancy-fe-frontend \
--path-matcher-name orders \
--path-rules "/api/orders=fancy-be-orders,/api/products=fancy-be-products"
- 创建要与网址映射关联的代理:
gcloud compute target-http-proxies create fancy-proxy \
--url-map fancy-map
- 创建一条全局转发规则,将公共 IP 地址和端口与该代理关联起来:
gcloud compute forwarding-rules create fancy-http-rule \
--global \
--target-http-proxy fancy-proxy \
--ports 80
点击检查我的进度以验证是否完成了以下目标:
创建 HTTP(S) 负载均衡器
更新配置
您已经有了新的静态 IP 地址,现在来更新 frontend
的代码,以指向这个新地址,不要使用先前指向 backend
实例的临时地址。
- 在 Cloud Shell 中,切换到
react-app
文件夹,该文件夹中的 .env
文件内包含相关配置:
cd ~/monolith-to-microservices/react-app/
- 确定负载均衡器的 IP 地址:
gcloud compute forwarding-rules list --global
输出示例:
NAME: fancy-http-rule
REGION:
IP_ADDRESS: 34.111.203.235
IP_PROTOCOL: TCP
TARGET: fancy-proxy
- 返回 Cloud Shell 编辑器,再次修改
.env
文件,以指向负载均衡器的公共 IP。[LB_IP] 代表之前确定的后端实例的外部 IP 地址。
REACT_APP_ORDERS_URL=http://[LB_IP]/api/orders
REACT_APP_PRODUCTS_URL=http://[LB_IP]/api/products
注意:新地址中移除了端口,因为负载均衡器已配置为帮您处理这种转发请求。
-
保存文件。
-
重新构建 react-app
以更新前端代码:
cd ~/monolith-to-microservices/react-app
npm install && npm run-script build
- 将应用代码复制到存储桶:
cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/
更新前端实例
现在有了新的代码和配置,您要使用托管式实例组内的前端实例拉取新代码。
实例会在启动时拉取代码,因此您可以发出滚动重启命令:
gcloud compute instance-groups managed rolling-action replace fancy-fe-mig \
--zone=$ZONE \
--max-unavailable 100%
注意:在上面的滚动替换示例中,您通过 --max-unavailable
参数明确指出所有机器可立即替换。如果不使用此参数,该命令会让一个实例保持可用,同时重启其他实例,以确保可用性。为了便于测试,您要指定所有机器可立即替换,以加快速度。
点击检查我的进度以验证是否完成了以下目标:
更新前端实例
测试网站
- 发出
rolling-action replace
命令后等待 3 分钟,以便系统有充足的时间处理实例,然后再查看托管式实例组的状态。运行以下命令,以确认服务的状态显示为 HEALTHY:
watch -n 2 gcloud compute backend-services get-health fancy-fe-frontend --global
- 等待 2 项服务的状态显示为 HEALTHY。
输出示例:
backend: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instanceGroups/fancy-fe-mig
status:
healthStatus:
- healthState: HEALTHY
instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-x151
ipAddress: 10.128.0.7
port: 8080
- healthState: HEALTHY
instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-cgrt
ipAddress: 10.128.0.11
port: 8080
kind: compute#backendServiceGroupHealth
注意:如果某个实例出现问题且处于“UNHEALTHY”状态,系统应该会自动修复该实例。等待实例修复完成。
等待一段时间后,如果两个实例都未变为“HEALTHY”状态,则表明前端实例的设置有误,因此无法通过端口 8080 访问实例。若要测试这个问题,可以直接查看端口 8080 上的实例。
- 列表中的两个实例都显示“HEALTHY”状态后,按 Ctrl+C 退出
watch
命令。
注意:通过 http://[LB_IP] 可以访问这个应用,其中 [LB_IP] 是系统为负载均衡器指定的 IP_ADDRESS,您可使用以下命令确定该地址:
gcloud compute forwarding-rules list --global
在本实验的后面部分,您会查看应用。
任务 7. 扩缩 Compute Engine
到目前为止,您已经创建了两个托管式实例组,每个组中均包含两个实例。这项配置完全可以正常运作,但这是一项静态配置,不能根据负载情况进行调整。接下来,您需要根据利用率创建自动扩缩政策,以便自动扩缩每个托管式实例组。
根据利用率自动进行调整
gcloud compute instance-groups managed set-autoscaling \
fancy-fe-mig \
--zone=$ZONE \
--max-num-replicas 2 \
--target-load-balancing-utilization 0.60
gcloud compute instance-groups managed set-autoscaling \
fancy-be-mig \
--zone=$ZONE \
--max-num-replicas 2 \
--target-load-balancing-utilization 0.60
这些命令会针对托管式实例组创建自动扩缩器,在利用率高于 60% 时自动添加实例,在负载均衡器的利用率低于 60% 时自动移除实例。
启用内容分发网络
内容分发网络服务也有助于实现扩缩,启用后可为前端提供缓存。
gcloud compute backend-services update fancy-fe-frontend \
--enable-cdn --global
当用户从 HTTP(S) 负载均衡器请求内容时,该请求会发送到 Google Front End (GFE)。GFE 首先会在 Cloud CDN 缓存中查找对用户请求的响应。如果 GFE 找到缓存的响应,就会将其发送给用户。这称为缓存命中。
如果 GFE 找不到针对该请求缓存的响应,便会向后端直接发出请求。如果该请求的响应可缓存,GFE 会将响应存储在 Cloud CDN 缓存中,这样便可使用缓存为后续请求查找响应。
点击检查我的进度以验证是否完成了以下目标:
扩缩 Compute Engine
任务 8. 更新网站
更新实例模板
现有的实例模板不可修改;不过,您的实例是无状态的,而且所有配置都是通过启动脚本完成的,因此,如果您想更改模板设置,只需要更改实例模板。现在,您需要进行简单的更改,以使用更大的机器类型,并完成推送任务。
完成以下步骤:
- 运行以下命令,修改前端实例的机器类型:
gcloud compute instances set-machine-type frontend \
--zone=$ZONE \
--machine-type e2-small
- 创建新的实例模板:
gcloud compute instance-templates create fancy-fe-new \
--region=$REGION \
--source-instance=frontend \
--source-instance-zone=$ZONE
- 将更新后的实例模板部署到托管式实例组:
gcloud compute instance-groups managed rolling-action start-update fancy-fe-mig \
--zone=$ZONE \
--version template=fancy-fe-new
- 等待 3 分钟,然后运行以下命令来监控更新状态:
watch -n 2 gcloud compute instance-groups managed list-instances fancy-fe-mig \
--zone=$ZONE
这将需要一点时间。
更新完成后,将至少有 1 个实例处于以下状况:
- 状态:正在运行
- 操作:设为无
- INSTANCE_TEMPLATE:新模板名称 (fancy-fe-new)
-
复制列出的其中一个机器名称,以在下个命令中使用。
-
按 Ctrl+C 退出 watch
进程。
-
运行以下命令,以查看虚拟机使用的是否为新机器类型 (e2-small),其中 [VM_NAME] 是新创建的实例:
gcloud compute instances describe [VM_NAME] --zone=$ZONE | grep machineType
预期输出示例:
machineType: https://www.googleapis.com/compute/v1/projects/project-name/zones/us-central1-f/machineTypes/e2-small
更改网站内容
场景:营销团队要求您更改网站的首页,他们希望页面上显示更多关于公司简介和所售产品/服务的信息。
任务:在首页上添加一些文字,满足营销团队的要求。似乎某位开发者已经使用名为 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 { Box, Paper, Typography } from "@mui/material";
export default function Home() {
return (
<Box sx={{ flexGrow: 1 }}>
<Paper
elevation={3}
sx={{
width: "800px",
margin: "0 auto",
padding: (theme) => theme.spacing(3, 2),
}}
>
<Typography variant="h5">Welcome to the Fancy Store!</Typography>
<br />
<Typography variant="body1">
Take a look at our wide variety of products.
</Typography>
</Paper>
</Box>
);
}
您已经更新了 React 组件,但还需要构建 React 应用来生成静态文件。
- 运行以下命令,构建 React 应用并将其复制到单体式应用公共目录:
cd ~/monolith-to-microservices/react-app
npm install && npm run-script build
- 然后,将此代码重新推送到存储桶:
cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/
利用滚动替换推送更改
- 现在,强制替换所有实例,以拉取更新内容:
gcloud compute instance-groups managed rolling-action replace fancy-fe-mig \
--zone=$ZONE \
--max-unavailable=100%
注意:在上面的滚动替换示例中,您通过 --max-unavailable
参数明确指出所有机器可立即替换。如果不使用此参数,该命令会让一个实例保持可用,同时替换其他实例。为了便于测试,您要指定所有机器可立即替换,以加快速度。在生产环境中,预留缓冲区可让网站在更新期间继续正常运作。
点击检查我的进度以验证是否完成了以下目标:
更新网站
- 发出
rolling-action replace
命令后等待 3 分钟,以便系统有充足的时间处理实例,然后再查看托管式实例组的状态。运行以下命令,以确认服务的状态显示为 HEALTHY:
watch -n 2 gcloud compute backend-services get-health fancy-fe-frontend --global
- 等待一点时间,直到两项服务都显示且变为“HEALTHY”状态。
输出示例:
backend: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instanceGroups/fancy-fe-mig
status:
healthStatus:
- healthState: HEALTHY
instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-x151
ipAddress: 10.128.0.7
port: 8080
- healthState: HEALTHY
instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-cgrt
ipAddress: 10.128.0.11
port: 8080
kind: compute#backendServiceGroupHealth
-
当服务显示在列表中且处于“HEALTHY”状态后,按 Ctrl+C 退出 watch
命令。
-
通过 http://[LB_IP]
前往这个网站,其中 [LB_IP] 是为负载均衡器指定的 IP_ADDRESS,您可使用以下命令确定该地址:
gcloud compute forwarding-rules list --global
现在应该可以看到对网站进行的新更改。
模拟故障
为了确认健康检查能否正常工作,请登录实例并停止服务。
- 如需确定实例名称,请执行以下命令:
gcloud compute instance-groups list-instances fancy-fe-mig --zone=$ZONE
- 复制实例名称,然后运行以下命令,对实例使用安全外壳 (SSH),其中 INSTANCE_NAME 是列表中的一个实例:
gcloud compute ssh [INSTANCE_NAME] --zone=$ZONE
-
输入“y”进行确认,然后按两次 Enter 键指定不使用密码。
-
在实例中,使用 supervisorctl
停止应用:
sudo supervisorctl stop nodeapp; sudo killall node
- 退出实例:
exit
- 监控修复操作:
watch -n 2 gcloud compute operations list \
--filter='operationType~compute.instances.repair.*'
这需要几分钟才能完成。
查看以下输出示例:
NAME TYPE TARGET HTTP_STATUS STATUS TIMESTAMP
repair-1568314034627-5925f90ee238d-fe645bf0-7becce15 compute.instances.repair.recreateInstance us-central1-a/instances/fancy-fe-1vqq 200 DONE 2019-09-12T11:47:14.627-07:00
为了修复该实例,托管式实例组重新创建了该实例。
- 您也可以在控制台中依次点击导航菜单 > Compute Engine > 虚拟机实例,来监控该过程。
恭喜!
您已经使用 Compute Engine 成功部署、扩缩和更新了网站。您现在已经具备 Compute Engine、托管式实例组、负载均衡器和健康检查的使用经验!
后续步骤/了解详情
Google Cloud 培训和认证
…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。
上次更新手册的时间:2024 年 4 月 26 日
上次测试实验的时间:2023 年 12 月 15 日
版权所有 2024 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。