您可以通过两种方式创建和配置运行 Google 的 Container-Optimized OS 的 Compute Engine 实例。
对于要在虚拟机上运行单个容器或在托管实例组中的每个虚拟机上运行单个容器的简单情景,可以在定义实例或实例模板时指定容器映像和可选配置参数。Compute Engine 使用最新版本的 Container-Optimized OS 创建实例,并在虚拟机启动时启动指定的容器。
对于可能要使用 cloud-init
部署多个容器并配置 Docker 选项的高级场景,您可以使用自选的 Container-Optimized OS 映像创建 Compute Engine 实例,然后根据需要继续对它进行配置。
创建一个简单的实例
通过这种方法,使用最新版本的 Container-Optimized OS 在虚拟机上部署单个容器。您可以使用 Google Cloud 控制台执行此任务 或 gcloud CLI。
控制台
转到“虚拟机实例”页面。
点击创建实例。
为您的实例指定名称。
在容器部分中,选中将一个容器映像部署到此虚拟机实例 (Deploy a container image to this VM instance) 复选框。
指定要使用的容器映像。
- 您可以指定 Container Registry 或 Artifact Registry 中的映像。例如:
gcr.io/cloud-marketplace/google/nginx1:1.15
用于从 Google Cloud Marketplace 中选择 NGINX 1.15 容器映像。us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
用于从 Artifact Registry 中选择一个示例hello-app
映像。
- 如果您使用 Docker Hub 中的容器映像,请始终指定完整的 Docker 映像名称。例如,指定以下映像名称以部署一个 Apache 容器映像:
docker.io/httpd:2.4
。
- 您可以指定 Container Registry 或 Artifact Registry 中的映像。例如:
(可选)点击高级容器选项。如需了解详情,请参阅配置选项以便运行容器。
点击创建以创建实例、启动实例并启动容器。
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.15
容器映像:
gcloud compute instances create-with-container nginx-vm \ --container-image gcr.io/cloud-marketplace/google/nginx1:1.15
同样,您可以创建名为 hello-app
的新虚拟机实例,该实例会在 Artifact Registry 中启动并运行示例容器:
gcloud compute instances create-with-container hello-app \
--container-image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
如果使用 Docker Hub 中的容器映像,必须始终指定完整的 Docker 映像名称。例如,指定以下映像名称以部署一个 Apache 容器映像:
docker.io/httpd:2.4
要在托管实例组中的每个虚拟机上运行单个容器,可以在定义实例模板时指定容器映像名称。如需了解详细信息,请参阅使用容器映像创建实例模板。
为高级场景创建实例
使用此方法选择特定的 Container-Optimized OS 映像,以部署多个容器,并使用 cloud-init
进行高级配置。
查看可用映像
您可以在 Google Cloud 控制台的映像列表中找到 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 控制台、gcloud CLI 或 API 创建实例。
控制台
要运行安装了 Container-Optimized OS 和 Docker 的 Compute Engine 实例,请执行下列步骤:
在 Google Cloud 控制台中打开 Compute Engine 实例创建页面。
为您的实例指定名称。
在容器部分中,清除将一个容器映像部署到此虚拟机实例 (Deploy a container image to this VM instance) 复选框。如果要在虚拟机上部署单个容器,那么这个选项特别有用。
在启动磁盘部分中,选择一个 Container-Optimized OS 映像。
单击创建以创建并启动实例。
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
您可以为一次性实验性实例添加 --preemptible
标志。
API
在 API 中,构造一项标准请求来创建实例,但同时包含一个 Container-Optimized OS 源映像。 例如:
POST https://compute.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/image-name' } } ] }
配置实例
在某些情况下,您可能希望在实例启动时执行额外的配置。您可以将 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
命令行标志。假设名为 filename 的 cloud-init
文件位于当前目录中,以下命令会创建 Container-Optimized OS 实例,并通过将文件的内容分配给实例元数据中的 user-data
键触发 cloud-init
:
gcloud compute instances create instance-name \ --image image-name \ --image-project cos-cloud \ --metadata-from-file user-data=filename
替换以下内容:
- instance-name:虚拟机实例的名称。
- image-name:Container-Optimized OS 映像的名称,
实例。例如
--image=cos-113-18244-85-29
。 - filename:元数据文件的名称。
创建 Container-Optimized OS 实例时,您可以设置其他元数据标志。由于这些属性是简单的键值对,因此您可以在 gcloud compute instances create
命令中使用 --metadata
标志来创建属性。此外,从里程碑 97 开始,您可以使用 gcloud compute project-info add-metadata
命令中的 --metadata
标志在项目元数据中设置元数据标志。在实例级定义的标志优先于在项目级定义的标志。
您可以扩展上一个示例,以收集使用情况统计信息和 使用以下命令收集崩溃转储:
gcloud compute instances create instance-name \ --image image-name \ --image-project cos-cloud \ --metadata-from-file user-data=filename \ --metadata=cos-metrics-enabled=true
其他元数据标志
元数据键 | 说明 | 默认行为 |
---|---|---|
cos-update-strategy |
指定自动更新行为。值可以是 update_enabled 、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
元数据键通过元数据服务器指定启动脚本。您可以使用
Google Cloud CLI、API 或 Google Cloud 控制台
启动脚本。有关详细信息,请参阅运行启动脚本。
时间同步
在里程碑 85 之前,Container-Optimized OS 使用 systemd
的 systemd-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
实例元数据键设置为 update_enabled
或
update_disabled
。例如:
gcloud compute instances create instance-name \ --image image-name \ --image-project cos-cloud \ --metadata cos-update-strategy=update_disabled
从里程碑 97 开始, 您还可以在项目元数据中停用或启用自动更新:
gcloud compute project-info add-metadata \ --metadata cos-update-strategy=update_disabled
您还可以使用 systemctl
停用正在运行的实例上的自动更新:
sudo systemctl stop update-engine sudo systemctl mask update-engine