Отправка образа Docker в Реестр контейнеров Google из контейнера, запущенного в GKE - PullRequest
1 голос
/ 09 ноября 2019

У меня есть проект GCP. Там я использую GKE с работающим контейнером Teamcity. Этот контейнер Teamcity является моим сервером сборки и местом, где я выполняю свои шаги / сценарии сборки.

Один из шагов сборки хочет отправить образ докера в Реестр контейнеров Google. При этом происходит ошибка из-за этой ошибки:

denied: Token exchange failed for project 'coopr-mod'. Caller does not have permission 'storage.buckets.create'. To configure permissions, follow instructions at: https://cloud.google.com/container-registry/docs/access-control

Я прочитал упомянутые ссылки на инструкции, но просто не могу найти способ решения проблемы в моем случае.

Для завершенияНастоящим я записываю выполняемые шаги сборки:

Шаг 1 :

# Create environment variable for correct distribution
export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"

# Add the Cloud SDK distribution URI as a package source
echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list

# Import the Google Cloud Platform public key
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

# Update the package list and install the Cloud SDK
sudo apt-get -y update && sudo apt-get -y install google-cloud-sdk

Шаг 2 :

gcloud --quiet auth configure-docker

Шаг 3 : `docker build myimage: 1

Шаг 4 : docker tag myimage:1 eu.gcr.io/my-project/myimage:1

Шаг 5 : (Неудачный шаг) docker push eu.gcr.io/coopr-mod/myimage:1

Результаты :

denied: Token exchange failed for project 'coopr-mod'. Caller does not have permission 'storage.buckets.create'. To configure permissions, follow instructions at: https://cloud.google.com/container-registry/docs/access-control

Я читал о предоставлении разрешения GKE read-write для Google Storage, но могуне найти руководство, где говорится, «как» это сделать.

1 Ответ

4 голосов
/ 09 ноября 2019

Имеется приличная документация о том, как передавать и извлекать изображения с помощью GCR и GKE. Кроме того, этот ответ является аналогичным ответом для обычных экземпляров GCE.

Предполагая, что ваш пул узлов настроен с экземплярами с использованием учетной записи GCE по умолчанию, это простой вопрос настройки пула с помощьюread-write область доступа при создании пула.

Несколько способов сделать это:

  • Когда вы создаете пул узлов с помощью gcloud, укажите (дополнительно) --scopes https://www.googleapis.com/auth/devstorage.read_write (Кроме того, вы можете включить «все области», используя это значение: https://www.googleapis.com/auth/cloud-platform, но это исключительно допустимо)
  • В консоли при настройке пула узлов выберите область действия специально (по умолчанию это только чтение) или выберите «все области», например:

setting in edit node pool page

... пропущено множество вариантов выбора области действия ...

correct setting for storage scope

Если по какой-либо причине вы не можете просто разорвать пул узлов, инструкции о том, как перенести задания на новый тип компьютера должен работать для вас (в этом случае, «новый тип машины» простоs новые права доступа). Основные шаги:

  • Создание нового пула узлов
  • Отключение (пометить как невыполнимый) существующий пул узлов (и отключение существующих заданий)
  • Дождитесь миграции заданий
  • Удалите существующий пул узлов

Тем не менее, может имеет смысл пойти немного дальше и использоватьвыделенная служебная учетная запись (и ключ) для отправки изображений, если вы не хотите, чтобы какой-либо модуль в вашем кластере имел такой доступ. Аналогично, это не потребует уничтожения и воссоздания пула узлов.

Это приличная сумма, более сложная, но шаги будут примерно такими:

  • Создайте учетную запись IAM, которая имеетнеобходимую роль (возможно, «Администратор хранилища объектов» - но вам понадобится возможность создать контейнер при первом нажатии 1055 *).
  • Создание ключа для этой учетной записи IAM.
  • Развертывание файла ключа вместе с заданием (предположительно, с помощью секрета GKE)
  • Проверка подлинности в докере с файлом ключа :

cat keyfile.json | docker login -u _json_key --password-stdin https://eu.gcr.io

(или как вам подходит правильное имя хоста хранилища GCR)

...