【问题标题】:Cannot grant read-only GCR access to GCE instance无法授予对 GCE 实例的只读 GCR 访问权限
【发布时间】:2020-01-17 02:07:45
【问题描述】:

我有:

  • 服务帐号
  • 使用该服务的 GCE 实例 帐号
  • 上传到 GCR 的容器图像

我似乎无法授予对该实例的只读 GCR 访问权限。所有资源都在同一个项目中。我尝试将storage.adminstorage.objectViewer 角色授予服务帐户,并且在每种情况下访问容器注册表都会导致https://eu.gcr.io/v2/<project>/<image>/manifests/latest: 401 Unauthorized

我读过的所有文档都说我需要在该区域的 GCR 存储桶上授予 storage-rw 范围和 storage.objectViewer,我拥有所有这些。

我正在使用 Terraform 配置所有这些。您如何使用 Terraform 配置对服务帐户的 GCR 访问?

这是我的代码:

locals {
  gcr-region = "eu"
}

resource "google_service_account" "service_account" {
    account_id = "k3s-master"
    display_name = "k3s-master"
}

resource "google_project_iam_member" "project" {
  role    = "roles/logging.logWriter"
  member = "serviceAccount:${google_service_account.service_account.email}"
}

resource "google_compute_instance" "instance" {
    name = "${var.service_name}"
    machine_type = "f1-micro"

    allow_stopping_for_update = true

    service_account {
        email = "${google_service_account.service_account.email}"
        scopes = [
            "storage-rw",
      "https://www.googleapis.com/auth/cloud-platform",
      "https://www.googleapis.com/auth/compute",
        ]
    }

    boot_disk {
        initialize_params {
            image = "debian-9"
        }
    }

    network_interface {
        network = "${google_compute_network.k3s-network.self_link}"
        access_config { }
    }
}

resource "google_storage_bucket_iam_binding" "eu-binding" {
  bucket     = "eu.artifacts.${var.project}.appspot.com"
  role        = "roles/storage.objectViewer"

  members = [
    "serviceAccount:${google_service_account.service_account.email}",
  ]
}

resource "google_storage_bucket_iam_binding" "binding" {
  bucket     = "${var.project}.appspot.com"
  role        = "roles/storage.objectViewer"

  members = [
    "serviceAccount:${google_service_account.service_account.email}",
  ]
}

【问题讨论】:

    标签: google-compute-engine terraform google-container-registry terraform-provider-gcp


    【解决方案1】:

    没错,这完全是另外一回事。

    为了进一步调试,我使用了计算实例中的curlgsutil,发现我可以访问底层存储桶。

    我在所涉及的实例上运行k3s这需要明确配置为使用服务帐户向 GCR 进行身份验证(即使计算实例在同一个服务帐户下运行,这仍然是必需的)。

    因此,kubectl create secret docker-registry ... 然后为我正在使用的(kubernetes)服务帐户设置imagePullSecrets 修复了它。 More details about that here.

    【讨论】:

      猜你喜欢
      • 2011-04-23
      • 2014-03-06
      • 2017-04-07
      • 2021-03-16
      • 2021-02-18
      • 1970-01-01
      • 2017-03-23
      • 2016-09-05
      • 2018-11-13
      相关资源
      最近更新 更多