GSP041

概览
您的经营活动依赖于一系列内部应用的支持,而内部应用负载均衡器对于构建强大、安全且易于管理的内部应用至关重要。本实验将教您如何在私有云网络中分配网络流量,而无需直接向公共互联网公开虚拟机,从而确保服务的安全性和高效性。
您将构建一种精简但非常常见的架构模式:
- 一个需要其他内部服务的协助的“Web 层”(面向公众的网站)。
- 一个负责执行特定任务,并分布在多台机器上的“内部服务层”(质数计算器)。
此设置可确保即使内部服务的某个部分变得繁忙或出现故障,整个系统也能保持顺畅运行,因为负载均衡器会自动将请求定向到运行状况良好的机器。
您将执行的操作
- 了解构成内部负载均衡器的组件
- 创建一组后端机器(质数计算器)
- 设置内部负载均衡器,以将内部流量导向后端机器。
- 从另一台内部机器测试内部负载均衡器
- 设置一个面向公众的 Web 服务器,该服务器使用内部负载均衡器从内部“质数计算器”服务获取结果。
前提条件
- 基本熟悉 Google Cloud Compute Engine:了解什么是虚拟机实例。
- 了解网络组建和管理的基本概念:IP 地址是什么。
- 了解基本的 Unix/Linux 命令行:如何在终端中输入命令。
- 掌握一些有关 VPC(虚拟私有云)的知识:了解您的 Google Cloud 资源位于专用网络中。
设置和要求
点击“开始实验”按钮前的注意事项
请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 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
。
-
在弹出的窗口中执行以下操作:
- 继续完成 Cloud Shell 信息窗口中的设置。
- 授权 Cloud Shell 使用您的凭据进行 Google Cloud API 调用。
如果您连接成功,即表示您已通过身份验证,且项目 ID 会被设为您的 Project_ID 。输出内容中有一行说明了此会话的 Project_ID:
Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}
gcloud
是 Google Cloud 的命令行工具。它已预先安装在 Cloud Shell 上,且支持 Tab 自动补全功能。
- (可选)您可以通过此命令列出活跃账号名称:
gcloud auth list
- 点击授权。
输出:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (可选)您可以通过此命令列出项目 ID:
gcloud config list project
输出:
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
注意:如需查看在 Google Cloud 中使用 gcloud
的完整文档,请参阅 gcloud CLI 概览指南。
设置区域和可用区
- 为本实验设置项目区域和可用区:
gcloud config set compute/region {{{project_0.default_region | Region}}}
gcloud config set compute/zone {{{project_0.default_zone | Zone}}}
- 为区域创建一个变量:
export REGION={{{project_0.default_region | REGION}}}
- 为可用区创建一个变量:
export ZONE={{{project_0.default_zone | Zone}}}
参阅“区域和可用区”文档了解详情。
注意:当您在自己的机器上运行 gcloud
时,不同会话的配置设置保持不变。但在 Cloud Shell 中,您需要为每个新会话或重新建立的连接设置配置。
任务 1. 创建虚拟环境
虚拟环境可让项目的软件保持整洁有序,并确保代码始终使用所需特定版本的工具运行。
Python 虚拟环境用于将软件包安装与系统隔离开来。
- 安装
virtualenv
环境:
sudo apt-get install -y virtualenv
- 构建虚拟环境:
python3 -m venv venv
- 激活此虚拟环境:
source venv/bin/activate
任务 2. 创建后端托管式实例组
通过使用“托管式实例组”,Google Cloud 可以自动创建和维护服务的多个相同副本。如果一个副本出现故障,Google Cloud 会将其替换掉,从而提高服务的可靠性。
创建启动脚本
此脚本就像一组指令,实例组中的每个新虚拟机在启动时都会遵循这些指令。我们的脚本将包含一个用 Python 编写的小型 Web 服务器,该服务器可以告诉我们某个数字是否为质数(True 或 False)。
- 首先,在主目录中创建
backend.sh
脚本:
touch ~/backend.sh
- 点击 Cloud Shell 顶部的图标前往打开编辑器。如果看到提示,请点击在新窗口中打开。

注意:如果您没有看到“代码编辑器”图标,请点击“导航菜单”图标关闭左侧面板。
启动代码编辑器会将 Cloud Shell 移至新窗口并打开代码编辑器。几秒钟后,您将看到工作区。
-
在左侧窗格中选择 backend.sh
文件。
-
现在,将以下脚本添加到右侧的编辑器中:
sudo chmod -R 777 /usr/local/sbin/
sudo cat << EOF > /usr/local/sbin/serveprimes.py
import http.server
def is_prime(a): return a!=1 and all(a % i for i in range(2,int(a**0.5)+1))
class myHandler(http.server.BaseHTTPRequestHandler):
def do_GET(s):
s.send_response(200)
s.send_header("Content-type", "text/plain")
s.end_headers()
s.wfile.write(bytes(str(is_prime(int(s.path[1:]))).encode('utf-8')))
http.server.HTTPServer(("",80),myHandler).serve_forever()
EOF
nohup python3 /usr/local/sbin/serveprimes.py >/dev/null 2>&1 &
- 依次点击文件 -> 保存。
创建实例模板
- 点击 Cloud Shell 工具栏上的打开终端。输入以下命令以创建实例模板
primecalc
:
gcloud compute instance-templates create primecalc \
--metadata-from-file startup-script=backend.sh \
--no-address --tags backend --machine-type=e2-medium
这是后端虚拟机的“蓝图”。请注意,命令中含有 --no-address
,这意味着这些后端虚拟机不会有公共互联网访问权限,以确保安全性。
打开防火墙
您需要创建一条防火墙规则,以允许端口 80 的流量(标准 HTTP 流量)到达后端虚拟机。这对于内部应用负载均衡器和健康检查能够与这些后端进行通信至关重要。
- 在防火墙上开放端口
80
:
gcloud compute firewall-rules create http --network default --allow=tcp:80 \
--source-ranges {{{project_0.startup_script.selected_cidr | IP}}} --target-tags backend
点击下方的检查我的进度,以确认您在本实验中的进度。
创建实例模板并在防火墙上开放端口 80
创建实例组
- 接下来,创建名为
backend
的托管式实例组。首先创建 3 个实例:
gcloud compute instance-groups managed create backend \
--size 3 \
--template primecalc \
--zone $ZONE
- 此命令运行完毕后,请返回“控制台”标签页。依次点击 Compute Engine > 虚拟机实例。您现在应该会看到实例组正在创建三个后端虚拟机。

后端虚拟机现已准备好处理流量。
点击下方的检查我的进度,以确认您在本实验中的进度。
创建实例组
任务 3. 设置内部负载均衡器
您需要为您的内部服务创建一个单独的专用 VIP 入口。这样一来,其他内部应用就能够可靠地访问“质数计算器”,而无需知道当前具体是哪个后端虚拟机处于活跃状态或可用状态。
现在,我们来设置内部负载均衡器,并将其连接到您刚刚创建的实例组。
内部负载均衡器包含三个主要部分:
- 转发规则:用于定义其他内部服务将实际向哪个专用 IP 地址发送请求。它会将流量“转发”到您的后端服务。
- 后端服务:用于定义负载均衡器如何将流量分配给虚拟机实例。它还包括健康检查。
- 健康检查:这是一项持续检查,用于监控后端虚拟机的“健康”状况。负载均衡器仅向通过健康检查的机器发送流量,从而确保您的服务始终可用。
下图展示了如何通过位于不同可用区的多个后端组中的多个实例实现负载均衡。

创建健康检查
- 健康检查很有必要,它可确保负载均衡器仅向健康状况良好的实例发送流量。您的后端服务是一个 HTTP 服务器,因此需检查它在特定网址路径(在本例中为
/2
,用于确定 2 是否为质数)上是否返回“200 OK”响应:
gcloud compute health-checks create http ilb-health --request-path /2
由于提供的是 HTTP 服务,请查看在特定网址路径(在本例中为 /2
,用于确定 2 是否为质数)上是否返回了 200 响应:
创建后端服务
- 现在,创建名为
prime-service
的后端服务:
gcloud compute backend-services create prime-service \
--load-balancing-scheme internal --region=$REGION \
--protocol tcp --health-checks ilb-health
此服务会将健康检查与实例组相关联。
将实例组添加到后端服务
- 将后端实例组连接到 prime-service 后端服务。这样一来,负载均衡器就知道应该管理哪些机器:
gcloud compute backend-services add-backend prime-service \
--instance-group backend --instance-group-zone=$ZONE \
--region=$REGION
创建转发规则
- 最后,使用静态 IP 创建名为
prime-lb
的转发规则:
gcloud compute forwarding-rules create prime-lb \
--load-balancing-scheme internal \
--ports 80 --network default \
--region=$REGION --address {{{project_0.startup_script.selected_forwarding_rule_cidr | IP}}} \
--backend-service prime-service
您的“质数计算”内部服务现已完全设置完毕,可以通过其内部 IP 地址对它运行查询。
点击下方的检查我的进度,以确认您在本实验中的进度。
设置内部负载均衡器
任务 4. 测试负载均衡器
此步骤至关重要,旨在确认内部应用负载均衡器能否正确地将流量导向后端服务。它能够证明其他内部应用现在可以通过单个稳定的 IP 地址可靠地访问您的服务,从而确保应用持续运行。
要测试负载均衡器,您需要在与内部应用负载均衡器所处的网络中创建新的虚拟机实例。该实例只能从您的私有云网络内部访问,不能直接通过 Cloud Shell 访问,因为 Cloud Shell 位于此网络之外。
- 在 Cloud Shell 中使用
gcloud
创建一个简单的测试实例:
gcloud compute instances create testinstance \
--machine-type=e2-standard-2 --zone $ZONE
- 然后通过 SSH 连接到该实例:
gcloud compute ssh testinstance --zone $ZONE
如果出现提示,请输入 Y 并按两次 Enter 键继续。
对负载均衡器运行查询
- 在测试实例内部,使用
curl
向内部应用负载均衡器的 IP 地址提问,查询一些数是否为质数:
curl {{{project_0.startup_script.selected_forwarding_rule_cidr | IP}}}/2
curl {{{project_0.startup_script.selected_forwarding_rule_cidr | IP}}}/4
curl {{{project_0.startup_script.selected_forwarding_rule_cidr | IP}}}/5
输出结果(True 或 False)会显示在命令行旁边,如下所示:
user@testinstance:~$ curl {{{project_0.startup_script.selected_forwarding_rule_cidr | IP}}}/2
Trueuser@testinstance:~$ curl {{{project_0.startup_script.selected_forwarding_rule_cidr | IP}}}/4
Falseuser@testinstance:~$ curl {{{project_0.startup_script.selected_forwarding_rule_cidr | IP}}}/5
Trueuser@testinstance:~$ exit
您应该会看到,2 和 5 被正确识别为质数,但 4 被识别为非质数。这表明内部应用负载均衡器在正常运行!它接收了请求,并成功将其转发到您的某个后端“质数计算”虚拟机。
该服务返回了正确的回答:2 和 5 是质数,但 4 不是。
- 退出测试实例:
exit
- 然后将其删除,因为已不再需要:
gcloud compute instances delete testinstance --zone=$ZONE
- 输入 Y,确认删除。
任务 5. 创建面向公众的 Web 服务器
现在,您将看到面向公众的应用(例如网站)如何利用您的内部服务。您将创建一个面向公众的 Web 服务器,它将通过内部应用负载均衡器,使用内部“质数计算器”服务来显示质数矩阵。
- 首先,在主目录中为此面向公众的“前端”创建启动脚本:
touch ~/frontend.sh
- 代码编辑器应仍处于打开状态,否则,请在 shell 中选择代码编辑器,以启动该编辑器:

几秒钟后,您将看到工作区。
- 现在,将以下脚本添加到右侧的编辑器中:
sudo chmod -R 777 /usr/local/sbin/
sudo cat << EOF > /usr/local/sbin/getprimes.py
import urllib.request
from multiprocessing.dummy import Pool as ThreadPool
import http.server
PREFIX="http://{{{project_0.startup_script.selected_forwarding_rule_cidr | IP}}}/" #HTTP Load Balancer
def get_url(number):
return urllib.request.urlopen(PREFIX+str(number)).read().decode('utf-8')
class myHandler(http.server.BaseHTTPRequestHandler):
def do_GET(s):
s.send_response(200)
s.send_header("Content-type", "text/html")
s.end_headers()
i = int(s.path[1:]) if (len(s.path)>1) else 1
s.wfile.write("<html><body><table>".encode('utf-8'))
pool = ThreadPool(10)
results = pool.map(get_url,range(i,i+100))
for x in range(0,100):
if not (x % 10): s.wfile.write("<tr>".encode('utf-8'))
if results[x]=="True":
s.wfile.write("<td bgcolor='#00ff00'>".encode('utf-8'))
else:
s.wfile.write("<td bgcolor='#ff0000'>".encode('utf-8'))
s.wfile.write(str(x+i).encode('utf-8')+"</td> ".encode('utf-8'))
if not ((x+1) % 10): s.wfile.write("</tr>".encode('utf-8'))
s.wfile.write("</table></body></html>".encode('utf-8'))
http.server.HTTPServer(("",80),myHandler).serve_forever()
EOF
nohup python3 /usr/local/sbin/getprimes.py >/dev/null 2>&1 &
- 依次点击文件 -> 保存。
创建前端实例
- 在 Cloud Shell 中,创建一个名为
frontend
的实例,用于运行此 Web 服务器:
gcloud compute instances create frontend --zone=$ZONE \
--metadata-from-file startup-script=frontend.sh \
--tags frontend --machine-type=e2-standard-2
为前端打开防火墙
- 这是一个面向公众的服务器,因此您需要为其打开防火墙,以允许来自互联网上任何位置 (0.0.0.0/0) 的流量通过端口 80:
gcloud compute firewall-rules create http2 --network default --allow=tcp:80 \
--source-ranges 0.0.0.0/0 --target-tags frontend
-
在导航菜单中,点击 Compute Engine > 虚拟机实例。如果您没有看到 frontend
实例,请刷新浏览器。
-
在浏览器中打开前端的外部 IP:

您将会看到如下矩阵,其中所有不大于 100 的质数均显示为绿色:

- 尝试在路径中添加一个数字,例如 http://your-ip/10000,以查看从该数字开始的所有质数。

注意:示例启动脚本并不能高效地计算质数。它也不包含错误检测或更正算法。在路径中添加较大的数字会导致服务超时。
点击下方的检查我的进度,以确认您在本实验中的进度。
创建面向公众的 Web 服务器
恭喜!
您已成功使用 Google Cloud 的内部应用负载均衡器构建了一个可靠的内部服务,并演示了公共应用如何安全地利用该服务。
后续步骤/了解详情
Google Cloud 培训和认证
…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。
本手册的最后更新日期:2025 年 7 月 18 日
本实验的最后测试日期:2025 年 7 月 18 日
版权所有 2025 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。