创建和配置实例

您可以通过两种方式创建和配置运行 Google 的 Container-Optimized OS 的 Compute Engine 实例。

对于要在虚拟机上运行单个容器或在托管实例组中的每个虚拟机上运行单个容器的简单情景,可以在定义实例或实例模板时指定容器映像和可选配置参数。Compute Engine 使用最新版本的 Container-Optimized OS 创建实例,并在虚拟机启动时启动指定的容器。

对于可能要使用 cloud-init 部署多个容器并配置 Docker 选项的高级场景,您可以使用自选的 Container-Optimized OS 映像创建 Compute Engine 实例,然后根据需要继续对它进行配置。

创建一个简单的实例

通过这种方法,使用最新版本的 Container-Optimized OS 在虚拟机上部署单个容器。您可以使用 Google Cloud Console 或 gcloud 工具执行此任务。

控制台

  1. 转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击创建实例

  3. 为您的实例指定名称

  4. 容器部分中,选中将一个容器映像部署到此虚拟机实例 (Deploy a container image to this VM instance) 复选框。

  5. 指定要使用的容器映像

    • 例如,您可以指定 gcr.io/cloud-marketplace/google/nginx1:1.12 以从 Cloud Launcher 中选择 NGINX 1.12 容器映像。
    • 如果您使用 Docker Hub 中的容器映像,请始终指定完整的 Docker 映像名称。例如,指定以下映像名称以部署一个 Apache 容器映像:docker.io/httpd:2.4
  6. (可选)点击高级容器选项。如需了解详情,请参阅配置选项以便运行容器

  7. 点击创建以创建实例、启动实例并启动容器。

gcloud

如需创建一个简单的虚拟机实例,请运行以下命令:

gcloud compute instances create-with-container instance-name \
    --container-image image-name

替换以下内容:

  • instance-name:新实例的名称。
  • image-name:容器映像的名称。

例如,以下命令创建名为 nginx-vm 的新虚拟机实例,该实例将启动并运行 gcr.io/cloud-marketplace/google/nginx1:1.12 容器映像:

gcloud compute instances create-with-container nginx-vm \
    --container-image gcr.io/cloud-marketplace/google/nginx1:1.12

如果使用 Docker Hub 中的容器映像,必须始终指定完整的 Docker 映像名称。例如,指定以下映像名称以部署一个 Apache 容器映像:

docker.io/httpd:2.4

要在托管实例组中的每个虚拟机上运行单个容器,可以在定义实例模板时指定容器映像名称。如需了解详细信息,请参阅使用容器映像创建实例模板

为高级场景创建实例

使用此方法选择特定的 Container-Optimized OS 映像,以部署多个容器,并使用 cloud-init 进行高级配置。

查看可用映像

您可以在 Google Cloud Console 的映像列表中找到 Container-Optimized OS 映像,其前缀为 cos。这些映像托管在 cos-cloud 项目下。您还可以运行以下命令,在命令行中查看当前可用的所有版本:

gcloud compute images list --project cos-cloud --no-standard-images

输出内容类似如下:

NAME                       PROJECT    FAMILY      DEPRECATED  STATUS
cos-69-10895-385-0         cos-cloud  cos-69-lts              READY
cos-73-11647-534-0         cos-cloud  cos-73-lts              READY
cos-77-12371-251-0         cos-cloud  cos-77-lts              READY
cos-81-12871-103-0         cos-cloud  cos-81-lts              READY
cos-beta-81-12871-44-0     cos-cloud  cos-beta                READY
cos-dev-84-13078-0-0       cos-cloud  cos-dev                 READY
cos-stable-81-12871-103-0  cos-cloud  cos-stable              READY

创建实例

您可以使用 Google Cloud Console、gcloud 工具或 API 创建实例。

控制台

要运行安装了 Container-Optimized OS 和 Docker 的 Compute Engine 实例,请执行下列步骤:

  1. 在 Google Cloud Console 上打开 Compute Engine 实例创建页面。

    创建新的 Compute Engine 实例

  2. 为您的实例指定名称

  3. 容器部分中,清除将一个容器映像部署到此虚拟机实例 (Deploy a container image to this VM instance) 复选框。如果要在虚拟机上部署单个容器,那么这个选项特别有用。

  4. 启动磁盘部分中,选择一个 Container-Optimized OS 映像。

  5. 单击创建以创建并启动实例。

gcloud

查看当前可用映像,然后使用以下命令创建一个 cos 节点映像实例:

gcloud compute instances create instance-name \
    --image image-name \
    --image-project cos-cloud \
    --zone compute-zone \
    --machine-type machine-type-name

替换以下内容:

  • instance-name:虚拟机实例的名称。
  • image-name:实例的 Container-Optimized OS 映像的名称,从可用映像列表中获取。在前面的示例中,我们可以使用 cos-beta-81-12871-44-0
  • compute-zone:您的实例的计算区域
  • machine-type-name:要用于此新实例的机器类型。默认类型为 n1-standard-1

例如,以下命令会使用 cos-beta-67-10575-13-0 映像创建名为 cos-test 的实例:

gcloud compute instances create cos-test \
    --image cos-beta-67-10575-13-0 \
    --image-project cos-cloud \
    --zone us-east1-d \
    --machine-type n1-standard-1

如果要使用最新的 devbetastable Container-Optimized OS,请使用 --image-family 标志,如下所示:

gcloud compute instances create instance-name \
    --image-family cos-beta \
    --image-project cos-cloud \
    --zone compute-zone \
    --machine-type machine-type-name

您可以为一次性实验性实例添加 --preemptible 标志。

API

在 API 中,构造一项标准请求来创建实例,但同时包含一个 Container-Optimized OS 源映像。 例如:

POST https://www.googleapis.com/compute/v1/projects/project-id/zones/compute-zone/instances

{
  'machineType': 'zones/compute-zone/machineTypes/machine-type-name',
  'name': 'instance-name',
  'networkInterfaces': [
    {
      'accessConfigs': [
        {
          'type': 'ONE_TO_ONE_NAT',
          'name': 'External NAT'
        }
      ],
      'network': 'global/networks/default'
    }
  ],
  'disks': [
    {
      'type': 'PERSISTENT',
      'boot': true,
      'autoDelete': true,
      'initializeParams': {
        'sourceImage': 'projects/cos-cloud/global/images/family/cos-stable'
      }
    }
  ]
}

配置实例

在某些情况下,您可能希望在实例启动时执行额外的配置。您可以将 cloud-init 工具与 Container-Optimized OS 配合使用,以应用通过 cloud-config 格式提供的配置信息。

将 cloud-init 与 Cloud 配置格式一起使用

Container-Optimized OS 映像包含 cloud-init 作为实例在启动时的配置方式。cloud-init 工具预期在其实例元数据user-data 键的值中进行配置。cloud-init 工具可识别多种格式

以下是一个示例 cloud-init 文件,展示了如何创建用户帐号并创建归此用户所有的系统化服务,以控制对 Docker busybox 容器的管理:

#cloud-config

users:
- name: cloudservice
  uid: 2000

write_files:
- path: /etc/systemd/system/cloudservice.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=Start a simple docker container

    [Service]
    ExecStart=/usr/bin/docker run --rm -u 2000 --name=mycloudservice busybox:latest /bin/sleep 3600
    ExecStop=/usr/bin/docker stop mycloudservice
    ExecStopPost=/usr/bin/docker rm mycloudservice

runcmd:
- systemctl daemon-reload
- systemctl start cloudservice.service

# Optional once-per-boot setup. For example: mounting a PD.
bootcmd:
- fsck.ext4 -tvy /dev/[DEVICE_ID]
- mkdir -p /mnt/disks/[MNT_DIR]
- mount -t ext4 -O ... /dev/[DEVICE_ID] /mnt/disks/[MNT_DIR]

如需创建引用此 cloud-init 文件的 Container-Optimized OS 虚拟机实例,请使用 --metadata-from-file 命令行标志。假设名为 filenamecloud-init 文件位于当前目录中,以下命令会创建 Container-Optimized OS 实例,并通过将文件的内容分配给实例元数据中的 user-data 键触发 cloud-init

gcloud compute instances create instance-name \
    --image-family cos-stable \
    --image-project cos-cloud \
    --metadata-from-file user-data=filename

替换以下内容:

  • instance-name:虚拟机实例的名称。
  • filename:元数据文件的名称。

创建 Container-Optimized OS 实例时,您可以设置其他元数据标志。由于这些属性是简单的键值对,因此您可以在 gcloud compute instances create 命令中使用 --metadata 标志来创建属性。可以展开前面的示例来收集使用情况统计信息和崩溃转储集合,其中包含以下内容:

gcloud compute instances create instance-name \
    --image-family cos-stable \
    --image-project cos-cloud \
    --metadata-from-file user-data=filename \
    --metadata=cos-metrics-enabled=true

其他元数据标志

元数据键 说明 默认行为
cos-update-strategy 指定更新行为。唯一可接受值是:update_disabled 如果未设置,则系统会自动下载并安装当前版本的所有更新。
cos-metrics-enabled 启用崩溃转储收集。可能的值包括:
true
false(默认值)
默认情况下处于停用状态

连接到实例

您可以通过 SSH 连接到运行 cos 节点映像的虚拟机实例,方法与使用 SSH 连接到其他 Google Compute Engine 实例时相同

例如:

gcloud compute ssh instance-name \
    --project project-id \
    --zone compute-zone

运行启动脚本

您可以使用 startup-script 元数据键通过元数据服务器指定启动脚本。您可以使用 gcloud 命令行工具、API 或 Cloud Console 提供启动脚本。有关详细信息,请参阅运行启动脚本

启动和停止 systemd 服务

如需启动 hello.service 文件中指定的服务,请运行以下命令:

sudo systemctl start hello.service

如需停止 hello.service 文件中指定的服务,请运行以下命令:

sudo systemctl stop hello.service

时间同步

里程碑 85 之前,Container-Optimized OS 使用 systemdsystemd-timesyncd 服务,通过 SNTP 协议将本地系统时钟与远程网络时间协议 (NTP) 服务器同步。/etc/systemd/timesyncd.conf 配置文件中的以下条目显示的是注释的默认配置值,可帮助管理员进行所需的更改:

cat /etc/systemd/timesyncd.conf
# comments omitted for brevity
[Time]
#NTP=
#FallbackNTP=metadata.google.internal
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

因此,可接受的最大根距离为 5 秒,NTP 消息的最小和最大轮询间隔分别为 32 秒和 2048 秒。

从里程碑 85 开始,Container-Optimized OS 使用 chronyd 服务,通过 NTP 协议将本地系统时钟与远程网络时间协议 (NTP) 服务器同步。/etc/chrony/chrony.conf 配置文件中的以下条目显示的是注释的默认配置值,可帮助管理员进行所需的更改:

cat /etc/chrony/chrony.conf
# Use custom NTP servers
server metadata.google.internal prefer iburst

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

NTP 服务器根据 eth0 的 HTTP 响应(通常是 Compute Engine 的元数据服务器)进行设置:

networkctl status eth0 | grep NTP
             NTP: 169.254.169.254

更改时区

Google 推出的 Container-Optimized OS 的默认时区是 UTC0。创建指向所需时区的符号链接,如以下示例所示:

sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/US/Pacific /etc/localtime

请注意,/etc 是无状态的,因此每次重新启动时,时区都会重置为默认值 (UTC0)。

停用自动更新

您可以通过两种方法停用自动更新。首选方法是使用 cos-update-strategy 元数据键:

--metadata cos-update-strategy=update_disabled

您还可以使用 systemctl 停用正在运行的实例上的自动更新:

sudo systemctl stop update-engine
sudo systemctl mask update-engine