是否可以在GCE上提供容器优化的操作系统虚拟机,而无需实际部署映像



我想建立一个CI管道,在Dockerized应用程序上传到Artifact Registry并首次部署之前,基础设施阶段在谷歌计算引擎上为Terraform提供一个容器优化的操作系统实例。

我的Terraform配置:

data "google_compute_image" "cos" {
family  = "cos-stable"
project = "cos-cloud"
}
resource "google_compute_instance" "container_optimized_os_vm" {
name                      = "container-optimized-os-vm"
machine_type              = "f1-micro"
allow_stopping_for_update = true
network_interface {
network = "default"
}
boot_disk {
initialize_params {
image = data.google_compute_image.cos.self_link
}
}
metadata = {
google-logging-enabled = "true"
gce-container-declaration =<<EOT
spec:
containers:
- image: image-repository/image-name:latest
name: containervm
securityContext:
privileged: false
stdin: false
tty: false
volumeMounts: []
restartPolicy: Always
volumes: []
EOT
}
}

我的命令部署我的图像的最新版本从工件注册表:

gcloud compute instances update-container container-optimized-os-vm 
--zone europe-west2-b 
--container-image "europe-west2-docker.pkg.dev/my-project-id/my-image-repository-name/my-image-name:latest"

当我省略gce-container-declaration元数据时,我会得到以下错误:

ERROR: (gcloud.compute.instances.update-container) Instance doesn't have gce-container-declaration metadata key - it is not a container.

我希望能够在不指定gce-container-declaration中的映像的情况下提供实例——这可能吗?我担心的是,当检测到基础结构更改时,gce-container-declaration中的映像将被部署,而不是我的应用程序的映像。

需要明确的是,容器优化的操作系统用于运行Docker容器,这意味着您的VM实例被创建为Docker容器并且您的容器化应用程序将在其上运行,如以下文档[1]所述。

现在,gce-container-declaration参数是容器的清单,您可以在其中指定容器化应用程序(包括映像(所需的所有参数。

在应用程序映像路径为--container映像标志的情况下运行命令gcloud compute instances update-container,只会将部署的原始容器映像从image-repository/image-name:latest更改为europe-west2-docker.pkg.dev/my-project-id/my-image-repository-name/my-image-name:latest,这与您最初可以指定的相同:

metadata = {
google-logging-enabled = "true"
gce-container-declaration =<<EOT
spec:
containers:
- image: europe-west2-docker.pkg.dev/my-project-id/my-image-repository-name/my-image-name:latest
name: containervm
securityContext:
privileged: false
stdin: false
tty: false
volumeMounts: []
restartPolicy: Always
volumes: []
EOT
}

你得到的错误是因为一旦你去掉gce-container-declaration标志,虚拟机实例就不再是一个容器,而是一个普通的虚拟机;从而产生误差。

我不明白你为什么要创建虚拟机实例来稍后部署你的应用程序,因为两者都可以并行完成,而且实际上提供的地形代码是这样工作的。

[1]https://cloud.google.com/container-optimized-os/docs/concepts/features-and-benefits

相关内容

最新更新