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

Использование проектов позволяет решить эти проблемы и имеет следующие преимущества:

  • для администраторов платформы:
    • единообразие — администраторы могут создавать проекты, используя один и тот же шаблон, что обеспечивает единообразие и упрощает управление;
    • безопасность — проекты обеспечивают изоляцию ресурсов и политик доступа между различными проектами, что поддерживает безопасное многотенантное окружение;
    • потребление ресурсов — администраторы могут легко устанавливать квоты на ресурсы и ограничения для каждого проекта, предотвращая избыточное использование ресурсов.
  • для пользователей платформы:
    • быстрый старт — разработчики могут запрашивать у администраторов проекты, созданные по готовым шаблонам, что позволяет быстро начать разработку нового приложения;
    • изоляция — каждый проект обеспечивает изолированное окружение, где разработчики могут развертывать и тестировать свои приложения без влияния на другие проекты.

Копирование секретов во все пространства имён не может использоваться совместно с проектами режима мультитенантности.

В этом режиме создаются изолированные окружения для пользователей в их проектах, а secret-copier автоматически раздаёт секреты во все пространства имён. Если в закрытом окружении пользователя окажутся чувствительные данные, это может привести к утечке данных и нарушению модели безопасности.

Ограничения

Проекты имеют ряд ограничений:

  • Создание более одного пространства имён внутри проекта не предусматривается. Если требуется несколько пространств имён, создайте отдельный проект для каждого из них.
  • Ресурсы шаблона применяются только к одному пространству имён, имя которого совпадает с именем проекта.

Шаблоны проектов

В Deckhouse Kubernetes Platform есть набор шаблонов для создания проектов:

  • default — шаблон для базовых сценариев использования проектов:
    • ограничение ресурсов;
    • сетевая изоляция;
    • автоматические алерты и сбор логов;
    • выбор профиля безопасности;
    • настройка администраторов проекта.

      Описание шаблона в GitHub.

  • secure — включает все возможности шаблона default, а также дополнительные функции:
    • настройка допустимых для проекта UID/GID;
    • правила аудита обращения Linux-пользователей проекта к ядру;
    • сканирование запускаемых образов контейнеров на наличие известных уязвимостей (CVE).

    Описание шаблона в GitHub.

  • secure-with-dedicated-nodes — включает все возможности шаблона secure, а также дополнительные функции:
    • определение селектора узла для всех подов в проекте: если под создан, селектор узла пода будет автоматически заменён на селектор узла проекта;
    • определение стандартных tolerations для всех подов в проекте: если под создан, стандартные значения tolerations добавляются к нему автоматически.

    Описание шаблона в GitHub.

Чтобы перечислить все доступные параметры для шаблона проекта, выполните команду:

d8 k get projecttemplates <ИМЯ_ШАБЛОНА_ПРОЕКТА> -o jsonpath='{.spec.parametersSchema.openAPIV3Schema}' | jq

Создание собственного шаблона для проекта

Шаблоны проектов по умолчанию включают базовые сценарии использования и служат примером возможностей шаблонов.

Для создания своего шаблона:

  1. Возьмите за основу один из шаблонов по умолчанию, например, default.
  2. Скопируйте его в отдельный файл, например, my-project-template.yaml при помощи команды:

    d8 k get projecttemplates default -o yaml > my-project-template.yaml
    
  3. Отредактируйте файл my-project-template.yaml, внесите в него необходимые изменения.

    Необходимо изменить не только шаблон, но и схему входных параметров под него.

    Шаблоны для проектов поддерживают все функции шаблонизации Helm.

  4. Измените имя шаблона в поле .metadata.name.
  5. Примените полученный шаблон командой:

    d8 k apply -f my-project-template.yaml
    
  6. Проверьте доступность нового шаблона с помощью команды:

    d8 k get projecttemplates <ИМЯ_НОВОГО_ШАБЛОНА>
    

Создание проекта

Для создания проекта используется кастомный ресурс Project с указанием имени шаблона проекта в поле .spec.projectTemplateName. В параметре .spec.parameters указывается значения параметров для секции .spec.parametersSchema.openAPIV3Schema кастомного ресурса ProjectTemplate.

Также существует возможность автоматически создать проект из существующего пространства имён в кластере.

Подробнее с созданием проектов можно ознакомиться в разделе использования.