是否可以在不实际部署映像的情况下在 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?的主要内容,如果未能解决你的问题,请参考以下文章

GCE 未正确部署 GCR 映像

是否可以在不安装 Python 的情况下在 Windows 上安装 Robot Framework?

是否可以在不使用类变量的情况下在运行时在实例上创建 pyqtSignals?

是否可以在不使用继承的情况下在viewDidAppear上调用某些代码

是否可以在不使背景变暗的情况下在 iPad 上呈现模态视图控制器?

是否可以在不显示/添加视图的情况下在 iOS 上播放 YouTube 视频,同时仍遵守 YouTube 的服务条款?