Стадия жизненного цикла модуля: Предварительная версия (preview)
У модуля есть требования для установки
Модуль обеспечивает аутентификацию и авторизацию через токены Kubernetes и RBAC на основе ресурса PayloadRepositoryAccess.
Право на получение списка доступных репозиториев (catalog) доступно для всех аутентифицированных пользователей вне зависимости от способа аутентификации.
Каждый корневой каталог в хранилище образов контейнеров соответствует имени неймспейса в Kubernetes. В случае удаления этого неймспейса все образы в этом каталоге и подкаталогах будут удалены вне зависимости от способа аутентификации.
Аутентификация с использованием токенов Kubernetes
При этом способе аутентификации используются следующие параметры:
- имя пользователя —
token; - пароль — bearer-токен Kubernetes из projected volume (
d8 k create token) или полученный через интерфейс генерации kubeconfig (ID Token)
Доступ к путям репозиториев определяется правилами Kubernetes RBAC для ресурса PayloadRepositoryAccess.
RBAC и PayloadRepositoryAccess
При аутентификации с использованием токена Kubernetes доступ к путям репозиториев контролируется с использованием Kubernetes RBAC, применённого к виртуальным ресурсам PayloadRepositoryAccess:
- API group —
payload-registry.deckhouse.io; - имя ресурса —
payloadrepositoryaccesses(PayloadRepositoryAccess); - назначение — виртуальный ресурс только для настройки доступа к хранилищу образов с использованием Kubernetes RBAC.
Объекты PayloadRepositoryAccess не создаются в Kubernetes, а используются для выдачи прав через Role или ClusterRole на этот ресурс, для проверки доступа к путям и тегам в репозитории со стороны хранилища образов и расширения Kubernetes API.
Поле resourceNames задаёт шаблоны путей репозитория.
Возможные подстановки в шаблоне:
| Шаблон | Описание |
|---|---|
* |
Любая последовательность символов, кроме / (один сегмент пути) |
/**/ |
Ноль или более директорий (рекурсивный обход) |
? |
Ровно один символ (кроме /) в сегменте пути |
[class] |
Один символ из набора или диапазона, например, [a-z0-9] |
{alt1,alt2,...} |
Один из перечисленных вариантов через запятую |
Двойная звёздочка ** должна быть отдельным сегментом пути.
Шаблон вида /path** недействителен и обрабатывается так же, как /path*, нужный эффект даёт /path*/**.
Шаблон /path/** сопоставляется со всеми каталогами и файлами внутри path, а /path/**/ — только с каталогами.
Сопоставление путей регистронезависимое: шаблон и запрашиваемый путь приводятся к нижнему регистру перед проверкой.
Если запрошенный путь совпадает с разрешёнными resourceNames (или resourceNames отсутствует) и совпадает уровень доступа (verb) — доступ разрешается.
Уровни доступа (verbs)
| Verb | Операция в хранилище образов |
|---|---|
get |
Pull образа и получение информации теге через расширение Kubernetes API |
list |
Получение списка тегов в репозиториях неймспейса через расширение Kubernetes API |
create |
Push образа |
delete |
Удаление образа, в том числе через расширение Kubernetes API |
Пример конфигурации RBAC
Пример конфигурации RBAC с выдачей ServiceAccount полного доступа (включая получение и удаление тегов через расширение Kubernetes API) к репозиториям в неймспейсе project-1:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: payload-registry-full
namespace: project-1
rules:
- apiGroups: ["payload-registry.deckhouse.io"]
resources: ["payloadrepositoryaccesses"]
resourceNames:
- "dist/*"
- "app/**"
verbs: ["get", "list", "create", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: payload-registry-read
namespace: project-1
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: payload-registry-full
subjects:
- kind: ServiceAccount
name: payload-registry-sa
namespace: project-1Авторизация с использованием токена и загрузка образа в хранилище
Чтобы авторизоваться в хранилище образов контейнеров с использованием токена, выполните следующие действия:
-
Создайте неймспейс, к которому будут привязаны образы:
d8 k create namespace project-1 -
Авторизация в хранилище с использованием токена ServiceAccount:
-
Создайте ресурс Role внутри неймспейса, в котором определите доступы (подробнее — в примере выше).
-
Создайте ServiceAccount:
d8 k -n project-1 create serviceaccount payload-registry-sa -
Привяжите его к Role с использованием RoleBinding (подробнее — в примере выше).
-
Авторизуйтесь на своей рабочей машине в
payload-registry:docker login payload-registry.${PUBLIC_DOMAIN} -u token --password $(d8 k -n project-1 create token payload-registry-sa)
-
-
Авторизация в хранилище с использованием токена, полученного через интерфейс генерации kubeconfig (ID Token):
-
Привяжите пользователя, под которым осуществляется доступ к, Role или ClusterRole с использованием RoleBinding или ClusterRoleBining соответственно (пример с использованием Role можно посмотреть выше).
-
Скопируйте
ID Tokenсо страницы kubeconfig. -
Авторизуйтесь на своей рабочей машине в хранилище образов:
docker login payload-registry.${PUBLIC_DOMAIN} -u token -p <ID Token>
-
-
Создайте образ и присвойте ему тег:
docker tag ubuntu:latest payload-registry.${PUBLIC_DOMAIN}/project-1/dist/ubuntu:latest -
Загрузите созданный образ в хранилище образов:
docker push payload-registry.${PUBLIC_DOMAIN}/project-1/dist/ubuntu:latest -
Проверьте наличие образа в хранилище. Пример проверки с использованием команды
crane:crane catalog payload-registry.${PUBLIC_DOMAIN}