[Документация Yandex Cloud](../../../index.md) > [Yandex Cloud Stackland](../../index.md) > [Пошаговые инструкции](../index.md) > [Проекты](index.md) > Управлять пространствами имен

# Управлять пространствами имен в проекте

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

## Перед началом работы {#before-you-begin}

Убедитесь, что:

* У вас есть роль администратора проекта или администратора кластера.
* Проект уже создан. Если нет, [создайте проект](create-project.md).

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

Пространства имен в проекте именуются с обязательным префиксом `<имя_проекта>-`. Например, для проекта `test-project` допустимы имена `test-project-main`, `test-project-backend`.

{% list tabs group=instructions %}

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

  1. В левом меню выберите **Проекты**.
  1. Выберите нужный проект из списка.
  1. На боковой панели проекта нажмите **Пространства имен**.
  1. Нажмите **+ Создать пространство имен**.
  1. Укажите параметры:

      * **Имя** — суффикс имени пространства имен. Префикс `<имя_проекта>-` подставляется автоматически. Обязательное поле.
      * **Разрешить удаление** — снимите флажок, чтобы защитить пространство имен от случайного удаления. По умолчанию флажок снят.

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


- CLI {#cli}

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

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

      ```yaml
      apiVersion: stackland.yandex.cloud/v1alpha1
      kind: ProjectNamespace
      metadata:
        namespace: project-team-alpha
        name: team-alpha-backend
      spec:
        template:
          labels:
            environment: production
          annotations:
            description: "Backend services"
      ```

      Где:

      * `metadata.namespace` — служебное пространство имен проекта в формате `project-<имя_проекта>`. Обязательное поле.
      * `metadata.name` — имя создаваемого пространства имен. Должно начинаться с `<имя_проекта>-`. Обязательное поле.
      * `spec.template.labels` — дополнительные метки для пространства имен. Необязательное поле.
      * `spec.template.annotations` — дополнительные аннотации для пространства имен. Необязательное поле.

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

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

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

{% endlist %}

### Альтернативный способ: создание через Namespace {#create-via-namespace}

Вы можете создать пространство имен напрямую, указав метку принадлежности к проекту:

```yaml
apiVersion: v1
kind: Namespace
metadata:
  name: team-alpha-backend
  labels:
    stackland.yandex.cloud/project-name: team-alpha
```

{% note info %}

Для создания пространства имен напрямую необходимы права на создание Namespace в кластере. Имя пространства имен должно начинаться с `<имя_проекта>-`.

{% endnote %}

## Просмотреть пространства имен проекта {#list-namespaces}

{% list tabs group=instructions %}

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

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


- CLI {#cli}

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

  ```bash
  kubectl get namespaces -l stackland.yandex.cloud/project-name=team-alpha
  ```

  Чтобы получить список ресурсов `ProjectNamespace`:

  ```bash
  kubectl get projectnamespaces -n project-team-alpha
  ```

{% endlist %}

## Защита от удаления {#deletion-protection}

По умолчанию пространства имен защищены от удаления. Флажок **Разрешить удаление** управляет этой защитой:

* Флажок снят — пространство имен защищено от удаления.
* Флажок установлен — пространство имен можно удалить.

Чтобы изменить настройку защиты через консоль управления:

1. В левом меню выберите **Проекты**.
1. Выберите нужный проект из списка.
1. На боковой панели проекта нажмите **Пространства имен**.
1. Нажмите на имя нужного пространства имен.
1. Нажмите **Редактировать**.
1. Установите или снимите флажок **Разрешить удаление**.
1. Нажмите **Сохранить**.

Чтобы изменить настройку защиты через CLI:

```yaml
apiVersion: stackland.yandex.cloud/v1alpha1
kind: ProjectNamespace
metadata:
  namespace: project-team-alpha
  name: team-alpha-backend
spec:
  allowDeletion: true
```

## Удалить пространство имен {#delete-namespace}

{% list tabs group=instructions %}

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

  1. В левом меню выберите **Проекты**.
  1. Выберите нужный проект из списка.
  1. На боковой панели проекта нажмите **Пространства имен**.
  1. В строке нужного пространства имен нажмите значок **⋯** и выберите **Удалить**.
  1. Подтвердите удаление.


- CLI {#cli}

  1. Отключите защиту от удаления, если она включена:

      ```bash
      kubectl patch projectnamespace team-alpha-backend \
        -n project-team-alpha \
        --type merge \
        -p '{"spec":{"allowDeletion":true}}'
      ```

  1. Удалите ресурс `ProjectNamespace`:

      ```bash
      kubectl delete projectnamespace team-alpha-backend -n project-team-alpha
      ```

  Stackland автоматически удалит связанное пространство имен и все ресурсы внутри него.

{% endlist %}

{% note warning %}

При удалении пространства имен будут удалены все ресурсы внутри него. Эта операция необратима.

{% endnote %}

## Что дальше {#what-is-next}

* [Настроить роли проекта](project-roles.md)
* [Установить квоты проекта](namespace-quotas.md)