Стадия жизненного цикла модуля: Предварительная версия (preview)

У модуля есть требования для установки

Модуль обеспечивает аутентификацию и авторизацию через токены Kubernetes и RBAC на основе ресурса PayloadRepositoryAccess.

Право на получение списка доступных репозиториев (catalog) доступно для всех аутентифицированных пользователей вне зависимости от способа аутентификации.

Каждый корневой каталог в хранилище образов контейнеров соответствует имени неймспейса в Kubernetes. В случае удаления этого неймспейса все образы в этом каталоге и подкаталогах будут удалены вне зависимости от способа аутентификации.

Аутентификация с использованием токенов Kubernetes

При этом способе аутентификации используются следующие параметры:

Доступ к путям репозиториев определяется правилами 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

Авторизация с использованием токена и загрузка образа в хранилище

Чтобы авторизоваться в хранилище образов контейнеров с использованием токена, выполните следующие действия:

  1. Создайте неймспейс, к которому будут привязаны образы:

    d8 k create namespace project-1
  2. Авторизация в хранилище с использованием токена ServiceAccount:

    1. Создайте ресурс Role внутри неймспейса, в котором определите доступы (подробнее — в примере выше).

    2. Создайте ServiceAccount:

      d8 k -n project-1 create serviceaccount payload-registry-sa
    3. Привяжите его к Role с использованием RoleBinding (подробнее — в примере выше).

    4. Авторизуйтесь на своей рабочей машине в payload-registry:

      docker login payload-registry.${PUBLIC_DOMAIN} -u token --password $(d8 k -n project-1 create token payload-registry-sa)
  3. Авторизация в хранилище с использованием токена, полученного через интерфейс генерации kubeconfig (ID Token):

    1. Привяжите пользователя, под которым осуществляется доступ к, Role или ClusterRole с использованием RoleBinding или ClusterRoleBining соответственно (пример с использованием Role можно посмотреть выше).

    2. Скопируйте ID Token со страницы kubeconfig.

    3. Авторизуйтесь на своей рабочей машине в хранилище образов:

      docker login payload-registry.${PUBLIC_DOMAIN} -u token -p <ID Token>
  4. Создайте образ и присвойте ему тег:

    docker tag ubuntu:latest payload-registry.${PUBLIC_DOMAIN}/project-1/dist/ubuntu:latest
  5. Загрузите созданный образ в хранилище образов:

    docker push payload-registry.${PUBLIC_DOMAIN}/project-1/dist/ubuntu:latest
  6. Проверьте наличие образа в хранилище. Пример проверки с использованием команды crane:

    crane catalog payload-registry.${PUBLIC_DOMAIN}