Аутентифицироваться в Container Registry
Перед началом работы с Container Registry, необходимо аутентифицироваться для соответствующего интерфейса:
- Для Консоли управления минимально необходимая роль на каталог —
viewer
. - Для Docker CLI или Yandex Managed Service for Kubernetes минимально необходимая роль на реестр или репозиторий —
container-registry.images.puller
.
Назначьте нужную роль пользователю Yandex Cloud или сервисному аккаунту. Ознакомьтесь со способами аутентификации и выберите подходящий.
Подробнее про роли читайте в разделе Управление доступом в Container Registry.
Способы аутентификации
Вы можете аутентифицироваться:
-
Как пользователь:
- С помощью OAuth-токена (срок жизни год).
- С помощью Yandex Identity and Access Management-токена (срок жизни не больше 12 часов).
-
Как сервисный аккаунт:
- С помощью авторизованных ключей (неограниченный срок жизни).
- С помощью Identity and Access Management-токена (срок жизни не больше 12 часов).
- С помощью секрета сервисного аккаунта внешнего кластера Kubernetes или внешней группы узлов, которыми управляет Managed Service for Kubernetes.
-
С помощью хранилища учетных данных Docker Credential helper.
Команда для аутентификации выглядит следующим образом:
docker login \
--username <тип_токена> \
--password <токен> \
cr.yandex
Где:
--username
— тип токена. Допустимые значения:oauth
,iam
илиjson_key
.--password
— тело токена.cr.yandex
— эндпоинт, к которому будет обращаться Docker при работе с реестром образов. Если его не указать, запрос пойдет в сервис по умолчанию — Docker Hub .
Аутентифицироваться как пользователь
Аутентификация с помощью OAuth-токена
Примечание
Срок жизни OAuth-токена 1 год. После этого необходимо получить новый OAuth-токен
-
Если у вас еще нет OAuth-токена, получите его по ссылке
. -
Выполните команду:
docker login \ --username oauth \ --password <OAuth-токен> \ cr.yandex
Аутентификация с помощью Identity and Access Management-токена
Примечание
У IAM-токена короткое время жизни — не больше 12 часов. Поэтому такой способ подойдет для приложений, которые будут запрашивать IAM-токен автоматически.
-
Выполните команду:
docker login \ --username iam \ --password <IAM-токен> \ cr.yandex
Аутентифицироваться как сервисный аккаунт
Аутентификация с помощью авторизованных ключей
Примечание
Срок жизни авторизованных ключей неограничен, но вы всегда можете получить новые авторизованные ключи и повторить процедуру аутентификации, если что-то пошло не так.
Ваши программы могут получать доступ к ресурсам Yandex Cloud с помощью сервисных аккаунтов. Получите файл с авторизованными ключами для вашего сервисного аккаунта, используя Yandex Cloud CLI.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
-
Получите и сохраните в файл
key.json
авторизованные ключи для вашего сервисного аккаунта:yc iam key create --service-account-name default-sa -o key.json
Результат:
id: aje8a87g4eaj******** service_account_id: aje3932acde3******** created_at: "2019-05-31T16:56:47Z" key_algorithm: RSA_2048
-
Выполните команду:
cat key.json | docker login \ --username json_key \ --password-stdin \ cr.yandex
Где:
- Команда
cat key.json
записывает содержимое файла с ключом в поток вывода. - Флаг
--password-stdin
позволяет читать пароль из потока ввода.
Результат:
Login Succeeded
- Команда
Аутентификация с помощью Identity and Access Management-токена
Примечание
У IAM-токена короткое время жизни — не больше 12 часов. Поэтому такой способ подойдет для приложений, которые будут запрашивать IAM-токен автоматически.
-
Выполните команду:
docker login \ --username iam \ --password <IAM-токен> \ cr.yandex
Аутентификация с помощью секрета Kubernetes
Примечание
Эта инструкция применима только к внешним кластерам Kubernetes, а также к внешним узлам, которыми управляет Managed Service for Kubernetes.
Чтобы узел, размещенный в Yandex Compute Cloud, смог пройти аутентификацию, назначьте роль container-registry.images.puller
сервисному аккаунту этого узла.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
Ресурсы Kubernetes могут получать доступ к объектам Container Registry с помощью секретов Kubernetes, создаваемых на основе ключей сервисных аккаунтов.
Чтобы подготовить такой секрет:
-
Получите и сохраните в файл
key.json
авторизованный ключ для вашего сервисного аккаунта:yc iam key create --service-account-name <имя_сервисного_аккаунта> -o key.json
-
Выполните команду аутентификации:
cat key.json | docker login \ --username json_key \ --password-stdin \ cr.yandex
Результат:
Login Succeeded
В случае ошибок см. раздел Решение проблем в Container Registry.
-
Убедитесь, что полученный ключ имеет нужный формат. Для этого откройте конфигурационный файл Docker:
cat $HOME/.docker/config.json
Результат:
{ "auths": { "cr.yandex": { "auth": "anNvbl9rZXk ... tXG4iCn0=" } } }
Примечание
Ранее настроенный доступ к Docker может препятствовать получению ключа в нужном формате. Чтобы получить корректный ключ, отключите Credential helper или удалите уже существующий файл
$HOME/.docker/config.json
. -
Создайте секрет в вашем кластере Kubernetes:
kubectl create secret generic <имя_секрета> \ --namespace=<пространство_имен> \ --from-file=.dockerconfigjson=$HOME/.docker/config.json \ --type=kubernetes.io/dockerconfigjson
В качестве пространства имен можно указать, например,
kube-system
. Managed Service for Kubernetes использует это пространство имен после создания группы узлов. -
Используйте секрет для создания подов или контроллеров Deployment, например:
--- apiVersion: v1 kind: Pod metadata: name: <имя_пода> namespace: <пространство_имен> spec: containers: - name: <имя_вашего_контейнера> image: <имя_образа_в_контейнере> imagePullSecrets: - name: <имя_секрета>
При создании секретов и подов указывайте для них одинаковое пространство имен в параметре
namespace
. Иначе возникнет ошибка аутентификации.
Подробнее см. в документации Kubernetes
Аутентифицироваться с помощью Docker Credential helper
Docker Engine может хранить учетные данные пользователя во внешнем хранилище. Это безопаснее, чем хранить их в конфигурационном файле Docker. Чтобы использовать хранилище учетных данных, необходима внешняя программа — Docker Credential helper
В состав Yandex Cloud CLI входит утилита docker-credential-yc
, которая выступает в роли Docker Credential helper для Yandex Cloud. Она хранит учетные данные пользователя и позволяет работать с приватными реестрами Yandex Cloud, не выполняя команду docker login
. Этот способ аутентификации поддерживает использование от имени пользователя и от имени сервисного аккаунта.
Настройка Credential helper
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Сконфигурируйте Docker для использования
docker-credential-yc
:yc container registry configure-docker
Результат:
Credential helper is configured in '/home/<user>/.docker/config.json'
Настройки сохраняются в профиле текущего пользователя.
Важно
Credential helper работает только при использовании Docker без
sudo
. О том, как настроить запуск Docker от имени текущего пользователя без использованияsudo
читайте в официальной документации . -
Проверьте, что Docker сконфигурирован.
В конфигурационном файле
${HOME}/.docker/config.json
должна появиться строка:"cr.yandex": "yc"
-
Docker готов к использованию, например, для загрузки Docker-образов.
Дополнительные опции Credential helper
Использовать Credential helper для другого профиля Yandex Cloud CLI
Вы можете использовать Credential helper для другого профиля, не переключая текущий, с помощью команды:
yc container registry configure-docker --profile <имя_профиля>
Подробнее об управлении профилями читайте в пошаговых инструкциях Yandex Cloud CLI.
Не использовать Credential helper
Чтобы не использовать Credential helper при аутентификации, удалите в конфигурационном файле ${HOME}/.docker/config.json
из блока credHelpers
строку домена cr.yandex
.