1. 简介
大家好,感谢大家的到来!准备好学习 Google Compute Engine 了吗?
在此 Codelab 中,我们将通过一个示例留言板应用来探索 Compute Engine。
您将创建 Compute Engine 实例、部署 nginx,最后将网络负载平衡器放在前面。您可以通过图形控制台或命令行创建 Compute Engine 实例。本实验将指导您使用命令行。
Google Compute Engine 提供在 Google 数据中心内运行的虚拟机,这些虚拟机连接到 Google 的全球光纤网络。我们提供的工具和工作流可让您从单一实例扩容到覆盖全球的负载均衡云计算。
这些虚拟机启动速度快,不仅配备永久性磁盘存储空间,还能提供稳定的性能。这些机器提供多种配置(包括预定义容量),还支持根据具体需求优化的自定义机器类型创建。
最后,Compute Engine 虚拟机也是几款其他 Google Cloud 产品(Kubernetes Engine、Cloud Dataproc、Cloud Dataflow 等)所使用的技术。
2. 设置和要求
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。
- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串,您可以随时对其进行更新。
- 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且不可变(一经设置便无法更改)。Cloud Console 会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为
PROJECT_ID
),因此如果您不喜欢某个 ID,请再生成一个随机 ID,还可以尝试自己创建一个,并确认是否可用。然后,项目创建后,ID 会处于“冻结”状态。 - 第三个值是一些 API 使用的项目编号。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 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)。
- 如需从 Cloud Console 激活 Cloud Shell,只需点击激活 Cloud Shell(预配和连接到环境仅需花费一些时间)。
在连接到 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:
默认情况下,Cloud Shell 还会设置一些环境变量,这对您日后运行命令可能会很有用。
echo $GOOGLE_CLOUD_PROJECT
命令输出
<PROJECT_ID>
- 最后,设置默认可用区和项目配置。
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 (LAT) 映像。如果您使用的是自己的自定义映像,请在此处提供映像名称。例如
--image my-own-image
。 n1-standard-1
机器类型。您可以选择其他机器类型,例如n1-highmem-4
或n1-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 中)通过 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。
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:
确保退出 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_IP
是 myinstance 的公共 IP,您应该能够看到 nginx 页面:
7. 启动脚本
您可以使用启动脚本在实例启动时初始化实例,而无需每次都设置实例。
创建一个名为 startup.sh
且包含以下内容的文件(您可以使用自己喜欢的文本编辑器:vim
、nano
或 emacs
):
#! /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 中有多种类型的负载平衡器,其中包括:
- L3 网络负载平衡器
- L7 HTTP(S) 负载平衡器
我们来创建一个针对实例组的区域级网络负载平衡器:
$ 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 具有丰富的功能。你可能需要深入了解以下内容:
- 抢占式虚拟机 - https://cloud.google.com/compute/docs/instances/create-start-preemptible-instance
- 单租户节点 - https://cloud.google.com/compute/docs/nodes/create-nodes
- GPU 和TPU - https://cloud.google.com/compute/docs/gpus/add-gpus
- Windows 实例 - https://cloud.google.com/compute/docs/instances/windows/creating-managing-windows-instances
- 为资源加标签 - https://cloud.google.com/compute/docs/labeling-resources
- 将虚拟机迁移到 Compute Engine - https://cloud.google.com/compute/docs/vm-migration/
Google Kubernetes Engine
Google Kubernetes Engine (GKE) 是 Google Cloud 的托管式全代管式 Kubernetes 产品。有多个 Codelab 可帮助您开始使用 GKE。不妨先从示例入手:
- Google Kubernetes Engine Codelab - https://codelabs.developers.google.com/codelabs/cloud-gke-workshop-v2
向我们提供反馈
- 请抽空完成我们简短的调查问卷