[Документация Yandex Cloud](../../index.md) > [Yandex Managed Service for Kubernetes](../index.md) > [Пошаговые инструкции](index.md) > Подключение к узлу через OS Login

# Подключение к узлу через OS Login

[OS Login](../../organization/concepts/os-login.md) используется вместо SSH-ключей для доступа к виртуальным машинам Yandex Cloud через SSH. С помощью OS Login вы можете подключиться к узлам Managed Service for Kubernetes.

Отдельные узлы в группах узлов — это виртуальные машины Yandex Compute Cloud с автоматически сгенерированными именами. Чтобы сконфигурировать узлы, воспользуйтесь инструкциями, приведенными ниже, или [другими инструкциями по управлению группами узлов](index.md#node-group).

{% note alert %}

Не изменяйте параметры ВМ узлов, в том числе имена, сетевые интерфейсы и SSH-ключи, с помощью интерфейсов Compute Cloud или SSH-подключения к ВМ.

Это может нарушить работу отдельных узлов, групп узлов и всего кластера Managed Service for Kubernetes.

{% endnote %}

[Настройте узел кластера](#configure-node), после чего подключитесь к нему одним из двух способов:

* [с помощью CLI](#connect-via-cli);
* [с помощью SSH](#connect-via-ssh).

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

1. Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), [установите и инициализируйте его](../../cli/quickstart.md#install).

   По умолчанию используется каталог, указанный при [создании](../../cli/operations/profile/profile-create.md) профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду `yc config set folder-id <идентификатор_каталога>`. Также для любой команды вы можете указать другой каталог с помощью параметров `--folder-name` или `--folder-id`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

1. [Включите доступ через OS Login](../../organization/operations/os-login-access.md) на уровне организации.
1. [Включите доступ к узлам из интернета](node-group/node-group-update.md#node-internet-access) для группы узлов, содержащей узел, к которому нужно подключиться.

1. Убедитесь, что аккаунту, с которого вы подключаетесь к узлу, [назначены необходимые роли](../../iam/operations/roles/grant.md):

    * [роль](../../compute/security/index.md#compute-oslogin) `compute.osLogin`для доступа к узлу без прав sudo или `compute.osAdminLogin` для доступа с правами sudo.
    * [роль](../../resource-manager/security/index.md#resource-manager-auditor) `resource-manager.auditor` или выше на каталог, в котором размещен узел.

## Настройте узел {#configure-node}

Подготовьте узел кластера к подключению:

1. Убедитесь, что для узла включен [внешний доступ](node-group/node-group-update.md#node-internet-access).

1. Активируйте доступ к узлу через OS Login, изменив способ подключения к узлам.

    {% note info %}
    
    После изменения способа подключения группа узлов временно перейдет в статус `Reconciling`: все узлы в группе будут пересозданы для применения изменений.
    
    {% endnote %}

    {% list tabs group=instructions %}

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

        1. В [консоли управления](https://kz.console.yandex.cloud) выберите [каталог](../../resource-manager/concepts/resources-hierarchy.md#folder), в котором находится кластер Managed Service for Kubernetes, к узлу которого нужен доступ.
        1. [Перейдите](https://kz.console.yandex.cloud/link/managed-kubernetes) в сервис **Managed Service for&nbsp;Kubernetes**.
        1. Нажмите на имя нужного кластера Managed Service for Kubernetes.
        1. Перейдите во вкладку **Группы узлов**.
        1. Выберите нужную группу узлов.
        1. Нажмите кнопку **Редактировать** в правом верхнем углу.
        1. Выберите опцию **Доступ по OS Login**.

            {% note warning %}
            
            Если доступ через OS Login включен, то доступ по SSH-ключам будет невозможен.
            
            {% endnote %}

        1. Нажмите кнопку **Сохранить**.

    - CLI {#cli}

      Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), [установите и инициализируйте его](../../cli/quickstart.md#install).

      По умолчанию используется каталог, указанный при [создании](../../cli/operations/profile/profile-create.md) профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду `yc config set folder-id <идентификатор_каталога>`. Также для любой команды вы можете указать другой каталог с помощью параметров `--folder-name` или `--folder-id`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

      Чтобы включить OS Login для всех узлов в группе узлов:

      1. Посмотрите описание команды CLI для добавления и обновления метаданных группы узлов Managed Service for Kubernetes:

          ```bash
          yc managed-kubernetes node-group add-metadata --help
          ```

      1. Выполните команду:

          ```bash
          yc managed-kubernetes node-group add-metadata \
            --name <имя_группы_узлов> \
            --metadata enable-oslogin=true
          ```

          Имя группы узлов можно запросить со [списком групп узлов в каталоге](node-group/node-group-list.md#list).

          {% note warning %}
          
          Если доступ через OS Login включен, то доступ по SSH-ключам будет невозможен.
          
          {% endnote %}

    - Terraform {#tf}

      1. Откройте актуальный конфигурационный файл Terraform с описанием группы узлов Managed Service for Kubernetes.

          О том, как создать такой файл, читайте в разделе [Создание группы узлов](node-group/node-group-create.md).

      1. Добавьте в описание группы узлов параметр `instance_template.metadata`, или измените его, если он уже есть.

          Укажите в этом параметре ключ метаданных `enable-oslogin` со значением `true`:

          ```hcl
          resource "yandex_kubernetes_node_group" "<имя_группы_узлов>" {
            cluster_id = yandex_kubernetes_cluster.<имя_кластера>.id
            ...
            instance_template {
              metadata = {
                "enable-oslogin" = "true"
                ...
              }
              ...
            }
            ...
          }
          ```

          {% note warning %}
          
          Если доступ через OS Login включен, то доступ по SSH-ключам будет невозможен.
          
          {% endnote %}

      1. Проверьте корректность конфигурационных файлов.

          1. В командной строке перейдите в каталог, в котором расположены актуальные конфигурационные файлы Terraform с планом инфраструктуры.
          1. Выполните команду:
          
             ```bash
             terraform validate
             ```
          
             Если в файлах конфигурации есть ошибки, Terraform на них укажет.

      1. Подтвердите изменение ресурсов.

          1. Выполните команду для просмотра планируемых изменений:
          
             ```bash
             terraform plan
             ```
          
             Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
          
          1. Если вас устраивают планируемые изменения, внесите их:
             1. Выполните команду:
          
                ```bash
                terraform apply
                ```
          
             1. Подтвердите изменение ресурсов.
             1. Дождитесь завершения операции.

          {% note warning "Ограничения по времени" %}
          
          Провайдер Terraform ограничивает время на выполнение операций с группами узлов кластера Managed Service for Kubernetes:
          
          * создание и изменение — 60 минут;
          * удаление — 20 минут.
          
          Операции, которые длятся дольше указанного времени, прерываются.
          
          {% cut "Как изменить эти ограничения?" %}
          
          Добавьте к описанию группы узлов кластера блок `timeouts`, например:
          
          ```hcl
          resource "yandex_kubernetes_node_group" "<имя_группы_узлов>" {
            ...
            timeouts {
              create = "1h30m"
              update = "1h30m"
              delete = "60m"
            }
          }
          ```
          
          {% endcut %}
          
          {% endnote %}

      Подробнее в [документации провайдера Terraform](../../terraform/resources/kubernetes_node_group.md).

    - API {#api}

      {% note info %}
      
      Ниже перечислены параметры для тела запроса к REST API. Чтобы указать параметр в вызове gRPC API, преобразуйте его имя из [lowerCamelCase](https://ru.wikipedia.org/wiki/CamelCase) в [snake_case](https://ru.wikipedia.org/wiki/Snake_case). Например, параметр `minResourcePresetId` преобразуется в `min_resource_preset_id`.
      
      {% endnote %}

      1. Получите все существующие метаданные для группы узлов одним из способов:
         
         * Воспользуйтесь методом REST API [get](../managed-kubernetes/api-ref/NodeGroup/get.md) для ресурса [NodeGroup](../managed-kubernetes/api-ref/NodeGroup/index.md).
         * Используйте вызов gRPC API [NodeGroupService/Get](../managed-kubernetes/api-ref/grpc/NodeGroup/get.md).
         
         Передайте в запросе идентификатор группы узлов в параметре `nodeGroupId`. Идентификатор можно запросить со [списком групп узлов в каталоге](node-group/node-group-list.md#list).
         
         Метаданные будут перечислены в виде пар `ключ=значение` в поле `nodeTemplate.metadata` ответа.

      1. Воспользуйтесь методом REST API [update](../managed-kubernetes/api-ref/NodeGroup/update.md) для ресурса [NodeGroup](../managed-kubernetes/api-ref/NodeGroup/index.md) или вызовом gRPC API [NodeGroupService/Update](../managed-kubernetes/api-ref/grpc/NodeGroup/update.md) и передайте в запросе:

          * Идентификатор группы узлов в параметре `nodeGroupId`.

          * Параметр `updateMask` со значением `nodeTemplate.metadata`.

            {% note warning %}
            
            Метод API переопределит все параметры изменяемого объекта, которые не были явно переданы в запросе, на значения по умолчанию. Чтобы избежать этого, перечислите настройки, которые вы хотите изменить, в параметре `updateMask` (одной строкой через запятую).
            
            {% endnote %}

          * Параметр `nodeTemplate.metadata`, в котором перечислены без изменений все существующие метаданные группы узлов в виде пар `ключ=значение`.

            Для ключа `enable-oslogin` замените текущее значение на `true`. Если такого ключа нет, добавьте его.

            {% note warning %}
            
            Если доступ через OS Login включен, то доступ по SSH-ключам будет невозможен.
            
            {% endnote %}

            {% cut "Пример перечисления метаданных в параметре" %}

            > * Существующие ключи метаданных в группе узлов:
            >
            >   ```json
            >   "nodeTemplate": {
            >       "metadata": {
            >           "enable-oslogin": "undefined",
            >           "<существующий_ключ_1>": "<существующее_значение_1>",
            >           "<существующий_ключ_2>": "<существующее_значение_2>"
            >       },
            >       ...
            >   }
            >   ```
            >
            > * Ключи метаданных для передачи в запросе к API:
            >
            >   ```json
            >   "nodeTemplate": {
            >       "metadata": {
            >           "enable-oslogin": "true",
            >           "<существующий_ключ_1>": "<существующее_значение_1>",
            >           "<существующий_ключ_2>": "<существующее_значение_2>"
            >       }
            >   }
            >   ```

            {% endcut %}

            {% note alert %}
            
            Метаданные, не перечисленные в параметре `nodeTemplate.metadata`, будут удалены.
            
            После этого группа узлов временно перейдет в статус **Reconciling**: все узлы в группе узлов будут пересозданы для применения изменений.
            
            {% endnote %}

    {% endlist %}

## Подключитесь к узлу с помощью CLI {#connect-via-cli}

1. Посмотрите описание команды CLI для подключения к узлу:

    ```bash
    yc compute ssh --help
    ```

1. Чтобы узнать имя нужного узла, получите список узлов в кластере:

    ```bash
    yc managed-kubernetes node-group list-nodes --name <имя_группы_узлов>
    ```

    Пример результата:

    ```bash
    +----------------------+-----------------+---------------------------+-------------+--------+
    | CLOUD INSTANCE       | KUBERNETES NODE | RESOURCES                 | DISK        | STATUS |
    +----------------------+-----------------+---------------------------+-------------+--------+
    | fhmmh23ugigb******** | <имя_узла>      | 4 100% core(s), 8.0 GB of | 64.0 GB ssd | READY  |
    | RUNNING_ACTUAL       |                 | memory                    |             |        |
    +----------------------+-----------------+---------------------------+-------------+--------+
    ```

1. Подключитесь к узлу:

    ```bash
    yc compute ssh --name <имя_узла>
    ```

    {% note info %}

    Для сервисных аккаунтов [профили OS Login](../../organization/concepts/os-login.md#os-login-profiles) не создаются автоматически. Чтобы подключаться к ВМ или узлу Kubernetes от имени сервисного аккаунта, [вручную создайте](../../organization/operations/os-login-profile-create.md) для него профиль OS Login.

    {% endnote %}

## Подключитесь к узлу с помощью SSH {#connect-via-ssh}

1. [Экспортируйте сертификат](../../compute/operations/vm-connect/os-login-export-certificate.md) OS Login.

   {% note info %}

   Сертификат действителен один час. По истечении этого времени для подключения к узлу экспортируйте новый сертификат.

   {% endnote %}

1. Узнайте публичный адрес узла:

   1. Получите идентификатор группы узлов:

      ```bash
      yc managed-kubernetes node-group list
      ```

      Результат:

      ```text
      +------------------------------+----------------------+-----------+----------------------+---------------------+---------+------+
      |          ID                  |      CLUSTER ID      |   NAME    |  INSTANCE GROUP ID   |     CREATED AT      | STATUS  | SIZE |
      +------------------------------+----------------------+-----------+----------------------+---------------------+---------+------+
      | <идентификатор_группы_узлов> | cato4gqs0ave******** | ng-name   | cl17a1c3mbau******** | 2024-02-08 04:25:06 | RUNNING |    1 |
      +------------------------------+----------------------+-----------+----------------------+---------------------+---------+------+
      ```

      Нужный параметр находится в столбце `ID`.

   1. Посмотрите список узлов Managed Service for Kubernetes, которые принадлежат этой группе:

      ```bash
      yc compute instance-group list-instances <идентификатор_группы_узлов>
      ```

      Результат:

      ```text
      +----------------------+---------------------------+----------------+-------------+----------------------+----------------+
      |     INSTANCE ID      |           NAME            |  EXTERNAL IP   | INTERNAL IP |        STATUS        | STATUS MESSAGE |
      +----------------------+---------------------------+----------------+-------------+----------------------+----------------+
      | fhm8nq5p7t0r******** | cl12kvrgj493rhrkimmb-**** | 84.201.156.211 | 10.128.0.36 | RUNNING_ACTUAL [25m] |                |
      +----------------------+---------------------------+----------------+-------------+----------------------+----------------+
      ```

      Публичный IP-адрес узла Managed Service for Kubernetes указан в столбце `EXTERNAL IP`.

1. Подключитесь к ВМ:

    ```bash
    ssh -i <путь_к_файлу_сертификата> <логин_пользователя>@<публичный_IP-адрес_узла>
    ```

    Где:

    * `<путь_к_файлу_сертификата>` — путь к сохраненному ранее файлу `Identity` сертификата. Например: `/home/user1/.ssh/yc-cloud-id-b1gia87mbaom********-orgusername`.
    * `<логин_пользователя>` — логин пользователя, заданный для этого пользователя в [профиле OS Login](../../organization/concepts/os-login.md#os-login-profiles). Логин также указывается в конце имени экспортированного сертификата OS Login. В примере выше это `orgusername`.

        {% note info %}

        Для сервисных аккаунтов [профили OS Login](../../organization/concepts/os-login.md#os-login-profiles) не создаются автоматически. Чтобы подключаться к ВМ или узлу Kubernetes от имени сервисного аккаунта, [вручную создайте](../../organization/operations/os-login-profile-create.md) для него профиль OS Login.

        {% endnote %}

    * `<публичный_IP-адрес_узла>` — полученный ранее публичный адрес узла.

    При первом подключении к узлу появится предупреждение о неизвестном хосте:

    ```text
    The authenticity of host '158.160.**.** (158.160.**.**)' can't be established.
    ECDSA key fingerprint is SHA256:PoaSwqxRc8g6iOXtiH7ayGHpSN0MXwUfWHk********.
    Are you sure you want to continue connecting (yes/no)?
    ```

    Введите в терминале слово `yes` и нажмите **Enter**.