Google Compute Engine

1. 简介

大家好,感谢您今天的参与!准备好了解 Google Compute Engine 了吗?

在此 Codelab 中,我们将通过一个示例留言板应用探索 Compute Engine。

您将创建 Compute Engine 实例、部署 nginx,并最后将网络负载平衡器置于前面。 您可以通过图形控制台或命令行创建 Compute Engine 实例。本实验将引导您使用命令行。

ComputeEngine_128px.png

Google Compute Engine 提供在 Google 数据中心内运行的虚拟机,这类虚拟机连接到其全球光纤网络。所提供的工具和工作流可让您从单一实例扩容到覆盖全球的负载平衡云计算系统。

这些虚拟机启动速度快,不仅配备永久性磁盘存储空间,还能提供稳定的性能。这些机器有许多配置,包括预定义大小,并且还可以根据您的具体需求优化的自定义机器类型。

最后,Compute Engine 虚拟机也是其他几个 Google Cloud 产品(Kubernetes Engine、Cloud Dataproc、Cloud Dataflow 等)使用的技术。

2. 设置和要求

自定进度的环境设置

  1. 登录 Google Cloud Console,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 帐号,则必须创建一个

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 项目名称是此项目参与者的显示名。它是 Google API 不使用的字符串,并且您可以随时对其进行更新。
  • 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且不可变(一经设置便无法更改)。Cloud Console 会自动生成一个唯一字符串;通常您并不在意它是什么。在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为 PROJECT_ID),因此,如果您不喜欢它,请再生成一个随机 ID,或者您也可以尝试自己创建一个,看看可用。然后,项目创建后会处于“冻结”状态。
  • 第三个值是一些项目所用的项目编号。如需详细了解所有这三个值,请参阅文档
  1. 接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Cloud 资源/API。此 Codelab 的运行费用应该不会太多。要关闭资源以免产生超出本教程范围的费用,请按照 Codelab 末尾提供的任何“清理”说明操作。Google Cloud 的新用户有资格参与 $300 USD 免费试用计划。

Google Cloud Shell

虽然 Google Cloud 和 Compute Engine 可以从笔记本电脑远程操作,但在此 Codelab 中,我们将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

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

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

1067942a9a93f70.png

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:

cc3895eeac80db2c.png

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

echo $GOOGLE_CLOUD_PROJECT

命令输出

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

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

3.创建 Compute Engine 实例

如前所述,我们将在此 Codelab 中使用 gcloud 命令行。在此处完成的所有操作都可以通过控制台(可在 console.cloud.google.com 上获取)实现。

我们首先使用默认设置创建一个实例:

$ gcloud compute instances create myinstance
Created [...].
NAME: myinstance
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

记下 EXTERNAL_IP - 稍后非常重要。

该实例采用以下若干默认值创建:

  • 您选择的可用区。所有实例都位于一个可用区中。您可以在创建实例时使用 --zone 标志选择可用区,也可以设置默认可用区(与我们在初始设置中所做的一样),并省略 --zone 标志。
  • 最新的 Debian GNU/Linux 9 (Stretch) 映像。如果您使用的是自己的自定义映像,请改为在此处提供映像名称。例如 --image my-own-image
  • n1-standard-1 机器类型。您可以选择其他机器类型,例如 n1-highmem-4n1-highcpu-6。如果预定义机器类型均不符合您的需求,请使用自定义机器类型
  • 一个与此实例同名的 root 永久性磁盘;该磁盘会自动挂接到此实例。

运行 gcloud compute instances create --help 可查看所有可用选项。

4.为端口 80 启用防火墙

默认情况下,Google Cloud Platform 只允许访问少量端口。 因为我们即将安装 Nginx,所以我们首先要在防火墙配置中启用端口 80。

$ gcloud compute firewall-rules create allow-80 --allow tcp:80
Created [...].
NAME: allow-80
NETWORK: default
DIRECTION: INGRESS
PRIORITY: 1000
ALLOW: tcp:80
DENY:
DISABLED: False

这将创建一个名为 allow-80 的防火墙规则,其中包含允许进行入站连接 (--source-ranges) 的默认 IP 地址块设置为 0.0.0.0/0(无处不在)。

运行 gcloud compute firewall-rules create --help 可查看所有默认值和所有可用选项,包括应用基于标记的防火墙规则的功能。

5. 通过 SSH 连接到实例

如需从命令行(仍然通过 Cloud Shell)连接到实例,请使用以下命令:

$ gcloud compute ssh myinstance
Waiting for SSH key to propagate.
Warning: Permanently added 'compute.12345' (ECDSA) to the list of known hosts.
...

yourusername@myinstance:~#

大功告成!非常容易。(在生产环境中,请务必输入同步密码:)

或者,您也可以直接从控制台 ( console.cloud.google.com) 导航到 Compute Engine > 虚拟机实例,然后点击 SSH

bfbc03997a41946e.png

6.安装 Nginx

登录新建的实例 myinstance,并安装 nginx:

$ sudo su -
# apt update
# apt install -y nginx
# service nginx start
# exit

使用 myinstance 中的 curl 测试服务器是否正在运行:

$ curl -s localhost | grep nginx
<title>Welcome to nginx!</title>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
<a href="http://nginx.org/">nginx.org</a>.<br/>
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>

通过网页界面列出您的实例,查找实例的外部 IP:

dcc4e56e82ba2603.png

请务必退出 SSH,然后从 Cloud Shell 运行以下命令:

$ gcloud compute instances list
NAME: myinstance
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

然后导航到 http://EXTERNAL_IP/,其中 EXTERNAL_IPmyinstance 的公共 IP,您应该会看到 nginx 页面:

49b52b9354041f3b.png

7. 启动脚本

您可以使用启动脚本在启动时初始化实例,而不是每次都设置实例。

创建一个名为 startup.sh 且包含以下内容的文件(您可以使用自己喜爱的文本编辑器:vimnanoemacs):

#! /bin/bash
apt-get update
apt-get install -y nginx
service nginx start
sed -i -- 's/nginx/Google Cloud Platform - '"$HOSTNAME"'/' /var/www/html/index.nginx-debian.html

如需使用此启动脚本创建新的虚拟机实例,只需输入 即可:

$ gcloud compute instances create nginx \
         --metadata-from-file startup-script=startup.sh
Created [...].
NAME: nginx
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

浏览到 http://EXTERNAL_IP/,您应该会看到更新后的首页。如果网页几秒钟后没有立即显示重试,则主机可能仍在启动 nginx。

8. 创建服务器集群

如需创建服务器集群,您首先需要创建实例模板。 创建实例模板后,您可以创建实例组来管理要创建的实例数。

首先,使用启动脚本创建实例模板:

$ gcloud compute instance-templates create nginx-template \
         --metadata-from-file startup-script=startup.sh
Created [...].
NAME: nginx-template
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
CREATION_TIMESTAMP: 2022-03-18T15:10:37.621-07:00

接下来,我们创建一个目标池。目标池可让我们访问一个组中的所有实例,这对后续步骤而言是实现负载均衡的必要条件。

$ gcloud compute target-pools create nginx-pool
Created [...].
NAME: nginx-pool
REGION: us-central1
SESSION_AFFINITY: NONE
BACKUP:
HEALTH_CHECKS:

最后,使用该模板创建实例组:

$ gcloud compute instance-groups managed create nginx-group \
         --base-instance-name nginx \
         --size 2 \
         --template nginx-template \
         --target-pool nginx-pool
Created [...].
NAME: nginx-group
LOCATION: us-central1-f
SCOPE: zone
BASE_INSTANCE_NAME: nginx
SIZE: 0
TARGET_SIZE: 2
INSTANCE_TEMPLATE: nginx-template
AUTOSCALED: no

这将另外创建两个以 nginx- 为前缀的虚拟机实例。

现在,您应该能够看到创建的所有实例了!

$ gcloud compute instances list
NAME: myinstance
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

NAME: nginx
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

NAME: nginx-frpl
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

NAME: nginx-ztg4
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

9. 创建网络负载平衡器

Google Cloud Platform 中有多种类型的负载平衡器,包括:

我们来创建一个针对您的实例组的区域网络负载平衡器:

$ gcloud compute forwarding-rules create nginx-lb \
         --ports 80 \
         --target-pool nginx-pool
Created [...].

$ gcloud compute forwarding-rules list
NAME: nginx-lb
REGION: us-central1
IP_ADDRESS: X.X.X.X
IP_PROTOCOL: TCP
TARGET: us-central1/targetPools/nginx-pool

然后,您可以从浏览器 http://IP_ADDRESS/ 访问负载平衡器,其中 IP_ADDRESS 是运行上一个命令后显示的地址。

受此影响,我们今天不会创建 HTTP 负载平衡器。

10. 清理集群

请记得关闭集群,否则集群将继续运行并产生费用。 以下命令将删除 Google Compute Engine 实例、实例组、定位组和负载平衡器。

$ gcloud compute forwarding-rules delete nginx-lb

$ gcloud compute instance-groups managed delete nginx-group

$ gcloud compute target-pools delete nginx-pool

$ gcloud compute instance-templates delete nginx-template

$ gcloud compute instances delete nginx

$ gcloud compute instances delete myinstance

$ gcloud compute firewall-rules delete allow-80

上述每个命令都应要求您确认删除资源。

11. 接下来做什么?

恭喜!您已完成此 Compute Engine Codelab!

更多 Compute Engine 功能

Google Compute Engine 具有丰富的功能。您可能需要进行以下深入研究:

Google Kubernetes Engine

Google Kubernetes Engine (GKE) 是 Google Cloud 托管的全代管式 Kubernetes 产品。您可以借助多种 Codelab 从 GKE 入手。不妨先从以下主题入手:

向我们提供反馈