【问题标题】:Deploy multiple Cloudrun service with same dockerimage使用相同的 docker 映像部署多个 Cloud Run 服务
【发布时间】:2021-12-05 13:27:28
【问题描述】:

有超过 25 个 Cloudrun 服务使用相同的 docker 镜像(来自 GCR),但配置了不同的变量。使用来自任何类型传入事件的最新容器映像部署所有服务的简单且可靠的方法是什么? 目前使用下面的CLI命令手动一一执行。有没有什么自动化的方式来实现所有服务一个接一个或者并行的自动部署。

gcloud run deploy SERVICE --image IMAGE_URL

Addn:标签用于标记具有相同容器图像的25个容器。不需要每次都从源代码构建 docker 映像。可以使用相同的图像。

【问题讨论】:

  • 命令行解决方案面临哪些瓶颈或问题?
  • 使用 Cloud Build。添加一个步骤以部署到每个 Cloud Run 服务。那么每次构建容器时,都会自动部署容器。
  • @tmarwen 这需要在没有人工干预的情况下触发,以便在某些触发器上部署所有容器。
  • @JohnHanley 使用 Cloudrun 中可用的自动部署,每次使用 CloudBuild 创建新映像。它需要在多个服务中部署单个图像。
  • 我不明白你的评论。 Cloud Build 可以将相同容器映像部署到任意数量的 Cloud Run 服务。我指的不是 Cloud Build 与 Cloud Run GUI 的集成。我的意思是你可以编写一个 Cloud Build 配置来在构建时部署你的容器镜像。

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


【解决方案1】:
推荐的答案 Google Cloud

如果您可以选择 Terraform,您可以使用 countfor_each 元参数自动部署所有 Cloud Run 服务:

count 如果您需要与索引相同的服务名称

provider "google" {
    project = "MY-PROJECT-ID"
}

resource "google_cloud_run_service" "default" {
    count    = 25
    name     = "MY-SERVICE-${count.index}"
    location = "MY-REGION"

    metadata {
      annotations = {
        "run.googleapis.com/client-name" = "terraform"
      }
    }

    template {
      spec {
        containers {
          image = "IMAGE_URL"
        }
      }
    }
 }

 data "google_iam_policy" "noauth" {
   binding {
     role = "roles/run.invoker"
     members = ["allUsers"]
   }
 }

 resource "google_cloud_run_service_iam_policy" "noauth" {
   for_each    = google_cloud_run_service.default
   location    = each.value.location
   project     = each.value.project
   service     = each.value.name

   policy_data = data.google_iam_policy.noauth.policy_data
 }

其中MY-PROJECT-IDMY-REGION 需要替换为您的项目特定值。

for_each 如果您需要不同的服务名称

provider "google" {
    project = "MY-PROJECT-ID"
}

resource "google_cloud_run_service" "default" {
    for_each = toset( ["Service 1", "Service 2", "Service 25"] )
    name     = each.key
    location = "MY-REGION"

    metadata {
      annotations = {
        "run.googleapis.com/client-name" = "terraform"
      }
    }

    template {
      spec {
        containers {
          image = "IMAGE_URL"
        }
      }
    }
 }

 data "google_iam_policy" "noauth" {
   binding {
     role = "roles/run.invoker"
     members = ["allUsers"]
   }
 }

 resource "google_cloud_run_service_iam_policy" "noauth" {
   for_each    = google_cloud_run_service.default
   location    = each.value.location
   project     = each.value.project
   service     = each.value.name

   policy_data = data.google_iam_policy.noauth.policy_data
 }

其中MY-PROJECT-IDMY-REGION 也需要替换为您的项目特定值。

Terraform的使用详情可以参考官方GCP Cloud Run documentation

【讨论】:

  • 是否可以基于标签或任何其他机制进行动态库存,而不是在 terraform 代码中硬编码服务名称?
  • 同样面临这个错误pasteboard.co/MIJNB1eS1XYK.png
  • 我错过了为每个 Cloud Run 服务映射 google_cloud_run_service_iam_policy 资源。
猜你喜欢
  • 2021-05-27
  • 2021-04-29
  • 2021-05-31
  • 2018-11-12
  • 2021-10-11
  • 2021-06-07
  • 2015-10-07
  • 2020-12-24
  • 2019-10-24
相关资源
最近更新 更多