使用您的实例执行其他任务

以下是您可能使用实例执行的其他任务。

准备工作

在实例和本地计算机之间复制文件

使用 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 会显示以下信息:

将 Google 显示为制造商和型号的 msinfo32 屏幕(点击即可放大)
将 Google 显示为制造商和型号的 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

  1. 使用 ssh 连接到您的实例。

    Console

    1. 转到 GCP Console 中的虚拟机实例页面。
    2. 点击要配置的实例旁边的 ssh 按钮。

      SSH 按钮的屏幕截图

    gcloud

    使用 gcloud 命令行工具,运行以下命令:

    gcloud compute instances ssh INSTANCE
    

  2. 在您的实例上,运行 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.googlemetadata.google.internal 的单条记录,则无需进行任何更改。如果您看到 metadata.google 与公共源(如 pool.ntp.org)之间混用了多个源,则需要更新源以移除所有外部 NTP 服务器。

    本例中有两条记录,一条指向 metadata.google,另一条指向外部地址。由于存在多个源,因此您需要更新您的 NTP 服务器以移除 *217.162.232.173 地址。

    1. 配置 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
    1. 验证您的配置。再次运行 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

  1. 转到 GCP Console 中的虚拟机实例页面。
  2. 点击要登录的 Windows 实例旁边的 RDP 按钮。

    SSH 按钮的屏幕截图

  3. 登录后,右键点击 Powershell 图标并选择以管理员身份运行

    Powershell 图标的屏幕截图

  4. 当命令提示符加载时,运行以下命令以查看当前的 NTP 配置:

    PS C:\Windows\system32>w32tm /query /configuration
    [Configuration]
    ...
    Type: NTP (Local)
    NtpServer: metadata.google.internal,
    ...
    

    如果您看到指向 metadata.googlemetadata.google.internal 的单条记录,则无需进行任何更改。如果您看到 metadata.google 与公共源之间混用了多个源,则需要移除外部服务器。按照 Windows 指南配置您的 NTP 服务器。

Google NTP 服务器的闰秒模糊处理功能是一种便捷的方式,可管理在对时间敏感的系统中重放一秒所涉及的风险。其他 NTP 服务可以为大多数软件系统提供合适的解决方案。请务必不要将 Google 闰秒模糊处理 NTP 服务与公共 NTP 步进服务混用。

要将 Google 云端以外的设备同步为经过闰秒追平 (Leap Smear) 处理的时间,请使用 Google 公共 NTP。该服务采用的闰秒追平方式与提供给 Compute Engine 虚拟机实例的方式相同。

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档