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

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

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

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

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

Ограничения

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

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

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

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

    Пример создания проекта с помощью Project из default ProjectTemplate представлен ниже:

    apiVersion: deckhouse.io/v1alpha2
    kind: Project
    metadata:
      name: my-project
    spec:
      description: This is an example from the Deckhouse documentation.
      projectTemplateName: default
      parameters:
        resourceQuota:
          requests:
            cpu: 5
            memory: 5Gi
            storage: 1Gi
          limits:
            cpu: 5
            memory: 5Gi
        networkPolicy: Isolated
        podSecurityProfile: Restricted
        extendedMonitoringEnabled: true
        administrators:
        - subject: Group
          name: k8s-admins
    
  3. Для проверки статуса проекта выполните команду:

    d8 k get projects my-project
    

    Успешно созданный проект должен отображаться в статусе Deployed (синхронизирован). Если отображается статус Error (ошибка), добавьте аргумент -o yaml к команде (например, d8 k get projects my-project -o yaml) для получения более подробной информации о причине ошибки.

Автоматическое создание проекта для пространства имён

Для пространства имён возможно создать новый проект. Для этого пометьте пространство имён аннотацией projects.deckhouse.io/adopt. Например:

  1. Создайте новое пространство имён:

    d8 k create ns test
    
  2. Пометьте его аннотацией:

    d8 k annotate ns test projects.deckhouse.io/adopt=""
    
  3. Убедитесь, что проект создался:

    d8 k get projects
    

    В списке проектов появится новый проект, соответствующий пространству имён:

    NAME        STATE      PROJECT TEMPLATE   DESCRIPTION                                            AGE
    deckhouse   Deployed   virtual            This is a virtual project                              181d
    default     Deployed   virtual            This is a virtual project                              181d
    test        Deployed   empty                                                                     1m
    

Шаблон созданного проекта можно изменить на существующий.

Обратите внимание, что при смене шаблона может возникнуть конфликт ресурсов: если в чарте шаблона прописаны ресурсы, которые уже присутствуют в пространстве имён, то применить шаблон не получится.

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