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

# Масштабирование кластера

Вы можете изменить состав кластера, Stackland добавив или удалив узлы. Каждый узел кластера описывается кастомным ресурсом `StacklandHostConfig` в пространстве имен `stackland-install`. Создание ресурса инициирует подключение нового узла, а удаление ресурса — вывод существующего.

Поддерживаются узлы с ролями `control-plane`, `worker` и `combined`. Роль узла нельзя изменить напрямую — для смены роли удалите узел и добавьте его заново с новой ролью.

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

1. Убедитесь, что у вас есть доступ к кластеру с правами администратора.
1. Если в кластере выполняется обновление на новую версию, масштабирование начнется автоматически сразу после завершения обновления. При необходимости проверьте текущую фазу обновления:

    ```bash
    kubectl get targetinstallationstate main -o jsonpath='{.status.phase}'
    ```

1. Посмотрите текущий состав узлов кластера одним из способов:

    * В консоли управления выберите в левом меню **Управление узлами**. Откроется список узлов с именами, статусами и ролями.
    * Через CLI выполните команду:

        ```bash
        kubectl get stacklandhostconfig -n stackland-install
        ```

        Пример вывода:

        ```text
        NAME              ROLE            PHASE       AGE
        192.168.23.2      control-plane   Installed   7d
        192.168.23.3      control-plane   Installed   7d
        192.168.23.4      control-plane   Installed   7d
        192.168.23.10     worker          Installed   3d
        ```

        Сокращенное имя ресурса — `shc`.

## Добавить узел {#add-node}

### Подготовить новый узел {#prepare-node}

Загрузите новый узел в режиме обслуживания (Maintenance mode), как при первоначальной установке кластера. Без этого подключение узла не сработает. Подробнее см. в разделе [Руководство по установке](../../quickstart.md).

После загрузки убедитесь, что у вас есть:

* hostname или IP-адрес узла;
* список и параметры сетевых интерфейсов;
* путь до установочного диска.

### Создать ресурс StacklandHostConfig {#create-shc}

{% list tabs group=instructions %}

- CLI {#cli}

  1. Создайте файл манифеста. Например, с помощью команды `touch host.yaml`.
  1. Откройте файл и вставьте минимальную конфигурацию:

      ```yaml
      apiVersion: stackland.yandex.cloud/v1alpha1
      kind: StacklandHostConfig
      metadata:
        name: <имя_узла>
        namespace: stackland-install
      spec:
        role: worker
        disksConfig:
          - installDisk:
              name: "/dev/sda"
        networkConfig:
          interfaces:
            - name: eth0
              mac: "<mac_адрес>"
          addresses:
            - iface: eth0
              ip: "<ip_адрес>/<префикс>"
          routes:
            - iface: eth0
              to: "0.0.0.0/0"
              via: "<шлюз>"
      ```

      Где:

      * `metadata.name` — hostname узла. Используется как идентификатор ресурса в кластере.
      * `spec.role` — роль узла: `control-plane`, `worker` или `combined`.
      * `spec.disksConfig[].installDisk.name` — путь до диска для установки операционной системы.
      * `spec.networkConfig` — параметры сетевого подключения узла.

      Поля, не заданные в манифесте, наследуются из шаблона `StacklandClusterConfig`, заданного при установке кластера.

  1. (Опционально) Добавьте секцию `spec.features`, чтобы включить дополнительные возможности узла. Например, поддержку GPU:

      ```yaml
      spec:
        features:
          - gpu
      ```

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

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

  1. Сохраните файл `host.yaml` в Git-репозитории, где хранятся конфигурации кластера. Это позволит восстановить состав узлов в случае необходимости.


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

  1. В левом меню выберите **Управление узлами**.
  1. Нажмите **Создать узел**.
  1. В разделе **Конфигурация узла** заполните основные поля:

      * **Имя узла** — hostname узла.
      * **Роль** — `control-plane`, `worker` или `combined`.
      * **Диск для установки** — путь до установочного диска, например `/dev/sda`.

      Чтобы задать конфигурацию узла в формате YAML, включите переключатель **Редактировать YAML**.

  1. В разделе **Интерфейсы** добавьте сетевые интерфейсы узла. Для каждого интерфейса нажмите **Добавить интерфейс** и укажите:

      * **Имя** — имя интерфейса, например `eth0`.
      * **MAC-адрес** — MAC-адрес интерфейса.
      * **Маршруты** — список маршрутов. Нажмите **Добавить маршрут**, чтобы задать маршрут.
      * **Адреса** — IP-адрес с префиксом, например `192.168.1.1/24`.

  1. При необходимости в разделе **Сетевая конфигурация** переопределите общие сетевые параметры узла:

      * **Резолверы** — список DNS-серверов.
      * **Timeservers** — список NTP-серверов.

      Если поля не заполнены, используются значения по умолчанию из шаблона `StacklandClusterConfig`.

  1. В разделе **Дополнительные возможности** включите нужные функции, например **GPU**.
  1. Нажмите **Создать**.

{% endlist %}

## Удалить узел {#remove-node}

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

1. Закрывает узел от новой нагрузки (cordon).
1. Эвакуирует с узла существующие поды (drain).
1. Удаляет узел из кластера Kubernetes.
1. Сбрасывает операционную систему узла в режим обслуживания (Maintenance mode). Узел становится доступен для повторного подключения к кластеру.

{% list tabs group=instructions %}

- CLI {#cli}

  Удалите ресурс `StacklandHostConfig`:

  ```bash
  kubectl delete stacklandhostconfig <имя_узла> -n stackland-install
  ```

  Команда не возвращает управление, пока операция вывода узла не завершится. Это поведение обеспечивается финализатором. Прервать ожидание клавишами `Ctrl+C` безопасно — операция продолжится в фоне.


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

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

{% endlist %}

## Проверить статус операции {#check-status}

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

```bash
kubectl get stacklandhostconfig <имя_узла> -n stackland-install
```

Пример вывода:

```text
NAME            ROLE     PHASE        AGE
node-05         worker   Installing   2m
```

В поле `PHASE` отображается фаза жизненного цикла узла:

* `Pending` — ресурс создан, операция ожидает запуска.
* `Installing` — выполняется подключение узла к кластеру.
* `Installed` — узел подключен и работает в кластере.
* `Removing` — выполняется вывод узла из кластера.
* `Failed` — операция завершилась с ошибкой.

## Получить подробную информацию {#get-details}

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

```bash
kubectl describe stacklandhostconfig <имя_узла> -n stackland-install
```

В поле `Status` отображается:

* `phase` — текущая фаза жизненного цикла.
* `message` — сообщение о текущем состоянии операции.
* `lastUpdated` — время последнего обновления статуса.