是否可以在不实际部署映像的情况下在 GCE 上配置容器优化的 OS VM?
Posted
技术标签:
【中文标题】是否可以在不实际部署映像的情况下在 GCE 上配置容器优化的 OS VM?【英文标题】:Is it possible to provision a container-optimised OS VM on GCE without actually deploying an image? 【发布时间】:2021-12-21 09:54:59 【问题描述】:我想构建一个 CI 管道,其中基础设施阶段使用 Terraform 在 Google Compute Engine 上提供一个容器优化的操作系统实例在将 Docker 化的应用程序上传到 Artifact Registry 并首次部署之前.
我的 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
我从 Artifact Registry 部署最新版本映像的命令:
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
中的图像将被部署,而不是我的应用程序的图像。
【问题讨论】:
【参考方案1】:需要明确的是,容器优化操作系统用于运行 Docker 容器,这意味着您的 VM 实例被创建为 Docker 容器,并且您的容器化应用程序将在其上运行,如以下文档中所述 [1 ].
现在,gce-container-declaration
参数是容器的清单,您可以在其中指定容器化应用程序所需的所有参数(包括图像)。
使用您的应用程序映像路径作为 --container-image 标志运行命令 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
标志,VM 实例就不再作为容器创建,而只是一个普通的VM;因此错误。
当两者都可以并行完成时,我不明白为什么要创建 VM 实例以便稍后部署应用程序,而实际上提供的 terraform 代码就是这样工作的。
[1]https://cloud.google.com/container-optimized-os/docs/concepts/features-and-benefits
【讨论】:
感谢您的回答。我希望能够将我的(容器化)应用程序部署与我的基础设施配置分离。这感觉像是对 GCP 的合理要求。此外,我可能想要部署一个标记有特定 SemVer 编号的图像,而不是每次都使用latest
,以便更明确地了解哪些版本的应用程序代码/库正在运行。对我来说,我的 Terraform 代码应该不知道正在运行的应用程序版本。
Google Cloud Platform 中有几个选项可以让您准确地做到这一点。在这里,您可以查看无服务器计算选项 [1],或者对于更复杂的部署,您可以查看 GKE(Google Kubernetes Engine)服务,该服务允许您以极大的灵活性部署容器化应用程序,如你想要[2]。在这两个选项中,Google 都会在后台进行基础架构配置,并与您的 GCE(计算引擎)基础架构分开。 [1] cloud.google.com/serverless [2] cloud.google.com/kubernetes-engine
我不想使用 Kubernetes 或某种无服务器抽象。我只想提供一个具有容器优化操作系统的 GCE 实例,而 实际上不必指定容器映像。对 GCP 的期望并不是一件疯狂的事情,但也许我错了。以上是关于是否可以在不实际部署映像的情况下在 GCE 上配置容器优化的 OS VM?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在不安装 Python 的情况下在 Windows 上安装 Robot Framework?
是否可以在不使用类变量的情况下在运行时在实例上创建 pyqtSignals?
是否可以在不使用继承的情况下在viewDidAppear上调用某些代码