我想建立一个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