Не удается предоставить доступ GCR только для чтения к экземпляру GCE

У меня есть:

  • учетная запись службы
  • экземпляр GCE, использующий эту учетную запись службы
  • изображение контейнера загружено в GCR

Кажется, я не могу предоставить этому экземпляру доступ GCR только для чтения. Все ресурсы находятся в одном проекте. Я попытался предоставить роли storage.admin и storage.objectViewer учетной записи службы, и в каждом случае доступ к реестру контейнеров приводит к https://eu.gcr.io/v2/<project>/<image>/manifests/latest: 401 Unauthorized.

Во всей документации, которую я прочитал, говорится, что мне нужны storage-rw область и storage.objectViewer, предоставленные в ведре для GCR в этом регионе, и все они у меня есть.

Все это настраиваю с помощью Terraform. Как вы настроили доступ GCR к учетной записи службы с помощью Terraform?

Вот мой код:

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}",
  ]
}



Ответы (1)


Да, это оказалось совсем другим.

Для дальнейшей отладки я использовал curl и gsutil из вычислительного экземпляра и обнаружил, что могу получить доступ к базовым сегментам.

Я использую k3s на задействованном экземпляре, и это необходимо явно настроить для использования учетной записи службы для аутентификации в GCR (даже если вычислительный экземпляр работает под той же учетной записью службы, это все еще необходимо) .

Таким образом, kubectl create secret docker-registry ..., за которым следует установка imagePullSecrets для учетной записи службы (kubernetes), которую я использую, исправил это. Подробнее об этом здесь.

person Jonny    schedule 16.09.2019