[Документация Yandex Cloud](../../../index.md) > [Yandex Cloud Stackland](../../index.md) > [Сборник рецептов администратора Stackland](../index.md) > Запуск команды разработки в инсталляцию > Подготовка проекта и пространств имен команды

# Подготовка проекта и пространств имен команды

Этот рецепт покажет, как создать проект `team-alpha`, а внутри него два пространства имен: `team-alpha-dev` — для разработки и `team-alpha-prod` — для промышленной эксплуатации. Также вы узнаете об ограничениях, которые определяют, как именовать и размещать ресурсы команды.

## Ресурсная модель Stackland {#resource-model}

Прежде чем переходить к созданию проекта, мы покажем, что он из себя представляет и где находится в общей модели ресурсов. Stackland использует трехуровневую иерархию:

#|
|| **Уровень** | **Описание** | **Пример** ||
|| Кластер (Cluster) | Корневая сущность. Управление узлами, компонентами, федерациями | Весь кластер Stackland ||
|| Проект (Project) | Логическая группировка пространств имен для команды или приложения | `team-alpha` ||
|| Пространство имен (Namespace) | Стандартная единица изоляции ресурсов Kubernetes® | `team-alpha-dev`, `team-alpha-prod` ||
|#

**Проект** объединяет несколько **пространств имен** под единым управлением. Это удобно для:

* организации окружений разработки (dev, staging, production);

* разделения микросервисов одного приложения;

* управления ресурсами команды или отдела.

Подробнее — в статье [Ресурсная модель](../../concepts/resource-model.md).

## Ограничения {#limitations}

### Ограничения мультитенантности {#multitenancy-limitations}

Проекты Stackland не обеспечивают полную изоляцию по умолчанию. Проекты — это логическая группировка ресурсов. Для Stackland действуют те же правила мультитенантности, что и для обычного Kubernetes.

{% note info %}

Подробнее о мультитенантности в Kubernetes — в [официальной документации Kubernetes](https://kubernetes.io/docs/concepts/security/multi-tenancy/).

{% endnote %}

* **Сетевая изоляция.** В стандартной конфигурации все поды в кластере могут свободно общаться друг с другом, независимо от того, в каком они проекте или пространстве имен. Чтобы ограничить трафик между подами в разных проектах, нужно вручную создавать сетевые политики (`NetworkPolicy`), которые действуют как сетевой фаервол. Подробнее о сетевых политиках — в [документации Kubernetes](https://kubernetes.io/docs/concepts/services-networking/network-policies/).

* **Ресурсная изоляция.** Пространства имен и проекты не предотвращают влияние соседних («шумных») приложений друг на друга. Чтобы предотвратить ситуацию, когда приложения одной команды потребляют все ресурсы кластера, необходимо настраивать квоты. Процесс настройки описан в рецепте [Настройка квот](04-quotas.md).

* **Изоляция на уровне узлов.** По умолчанию поды из разных проектов могут быть размещены на одном узле. Для выделения узлов конкретному тенанту нужно использовать `nodeSelector`, `taints` и `tolerations`. Подробнее — в [документации Kubernetes](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/).

### Ограничения проектов {#project-limitations}

Эти ограничения определяют правила именования и размещения проектов и пространств имен:

* **Именование пространств имен.** Все пространства имен внутри проекта должны начинаться с префикса `<имя_проекта>-`. Например, для проекта `team-alpha` допустимы: `team-alpha-dev`, `team-alpha-backend`.

* **Зарезервированные префиксы.** Имена пространств имен не могут начинаться с `stackland-` или `project-` — эти префиксы зарезервированы для системных нужд.

* **Одно пространство имен — один проект.** Каждое пространство имен принадлежит строго одному проекту, переносить его между проектами нельзя.

* **Пространства имен без проекта.** Пространства имен, созданные без явного указания проекта, автоматически попадают в проект `default`. Для этих пространств имен необязателен префикс.

* **Распространение доступа.** Роль, назначенная на уровне проекта, действует во всех его пространствах имен.

* **Системные проекты.** Проекты `default` и `stackland` нельзя удалить.

## Создание проекта и пространств имен {#create-project-and-namespaces}

### Проекты и ProjectNamespace {#projects-and-projectnamespace}

В Stackland проект представлен двумя сущностями:

1. **Ресурс `Project`** (CRD `projects.stackland.yandex.cloud`) — описывает проект, его имя и настройки.

1. **Ресурс `ProjectNamespace`** (CRD `projectnamespaces.stackland.yandex.cloud`) — связывает проект с конкретным пространством имен Kubernetes. Создается в служебном пространстве имен `project-<имя_проекта>`.

**Схема работы:**

![Схема проекта в Stackland](../../_assets/cookbooks/dev-team-onboarding/02-02-project-structure-diagram.png)

### Создание проекта {#create-project}

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

{% list tabs group=instructions %}

- Консоль управления {#console}

  1. В левом меню выберите **Проекты**.

  1. В правом верхнем углу нажмите **+ Создать**.

  1. В разделе **Основные параметры** укажите:

      * **Имя** — имя проекта. В нашем примере — `team-alpha`. Имя должно быть уникальным в рамках кластера. Обязательное поле.

      * **Название (displayName)** — отображаемое имя проекта в интерфейсе. Необязательное поле.

      * **Описание** — краткое описание назначения проекта. Необязательное поле.

  1. Значения в разделе **Квоты** на этом этапе оставьте без изменений.

  1. Нажмите **Создать**.

  ![Страница создания проекта в консоли управления](../../_assets/cookbooks/dev-team-onboarding/02-03-console-create-project.png)

  После создания проекта Stackland автоматически создаст служебное пространство имен `project-<имя_проекта>`. В нем будут размещаться ресурсы управления проектом.

- CLI {#cli}

  Для создания проекта используйте ресурс `Project`:

  1. Создайте файл манифеста, например `project.yaml`:

      ```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` — описание проекта. Необязательное поле.

  1. Примените манифест:

      ```bash
      kubectl apply -f project.yaml
      ```

      После создания проекта Stackland автоматически создаст служебное пространство имен `project-<имя_проекта>`. В нем будут размещаться ресурсы управления проектом.

  1. Проверьте создание служебного пространства имен:

      ```bash
      kubectl get ns | grep 'team-alpha'
      project-team-alpha              Active   8m55s
      ```

{% endlist %}

### Создание пространств имен в проекте {#create-namespaces}

В этом рецепте мы предлагаем создать два пространства имен в проекте `team-alpha`: `team-alpha-dev` и `team-alpha-prod`. Создайте одно через консоль управления, а второе — с помощью CLI.

#### Консоль управления {#create-namespace-console}

1. В левом меню выберите **Проекты**.

1. Выберите из списка проектов `team-alpha`.

1. На боковой панели проекта нажмите **Пространства имен**.

1. Нажмите **+ Создать пространство имен**.

1. Укажите параметры:

    * **Имя** — суффикс имени пространства имен `dev`. Префикс `team-alpha-` подставляется автоматически. Обязательное поле.

    * **Разрешить удаление** — флажок, определяющий возможность удаления пространства имен. По умолчанию флажок снят. Вы можете оставить любой вариант.

1. Нажмите **Создать**.

![Страница создания пространства имен в консоли управления](../../_assets/cookbooks/dev-team-onboarding/02-04-console-create-namespace.png)

#### CLI {#create-namespace-cli}

Для создания пространства имен используйте ресурс `ProjectNamespace`. Ресурс создается в служебном пространстве имен проекта `project-<имя_проекта>`.

1. Создайте файл манифеста, например `namespace.yaml`:

    ```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` — дополнительные аннотации для пространства имен. Необязательное поле.

1. Примените манифест:

    ```bash
    kubectl apply -f namespace.yaml
    ```

Stackland автоматически создаст пространство имен `team-alpha-backend` с меткой `stackland.yandex.cloud/project-name: team-alpha`.

### Проверка результата {#check-result}

После создания проекта и пространств имен выполните проверку:

1. Проверьте список проектов:

    ```bash
    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
    ```

1. Проверьте список ProjectNamespace в служебном пространстве имен:

    ```bash
    kubectl get projectnamespaces -n project-team-alpha
    NAME              PHASE    ALLOW DELETION   AGE
    team-alpha-dev    Active   false            11m
    team-alpha-prod   Active   false            4m1s
    ```

1. Проверьте, что пользовательские пространства имен созданы:

    ```bash
    kubectl get namespaces | grep team-alpha
    project-team-alpha              Active   29m
    team-alpha-dev                  Active   12m
    team-alpha-prod                 Active   4m26s
    ```

## Итоги {#summary}

Вы создали проект и пространства имен для команды разработки. Вот что стоит запомнить:

* В Stackland трехуровневая иерархия ресурсов: кластер содержит проекты, проекты объединяют пространства имен.

* Все пространства имен внутри проекта должны начинаться с префикса `<имя_проекта>-`. Префиксы `stackland-` и `project-` зарезервированы системой.

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

* Проекты `default` и `stackland` являются системными и не подлежат удалению, а пространства имен без явного указания проекта автоматически попадают в `default`.

* Проект описывается ресурсом `Project`, а связь с конкретным пространством имен Kubernetes устанавливается через ресурс `ProjectNamespace`.