Подготовка проекта и пространств имен команды
Этот рецепт покажет, как создать проект team-alpha, а внутри него два пространства имен: team-alpha-dev — для разработки и team-alpha-prod — для промышленной эксплуатации. Также вы узнаете об ограничениях, которые определяют, как именовать и размещать ресурсы команды.
Ресурсная модель Stackland
Прежде чем переходить к созданию проекта, мы покажем, что он из себя представляет и где находится в общей модели ресурсов. Stackland использует трехуровневую иерархию:
|
Уровень |
Описание |
Пример |
|
Кластер (Cluster) |
Корневая сущность. Управление узлами, компонентами, федерациями |
Весь кластер Stackland |
|
Проект (Project) |
Логическая группировка пространств имен для команды или приложения |
|
|
Пространство имен (Namespace) |
Стандартная единица изоляции ресурсов Kubernetes® |
|
Проект объединяет несколько пространств имен под единым управлением. Это удобно для:
-
организации окружений разработки (dev, staging, production);
-
разделения микросервисов одного приложения;
-
управления ресурсами команды или отдела.
Подробнее — в статье Ресурсная модель.
Ограничения
Ограничения мультитенантности
Проекты Stackland не обеспечивают полную изоляцию по умолчанию. Проекты — это логическая группировка ресурсов. Для Stackland действуют те же правила мультитенантности, что и для обычного Kubernetes.
Примечание
Подробнее о мультитенантности в Kubernetes — в официальной документации Kubernetes
-
Сетевая изоляция. В стандартной конфигурации все поды в кластере могут свободно общаться друг с другом, независимо от того, в каком они проекте или пространстве имен. Чтобы ограничить трафик между подами в разных проектах, нужно вручную создавать сетевые политики (
NetworkPolicy), которые действуют как сетевой фаервол. Подробнее о сетевых политиках — в документации Kubernetes . -
Ресурсная изоляция. Пространства имен и проекты не предотвращают влияние соседних («шумных») приложений друг на друга. Чтобы предотвратить ситуацию, когда приложения одной команды потребляют все ресурсы кластера, необходимо настраивать квоты. Процесс настройки описан в рецепте Настройка квот.
-
Изоляция на уровне узлов. По умолчанию поды из разных проектов могут быть размещены на одном узле. Для выделения узлов конкретному тенанту нужно использовать
nodeSelector,taintsиtolerations. Подробнее — в документации Kubernetes .
Ограничения проектов
Эти ограничения определяют правила именования и размещения проектов и пространств имен:
-
Именование пространств имен. Все пространства имен внутри проекта должны начинаться с префикса
<имя_проекта>-. Например, для проектаteam-alphaдопустимы:team-alpha-dev,team-alpha-backend. -
Зарезервированные префиксы. Имена пространств имен не могут начинаться с
stackland-илиproject-— эти префиксы зарезервированы для системных нужд. -
Одно пространство имен — один проект. Каждое пространство имен принадлежит строго одному проекту, переносить его между проектами нельзя.
-
Пространства имен без проекта. Пространства имен, созданные без явного указания проекта, автоматически попадают в проект
default. Для этих пространств имен необязателен префикс. -
Распространение доступа. Роль, назначенная на уровне проекта, действует во всех его пространствах имен.
-
Системные проекты. Проекты
defaultиstacklandнельзя удалить.
Создание проекта и пространств имен
Проекты и ProjectNamespace
В Stackland проект представлен двумя сущностями:
-
Ресурс
Project(CRDprojects.stackland.yandex.cloud) — описывает проект, его имя и настройки. -
Ресурс
ProjectNamespace(CRDprojectnamespaces.stackland.yandex.cloud) — связывает проект с конкретным пространством имен Kubernetes. Создается в служебном пространстве именproject-<имя_проекта>.
Схема работы:

Создание проекта
Проект можно создать двумя способами: через консоль управления Stackland или через CLI.
-
В левом меню выберите Проекты.
-
В правом верхнем углу нажмите + Создать.
-
В разделе Основные параметры укажите:
-
Имя — имя проекта. В нашем примере —
team-alpha. Имя должно быть уникальным в рамках кластера. Обязательное поле. -
Название (displayName) — отображаемое имя проекта в интерфейсе. Необязательное поле.
-
Описание — краткое описание назначения проекта. Необязательное поле.
-
-
Значения в разделе Квоты на этом этапе оставьте без изменений.
-
Нажмите Создать.

После создания проекта Stackland автоматически создаст служебное пространство имен project-<имя_проекта>. В нем будут размещаться ресурсы управления проектом.
Для создания проекта используйте ресурс Project:
-
Создайте файл манифеста, например
project.yaml:apiVersion: stackland.yandex.cloud/v1alpha1 kind: Project metadata: name: team-alpha spec: displayName: "Team Alpha" description: "Проект команды Alpha"Где:
-
metadata.name— имя проекта. Укажитеteam-alpha. Должно быть уникальным в рамках кластера. Обязательное поле. -
spec.displayName— отображаемое имя проекта. Необязательное поле. -
spec.description— описание проекта. Необязательное поле.
-
-
Примените манифест:
kubectl apply -f project.yamlПосле создания проекта Stackland автоматически создаст служебное пространство имен
project-<имя_проекта>. В нем будут размещаться ресурсы управления проектом. -
Проверьте создание служебного пространства имен:
kubectl get ns | grep 'team-alpha' project-team-alpha Active 8m55s
Создание пространств имен в проекте
В этом рецепте мы предлагаем создать два пространства имен в проекте team-alpha: team-alpha-dev и team-alpha-prod. Создайте одно через консоль управления, а второе — с помощью CLI.
Консоль управления
-
В левом меню выберите Проекты.
-
Выберите из списка проектов
team-alpha. -
На боковой панели проекта нажмите Пространства имен.
-
Нажмите + Создать пространство имен.
-
Укажите параметры:
-
Имя — суффикс имени пространства имен
dev. Префиксteam-alpha-подставляется автоматически. Обязательное поле. -
Разрешить удаление — флажок, определяющий возможность удаления пространства имен. По умолчанию флажок снят. Вы можете оставить любой вариант.
-
-
Нажмите Создать.

CLI
Для создания пространства имен используйте ресурс ProjectNamespace. Ресурс создается в служебном пространстве имен проекта project-<имя_проекта>.
-
Создайте файл манифеста, например
namespace.yaml:apiVersion: stackland.yandex.cloud/v1alpha1 kind: ProjectNamespace metadata: namespace: project-team-alpha name: team-alpha-prod spec: allowDeletion: false template: labels: environment: production annotations: description: "Production environment"Где:
-
metadata.namespace— служебное пространство имен проекта в форматеproject-<имя_проекта>. Укажитеproject-team-alpha. Обязательное поле. -
metadata.name— имя создаваемого пространства имен. Должно начинаться с<имя_проекта>-. Обязательное поле. -
spec.allowDeletion— разрешить или запретить удаление этого ресурса и связанного пространства имен. -
spec.template.labels— дополнительные метки для пространства имен. Необязательное поле. -
spec.template.annotations— дополнительные аннотации для пространства имен. Необязательное поле.
-
-
Примените манифест:
kubectl apply -f namespace.yaml
Stackland автоматически создаст пространство имен team-alpha-backend с меткой stackland.yandex.cloud/project-name: team-alpha.
Проверка результата
После создания проекта и пространств имен выполните проверку:
-
Проверьте список проектов:
kubectl get projects NAME DISPLAY NAME PHASE AGE default Default Project Active 7d3h stackland Stackland System Project Active 7d3h team-alpha Team Alpha Active 28m -
Проверьте список ProjectNamespace в служебном пространстве имен:
kubectl get projectnamespaces -n project-team-alpha NAME PHASE ALLOW DELETION AGE team-alpha-dev Active false 11m team-alpha-prod Active false 4m1s -
Проверьте, что пользовательские пространства имен созданы:
kubectl get namespaces | grep team-alpha project-team-alpha Active 29m team-alpha-dev Active 12m team-alpha-prod Active 4m26s
Итоги
Вы создали проект и пространства имен для команды разработки. Вот что стоит запомнить:
-
В Stackland трехуровневая иерархия ресурсов: кластер содержит проекты, проекты объединяют пространства имен.
-
Все пространства имен внутри проекта должны начинаться с префикса
<имя_проекта>-. Префиксыstackland-иproject-зарезервированы системой. -
Каждое пространство имен принадлежит строго одному проекту, и переносить его между проектами после создания нельзя.
-
Проекты
defaultиstacklandявляются системными и не подлежат удалению, а пространства имен без явного указания проекта автоматически попадают вdefault. -
Проект описывается ресурсом
Project, а связь с конкретным пространством имен Kubernetes устанавливается через ресурсProjectNamespace.