Описание

Модуль позволяет создавать проекты в кластере Kubernetes. Проект — это изолированное окружение, в котором можно развернуть приложения.

Для чего это нужно?

Стандартный ресурс Namespace, который используется для логического разделения ресурсов в Kubernetes, не предоставляет необходимых функций, поэтому не является изолированным окружением:

  • Потребление ресурсов подами по умолчанию не ограничено;
  • Сетевое взаимодействие с другими подами по умолчанию работает из любой точки кластера;
  • Неограниченный доступ к ресурсам узла: адресное пространство, сетевое пространство, смонтированные директории хоста.

Возможности настройки пространств имен Namespace не полностью соответствуют современным требованиям к разработке. По умолчанию для Namespace не включены следующие функции:

  • Сборка логов;
  • Аудит;
  • Сканирование уязвимостей.

Функционал проектов позволяет решить эти проблемы.

Преимущества модуля

Для администраторов платформы:

  • Единообразие: Администраторы могут создавать проекты, используя один и тот же шаблон, что обеспечивает единообразие и упрощает управление.
  • Безопасность: Проекты обеспечивают изоляцию ресурсов и политик доступа между различными проектами, что поддерживает безопасное многотенантное окружение.
  • Потребление ресурсов: Администраторы могут легко устанавливать квоты на ресурсы и ограничения для каждого проекта, предотвращая избыточное использование ресурсов.

Для пользователей платформы:

  • Быстрый старт: Разработчики могут запрашивать у администраторов проекты, созданные по готовым шаблонам, что позволяет быстро начать разработку нового приложения.
  • Изоляция: Каждый проект обеспечивает изолированное окружение, где разработчики могут развертывать и тестировать свои приложения без влияния на другие проекты.

Внутренняя логика работы

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

Для создания проекта используются ресурсы:

  • ProjectTemplate — ресурс, который описывает шаблон проекта. При помощи него задается список ресурсов, которые будут созданы в проекте, а также схема параметров, которые можно передать при создании проекта;
  • Project — ресурс, который описывает конкретный проект.

При создании ресурса Project из определенного ProjectTemplate происходит следующее:

  1. Переданные параметры валидируются по OpenAPI-спецификации (параметр openAPI ресурса ProjectTemplate);
  2. Выполняется рендеринг шаблона для ресурсов с помощью Helm. Значения для рендеринга берутся из параметра parameters ресурса Project;
  3. Cоздается Namespace с именем, которое совпадает c именем Project;
  4. По очереди создаются все ресурсы, описанные в шаблоне.

Внимание! При изменении шаблона проекта, все созданные проекты будут обновлены в соответствии с новым шаблоном.

Изоляция проекта

В основе проекта используется механизм изоляции ресурсов в рамках пространства имен (Namespace). Пространства имен позволяют группировать поды, сервисы, секреты и другие объекты, но не обеспечивают полноценной изоляции. Проект расширяет функциональность пространств имен, предлагая дополнительные инструменты для повышения уровня контроля и безопасности. Для управления уровнем изоляции проекта можно использовать возможности Kubernetes, например:

  • Ресурсы контроля доступа (AuthorizationRule / RoleBinding) — позволяют управлять взаимодействием объектов внутри Namespace. Вы можете задавать правила и назначать роли, чтобы точно контролировать, кто и что может делать в вашем проекте.
  • Ресурсы контроля использования нагрузки (ResourceQuota) — с их помощью можно задать лимиты на использование процессорного времени (CPU), оперативной памяти (RAM), а также количества объектов внутри Namespace. Это помогает избежать чрезмерной нагрузки и обеспечивает мониторинг за приложениями в рамках проекта.
  • Ресурсы контроля сетевой связности (NetworkPolicy) — управляют входящим и исходящим сетевым трафиком в Namespace. Таким образом, можно настроить разрешенные подключения между подами, улучшить безопасность и управляемость сетевого взаимодействия в рамках проекта.

Эти инструменты можно комбинировать, чтобы настроить проект в соответствии с требованиями вашего приложения.