准备工作
- 如果您要使用本指南中的命令行示例,请执行以下操作:
- 安装或更新到 gcloud 命令行工具的最新版本。
- 设置默认区域和地区。
- 如果您要使用本指南中的 API 示例,请设置 API 访问权限。
在实例和本地计算机之间复制文件
使用 gcloud compute scp
在 Linux 实例和本地计算机之间传输文件:
gcloud compute scp my-instance:~/file-1 \
my-instance:~/file-2 \
~/local-dir
要将文件从本地机器复制到您的实例,请使用以下命令:
gcloud compute scp ~/local-dir/file-1 \
my-instance:~/remote-destination
检测您是否在 Compute Engine 中运行
系统通常希望检测其是否在特定的云环境中运行。使用以下说明可帮助您检测您是否在 Compute Engine 中运行。
使用元数据服务器
您可以使用元数据服务器轻松检测您的应用或脚本是否在 Compute Engine 实例中运行。当您向服务器发出请求时,来自元数据服务器的任何响应都将包含 Metadata-Flavor: Google
标头。您可以查找此标头以可靠地检测您是否在 Compute Engine 中运行。
例如,以下 curl 请求会返回 Metadata-Flavor: Google
标头,指示该请求是在 Compute Engine 实例中生成的。
me@my-inst:~$ curl metadata.google.internal -i HTTP/1.1 200 OK Metadata-Flavor: Google Content-Type: application/text Date: Thu, 10 Apr 2014 19:24:27 GMT Server: Metadata Server for VM Content-Length: 22 X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN 0.1/ computeMetadata/
使用其他方法
Linux
对于 Linux 实例,dmidecode
工具可用于直接访问 /proc/mem
中的 DMI/SMBIOS 信息。运行以下命令后,dmidecode 工具应输出“Google Compute Engine”,以表明您正在 Google Compute Engine 中运行:
my@myinst:~$ sudo dmidecode -s system-product-name | grep "Google Compute Engine" Google Compute Engine
Windows
在 Windows 实例中,“Google”会被列为系统制造商和型号。您可以使用类似 msinfo32.exe 的实用工具来查找此信息。例如,msinfo32 会显示以下信息:

如果需要以编程方式在 Windows 实例上确定此信息,您可以创建一个 Windows Management Instrumentation (WMI) 应用并进行一些修改。
如何处理实例故障
遗憾的是,个别实例会不时出现故障。这可能是由于各种原因造成的,包括意外中断、硬件错误或其他系统故障。为了减少这种情况,您应使用永久性磁盘并定期备份数据。
如果实例出现故障,会自动重启,并且其使用的根永久性磁盘、元数据和实例设置与发生故障时相同。要控制实例的自动重启行为,请参阅如何设置时间安排选项。
一般来说,您应该将系统设计得足够强大,以确保单个实例故障不会对您的应用造成灾难性的影响。如需了解详情,请参阅设计可靠的系统。
通过 UUID 标识实例
每个虚拟机都有一个通用唯一标识符 (UUID),可以通过 Linux 映像的 dmidecode 工具访问此标识符。UUID 是根据虚拟机的项目 ID、地区和实例名称计算而来的。实例的 UUID 在 Compute Engine 虚拟机中是独一无二的,并且在实例的生命周期内保持不变。在虚拟机重启过程中,UUID 将会保留。如果虚拟机在同一项目和地区中被删除并重新创建,并使用相同的实例名称,则 UUID 也将保持不变。
要在 Linux 实例上查找实例的 UUID,请从虚拟机运行以下命令:
me@myinst:~$ sudo dmidecode -t system | grep UUID
该工具应输出类似以下内容的响应:
UUID: FE0C672D-324F-25F1-052C-6C50FA8B7397
安装软件包并配置实例
实例创建者对其添加到项目的任意实例都拥有管理员权限,并且会自动被添加到 SUDO 列表中。
当您以管理员身份登录实例时,您可以像安装普通的 Linux“盒子”一样安装软件包并配置实例。例如,您可以安装 Apache,如下所示:
user@myinst:~$ sudo apt-get update && sudo apt-get install apache2 Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: [...]
如在实例与本地计算机之间复制文件所述,您可以使用 gcloud compute scp
在您的本地计算机和实例之间移动文件。
请注意,您的机器需要连接互联网才能运行 apt-get。这意味着该机器需要使用外部 IP 地址或者能够访问互联网代理。
在待处理的基础架构维护事件(包括尝试实时迁移或终止,以及重启虚拟机)发生之前,Compute Engine 会尽快在虚拟机的元数据服务器中更改特殊属性。maintenance-event
属性将在事件发生前后更新,这样您将可以检测这些事件即将发生的时间。在维护事件发生前后,您可以使用此信息来帮助自动执行您希望运行的任何脚本或命令。
如需了解详情,请参阅元数据服务器文档页面中的透明维护通知部分。
列出所有实例
您可以通过调用 instances list
来查看项目中所有实例的列表:
gcloud compute instances list
NAME ZONE MACHINE_TYPE INTERNAL_IP EXTERNAL_IP STATUS example-instance us-central1-a n1-standard-1 10.105.155.92 173.255.114.53 RUNNING example-instance-2 us-central1-a n1-standard-1 10.181.215.203 146.148.32.59 RUNNING
默认情况下,gcloud compute
提供了所有可用地区的所有资源的汇总列表。如果您只需要一个地区的资源列表,请在请求中提供 --zones
标志。
在 API 中,您需要向两种不同的方法发出请求,以获取汇总资源列表或单个地区的资源列表。要发出请求以获得汇总列表,请向该资源的 aggregatedList
URI 发出 GET
请求,并将项目替换为您自己的项目 ID:
https://www.googleapis.com/compute/v1/projects/myproject/aggregated/instances
在客户端库中,向 instances().aggregatedList
函数发出请求:
def listAllInstances(auth_http, gce_service):
request = gce_service.instances().aggregatedList(project=PROJECT_ID)
response = request.execute(auth_http)
print response
要发出请求以获得单个地区的实例列表,请向以下 URI 发出 GET
请求,将项目替换为您自己的项目 ID,并将地区替换为实例所在地区:
https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/instances
在 API 客户端库中,发出一个 instances().list
请求:
def listInstances(auth_http, gce_service):
request = gce_service.instances().list(project="myproject",
zone="us-central1-f")
response = request.execute(auth_http)
print response
通过抢占式实例降低费用
Google Compute Engine 提供抢占式实例。与常规实例相比,抢占式实例的创建和运行费用要低得多。如果您的应用属于容错型应用,且可以承受实例不稳定性,则使用抢占式实例可以显著降低您的 Compute Engine 费用。如需了解详情,请参阅抢占式实例文档。
为实例设置网络时间协议 (NTP)
许多依赖于事件的严密顺序的软件系统都依靠稳定、一致的系统时钟。由大多数服务编写的系统日志都包含时间戳,时间戳有助于调试系统的各个组件之间发生的问题。为帮助确保系统时钟同步,Compute Engine 实例已预先配置为使用网络时间协议 (NTP)。
除了保持服务器时间同步以外,在出现闰秒的罕见情况下,NTP 也很实用。闰秒是指对世界协调时间 (UTC) 增加或减少 1 秒的调整,以考虑地球旋转引起的变化。闰秒不会按照常规的时间间隔发生,因为地球的旋转速度会随着气候和地质事件而不规则地变化。之前出现的闰秒已经对网络上的各种服务和应用造成了严重破坏。NTP 服务器有助于确保在出现闰秒时,所有服务器报告相同的时间。
本部分介绍如何在虚拟机上配置 NTP 服务器,以确保该服务器在出现闰秒时正常运行。
Google NTP 服务器和闰秒模糊处理
闰秒(Unix 时间)通常通过重复当天的最后一秒来实现。这会导致预计时间戳只会增加的软件出现问题。为了解决这个问题,Google 的时间服务器会在二十个小时(闰秒出现前十个小时及闰秒出现后十个小时)内“模糊处理”这额外的一秒,这样计算机便不会将这额外的一秒视为重复的时间戳。该操作可以降低依赖于一致时间戳的系统的风险。建议将所有 Compute Engine 虚拟机实例配置为使用内部 Google NTP 服务。
为您的实例配置 NTP
Google 无法预测外部 NTP 服务(如 pool.ntp.org)如何处理闰秒。如果可能的话,建议您不要在 Compute Engine 虚拟机上使用外部 NTP 源。更糟糕的是,同时使用 Google NTP 服务和外部服务可能会导致系统时间发生不可预知的变化。最好仅使用一个外部 NTP 源,而不要使用混合源,但外部 NTP 服务(如 pool.ntp.org)可能会使用步进来处理闰秒。因此,您的虚拟机可能会体验到重复的时间戳。
最安全的方法是将 Compute Engine 虚拟机配置为使用单个 NTP 服务器(由 Google 提供的内部 NTP 服务器)。请勿混用外部 NTP 服务器和 Google NTP 服务器,因为这可能会导致意想不到的行为。
为确保您的虚拟机配置正确,请按照以下说明进行操作。
Linux
使用 ssh 连接到您的实例。
Console
- 转到 GCP Console 中的虚拟机实例页面。
点击要配置的实例旁边的 ssh 按钮。
gcloud
使用
gcloud
命令行工具,运行以下命令:gcloud compute instances ssh INSTANCE
在您的实例上,运行
ntpq -p
来检查 NTP 配置的当前状态:$ ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *metadata.google 255.28.23.83 2 u 27 64 1 0.634 -2.537 2.285 *217.162.232.173 130.149.17.8 2 u 191 1024 176 79.245 3.589 27.454
如果您看到指向
metadata.google
或metadata.google.internal
的单条记录,则无需进行任何更改。如果您看到 metadata.google 与公共源(如 pool.ntp.org)之间混用了多个源,则需要更新源以移除所有外部 NTP 服务器。本例中有两条记录,一条指向
metadata.google
,另一条指向外部地址。由于存在多个源,因此您需要更新您的 NTP 服务器以移除*217.162.232.173
地址。配置 NTP 服务器以移除外部源。
要配置 NTP 服务器,请使用您常用的文本编辑器来修改
/etc/ntp.conf
文件。找到配置的servers
部分,然后移除所有非 Google NTP 源:
$ vim /etc/ntp.conf
... # You do need to talk to an NTP server or two (or three). #server ntp.your-provider.example ... server metadata.google.internal iburst
修改
/etc/ntp.conf
文件后,重启 NTP 服务。重启命令可能因 Linux 发行版而异:$ sudo service ntp reload
- 验证您的配置。再次运行
ntpq -p
命令以验证您的更改:
$ ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *metadata.google 255.28.23.83 2 u 27 64 1 0.634 -2.537 2.285
Windows
- 转到 GCP Console 中的虚拟机实例页面。
点击要登录的 Windows 实例旁边的 RDP 按钮。
登录后,右键点击 Powershell 图标并选择以管理员身份运行。
当命令提示符加载时,运行以下命令以查看当前的 NTP 配置:
PS C:\Windows\system32>w32tm /query /configuration [Configuration] ... Type: NTP (Local) NtpServer: metadata.google.internal, ...
如果您看到指向
metadata.google
或metadata.google.internal
的单条记录,则无需进行任何更改。如果您看到metadata.google
与公共源之间混用了多个源,则需要移除外部服务器。按照 Windows 指南配置您的 NTP 服务器。
Google NTP 服务器的闰秒模糊处理功能是一种便捷的方式,可管理在对时间敏感的系统中重放一秒所涉及的风险。其他 NTP 服务可以为大多数软件系统提供合适的解决方案。请务必不要将 Google 闰秒模糊处理 NTP 服务与公共 NTP 步进服务混用。
要将 Google 云端以外的设备同步为经过闰秒追平 (Leap Smear) 处理的时间,请使用 Google 公共 NTP。该服务采用的闰秒追平方式与提供给 Compute Engine 虚拟机实例的方式相同。