【问题标题】:Automatically deploy new container to Google Cloud Compute Engine from Google Container Registry从 Google Container Registry 自动将新容器部署到 Google Cloud Compute Engine
【发布时间】:2021-12-22 19:06:01
【问题描述】:

我有一个 docker 容器,我像gcloud builds submit --tag gcr.io/<project-id>/<name> 一样将它推送到 GCR,当我在 GCE 实例上部署它时,每次部署它都会创建一个新实例,我必须手动删除旧实例。问题是,有没有办法部署容器并强制 GCE 实例获取新容器?我需要 GCE,而不是 Google Cloud Run 或其他,因为它不是 HTTP 服务。

我使用 Deploy to Cloud Run 按钮从 Google 控制台部署容器

【问题讨论】:

  • 部署应该是原子的。更新当前 VM 以使用新映像并不是一个好的做法。相反,您应该使用托管实例组通过更新实例模板将旧虚拟机替换为新虚拟机。
  • 您必须创建一个新的 VM 并删除另一个。您可以编写一个 Cloudbuild.yaml 文件,在每次 CI/CD 管道运行时为您执行此操作
  • 您需要在 GCE 上编写一个小型应用程序,以订阅 Cloud Build 创建的 Pub/Sub 通知。然后,您可以拉取新容器或启动新实例。你的问题不清楚你想做什么。 cloud.google.com/build/docs/subscribe-build-notifications
  • @JohnHanley,我正在尝试做类似 CI\CD 部署的事情。在 Gitlab 中,我习惯于通过 ssh 告诉我的服务器构建一个新图像并开始运行它。在这里,我想要类似的东西,推送新图像,并使实例构建它,然后运行。在我们的例子中,镜像已经构建好了,所以我们只需要运行它,但是它运行在一个新的实例中......
  • 您可以创建一个 Cloud Build 步骤,使用 gcloud compute ssh --tunnel-through-iap 连接到 Compute Engine 实例,然后运行命令。您需要为 cloudbuild 服务帐户授予必要的角色(roles/compute.instanceAdmin.v1、roles/compute.viewer、roles/iam.serviceAccountUser、roles/iap.tunnelResourceAccessor)。这将适用于拉一个新容器。我不确定是否要从 Cloud Build 创建新的 VM 实例、配置实例并拉取新容器。我不知道你为什么要拉一个新容器然后创建一个新实例。

标签: docker google-cloud-platform google-container-registry


【解决方案1】:

我发布此Community Wiki 以提高知名度。在评论部分已经有一些好的解决方案,但最后 OP 想使用Cloud Run

首先我想澄清一些事情。

我有一个 docker 容器,我将它推送到 GCR,例如 gcloud builds submit

gcloud builds submit 是使用 Google 构建的命令Cloud Build

Cloud Build 是一项服务,可在 Google Cloud Platform 基础架构上执行您的构建。 Cloud Build 可以从 Cloud Storage、Cloud Source Repositories、GitHub 或 Bitbucket 导入源代码,按照您的规范执行构建,并生成 Docker 容器或 Java 档案等工件。

在这个问题中,OP 指的是Container Registry,但GCP 建议使用Artifact Registry,它将很快取代Container Registry

Pushing and pulling images 文档中解释了从 Artifact Registry 推送和拉取图像。可以通过docker pushdocker pull 命令完成,之前您必须标记图像并创建Artifact Registry

在不同的 GCP 产品上部署

关于在GCEGKECloud Run 上的部署,这些都是GCP 产品,它们各自有很大的不同。

GCEIaaS,您可以在其中指定资源数量并维护所有软件的所有安装(您需要安装 Docker、Kubernetes、编程库等)。

GKE 就像Hybrid 一样,因为您提到了您需要的资源数量,但它是为在其上运行容器而定制的。创建后,您已经拥有 docker、kubernetes 和在其上运行容器所需的其他软件。

Cloud Run 是一个无服务器 GCP 产品,您无需计算所需资源的数量、安装软件/库,它是一个完全托管的无服务器平台。

当您想要从 Artifact Registry / Container Registry 部署容器应用程序时,您正在创建另一个 VM(GCE 和 GKE)或新服务(Cloud Run)。

如果您想在同一个虚拟机上部署新应用:

  • 在 GCE 上,您需要使用 Docker 或 Kubernetes (Kubeadm) 提取映像并将其部署在该 VM 上。
  • 在 GKE 上,您需要使用类似命令部署新的 deployment
kubectl create deployment test --image=<location>-docker.pkg.dev/<projectname>/<artifactRegistryName>/<imageName>

并删除旧的。

Cloud Run 中,您可以部署应用程序而不用担心资源或硬件,这些步骤在here 中描述。您可以为图像中的特定更改创建revisions。然而Cloud Run 也允许使用GitHubBitBucketCloud Source Repositories 的CI/CD。这个过程在 GCP 文档中也有很好的描述 - Continuous deployment

可能的解决方案:

  • 编写一个 Cloudbuild.yaml 文件,在每次 CI/CD 管道运行时为您执行此操作
  • 在 GCE 上编写一个订阅 Cloud Build 创建的 Pub/Sub 通知的小应用程序。然后,您可以拉取新容器或启动新实例。
  • Cloud RunCI/CD 一起使用。

基于 OP 的 cmets 之一,选择的解决方案是使用 Cloud RunCI/CD

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-03
    • 2017-01-08
    • 2020-01-15
    • 2016-06-05
    • 2018-02-14
    • 2020-09-11
    • 1970-01-01
    • 2020-10-03
    相关资源
    最近更新 更多