Google Compute Engine

1. 简介

大家好,感谢大家今天专程前来参会!准备好学习 Google Compute Engine 了吗?

在此 Codelab 中,我们将通过一个 Guestbook 应用示例来探索 Compute Engine 的运作方式。

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

ComputeEngine_128px.png

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

这些虚拟机启动速度快,不仅配备永久性磁盘存储空间,还能提供稳定的性能。这些机器提供了许多配置选项(包括预定义大小),并且还可以创建自定义机器类型(这些类型可针对您的特定需求进行优化)。

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

2. 设置和要求

自定进度的环境设置

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串,您可以随时对其进行更新。
  • 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且不可变(一经设置便无法更改)。Cloud Console 会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为 PROJECT_ID),因此如果您不喜欢某个 ID,请再生成一个随机 ID,还可以尝试自己创建一个,并确认是否可用。然后,项目创建后,ID 会处于“冻结”状态。
  • 第三个值是一些 API 使用的项目编号。如需详细了解所有这三个值,请参阅文档
  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 的防火墙规则,该规则具有允许建立入站连接的默认 IP 地址块列表 (--source-ranges),并将其设置为 0.0.0.0/0(任何位置)。

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

5. 通过 SSH 登录实例

如需通过命令行(仍在 Cloud Shell 中)通过 SSH 连接到实例,请执行以下操作:

$ 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) 通过 SSH 连接到实例,方法是依次前往 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。建议您先从以下内容着手:

向我们提供反馈

  • 请抽出片刻时间,完成这份非常简短的调查问卷