Функция доступна в провайдере версии 4.2.0 и выше.

## Изменения в 4.4.0

- добавлено поле _extnet_only_
- добавлено поле _oidc_cert_
- добавлено поле _cloud_init_ (в последующих версиях удалено)
- добавлено поле _ha_mode_
- добавлено поле _cluster_config_

_Resource_ функция **decort_k8s_cp** служит для управления control plane кластера k8s. Функция позволяет:

- Создать кластер
- Удалить кластер
- Настроить мастер-узел
- Изменить кол-во ВМ в мастер-узле

Созданный с помощью данного ресурса кластер не имеет стандартных рабочих узлов и логики управления ими. Для управления worker-группами используется отдельный ресурс `decort_k8s_wg`. <br/>
**!** При удалении ресурса `decort_k8s_cp` удалится сам кластер и все зависимые ресурсы (worker-группы) <br/>
**!** При использовании `decort_k8s_cp` не рекомендуется параллельное использование `decort_k8s` для управления одним и тем же кластером во избежание проблем с идемпотентностью

**Данный способ управления кластерами стал предпочтительным с версии провайдера 4.2.0 - для упрощения процесса миграции обратитесь к [**статье.\*\*](https://repository.basistech.ru/BASIS/wiki-terraform-provider-decort/src/branch/main/4.10.3/05.07-Миграция-k8s-кластеров-на-версию-4.2.0.md)

## Работа с cluster_config

Для использования cluster_config конфигурации, следует:

1. Создать файл с расширением `.json` в рабочей директории.
2. Описать в созданном файле конфигурацию cluster_config в формате JSON:

### cluster_config.json

```json
{
  "apiServer": {
    "extraArgs": {
      "oidc-issuer-url": "https://dex.decs.local/",
      "oidc-client-id": "dex",
      "oidc-username-claim": "email",
      "oidc-groups-claim": "groups",
      "oidc-ca-file": "/etc/kubernetes/ssl/kc-ca.pem"
    }
  }
}
```

3. Указать путь до файла `cluster_config.json` в качестве значения параметра `cluster_config` в ресурсе `decort_k8s`:

```terraform
resource "decort_k8s" "cluster1" {
   # ...

   cluster_config = file("cluster_config.json")

   # ...
}
```

4. Выполнить `terraform apply`

## Работа с oidc\_\_cert

Для работы с oidc_cert следует:

1. Создать файл с ssl-сертификатом в формате x509 pem c названием ca.crt в рабочей директории

### ca.crt

Пример содержания файла ca.crt

```
-----BEGIN CERTIFICATE-----
MIIDzTCCArWgAwIBAgIUUW9bFlExT8f/gVX4OrYXegInXi0wDQYJKoZIhvcNAQEL
BQAwdjELMAkGA1UEBhMCUlUxDzANBgNVBAgMBk1vc2NvdzEPMA0GA1UEBwwGTW9z
Y293MQwwCgYDVQQKDANBQkMxDDAKBgNVBAsMA0FCQzEMMAoGA1UEAwwDQUJDMRsw
GQYJKoZIhvcNAQkBFgxBQkNAbWFpbC5jb20wHhcNMjMwOTI2MTQ0MzM2WhcNMjQw
OTI1MTQ0MzM2WjB2MQswCQYDVQQGEwJSVTEPMA0GA1UECAwGTW9zY293MQ8wDQYD
VQQHDAZNb3Njb3cxDDAKBgNVBAoMA0FCQzEMMAoGA1UECwwDQUJDMQwwCgYDVQQD
DANBQkMxGzAZBgkqhkiG9w0BCQEWDEFCQ0BtYWlsLmNvbTCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAOUGj6B7sBrAYBuAQ4I0f6plcrLG33cNGzcktZrS
SZRWOMwXzBCUNNOBKXZHnapUAoZW23BllpZ/y50Y01JAggdBPbODw864ZROJMt3P
xlZZJQghraFUF8H/ANsmRzfh3nD98fBSr4YUg2VGEwg+Qvzh2peiNBRer4tD6QuV
BqiJZyUNrz0JUKmFZF/uTM4rNRhmF7y95A49GDZeIzwFFARSMkQPtIjMj8h75fs3
PD41wEkQyV5SSM3YMGQeqp/7ay10ec31s6cn/PBB8bF8PTVYc+hJOfNuVrkm8CqG
w1kzKg+7ztgcCMOEL2yftgckg5PSFMQ+5RPgBieEOj3IDHsCAwEAAaNTMFEwHQYD
VR0OBBYEFPLv18WpzpwIGhqlM2EAHl7TXgNnMB8GA1UdIwQYMBaAFPLv18WpzpwI
GhqlM2EAHl7TXgNnMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB
ADbH2Y4ExwEllkKrQ+VcyajjPXV9vcG5Ag+/9DUM0aFCO4H0ZzdBKHVCGMwIx5sS
gLSLx2zoT2F3oTHaJ4T9iVx+sBleKZZbpApO51dLaVSiy69cfkZy/GOMiWuEEZPU
UdGTMAAoM1+gqx8n0EsGf96zJZ+PtjHi6RdNmPBnuRRvRRPXQKNLJF1kYDgYlFdH
KxLl/lm/Y0zhV/VNd7OXsV0LAsyrRiNpuyCaniCOTR1ZRkD4UfWkc/bbNgbLjAfb
8Y0SjvSiYpFPE0DQv0ksSrhySJtyCy71UTGzSHI+tRB9LwhnDiijAoT7LnxQgNq8
5IdaZNyYvyGubkczwBrFddU=
-----END CERTIFICATE-----
```

2. Указать путь до файла `ca.crt` в качестве значениея параметра `oidc_cert` в ресурсе `decort_k8s`

```terraform
resource "decort_k8s" "cluster1" {
   # ...

   oidc_cert = file("ca.crt")

   # ...
}
```

3. Выполнить `terraform apply`

## Работа в параллельном режиме

Рекомендуется создавать одновременно не более одного экземпляра ресурса.
В случае необходимости создания нескольких ресурсов одновременно, необходимо запускать `terraform apply/plan` в режиме `-parallelism=1`.

## Аргументы

_Resource_ функция **decort_k8s_cp** принимает следующие аргументы:

| Аргумент | Тип | Обязательный | Описание |
| --- | --- | :----------------: | --- |
| name | string | :heavy_check_mark: | Наименование кластера |
| k8sci_id | int | :heavy_check_mark: | ID k8s CI |
| network_plugin | string | :heavy_check_mark: | Плагин сети ("flannel", "weavenet" или "calico") |
| rg_id | int | :heavy_check_mark: | ID ресурсной группы |
| storage_policy_id | int | :heavy_check_mark: | ID политики хранения |
| num | int | :x: | Кол-во ВМ в мастер-узле |
| cpu | int | :x: | Кол-во ядер для мастер-узла |
| ram | int | :x: | Кол-во RAM (в мб) для мастер-узла |
| disk | int | :x: | Размер диска мастер-узла |
| sep_id | int | :x: | Storage Endpoint ID мастер-узла |
| sep_pool | string | :x: | SEP пул мастер-узла |
| with_lb | bool | :x: | Создать кластер с/без балансировщика нагрузки |
| extnet_id | int | :x: | ID внешний сети для подключения worker'ов |
| vins_id | int | :x: | ID виртуальной  сети для соединения workers.<br/>Если не задано,<br/>то сеть будет выбрана платформой. |
| cloud_init | string | :x: | Используется на этапе создания вм.<br/>Параметры для утилиты _cloud_init_, которая используется на платформе DECORT для первичного конфигурирования виртуальной машины после её создания |
| init_config | string | :x: | Используется для определения настроек и действий, которые должны быть выполнены перед запуском любого другого компонента в кластере, это позволяет вам настраивать такие вещи, как регистрация node, настройка network и другие задачи инициализации |
| kubelet_config | string | :x: | Используется для настройки поведения и параметров Kubelet, который является агентом primary node, запускаемым на каждом node кластера он включает в себя такие параметры, как IP-адрес node, распределение ресурсов, политики удаления модулей и другие конфигурации, специфичные для Kubelet |
| kube_proxy_config | string | :x: | Используется для настройки поведения и параметров присоединения node к кластеру, он включает в себя такие параметры, как режим прокси-сервера, диапазоны IP-адресов кластера и другие конфигурации, специфичные для Kube-proxy |
| cluster_config | string | :x: | Используется для определения глобальных настроек и конфигураций для всего кластера. Она включает в себя такие параметры, как имя кластера, настройки DNS, методы аутентификации и другие конфигурации в масштабах кластера. вставьте допустимую строку JSON со всеми уровнями вложенности |
| join_config | string | :x: | Используется для настройки поведения и параметров присоединения node к кластеру, он включает в себя такие параметры, как cluster's control plane endpoint, токен и ключ сертификата |
| oidc_cert | string | :x: | ssl-сертификат в формате x509 pem |
| additional_sans | []string | :x: | Дополнительные SAN (Subject Alternative Names) для использования в процессе автоматического выписывания сертификата Кластера Kubernetes, возможность взаимодействовать с кластером по FQDN параметр получает список строк – IP-адреса и/или DNS (по формату RFC 1123 c поддержкой wildcard) |
| lb_sysctl_params | []map[string]interface{} | :x: | Пользовательские значения sysctl для балансировщика нагрузки, для применения настроек, необходимо перезагрузить балансировщик |
| desc | string | :x: | Описание кластера |  |
| oidc_cert | string | :x: | ssl-сертификат в формате x509 pem |
| extnet_only | bool | :x: | Использовать только extnet для работы кластера |
| ha_mode | bool | :x: | Режим высокой доступностью балансировщика нагрузки |
| start | bool | :x: | Старт/Стоп кластера |
| permanently | bool | :x: | Мгновенное удаление виртуальной машины, минуя корзину. Параметр считывается только при использовании команды `terraform destroy`, то есть только при удалении ресурса |
| zone_id | int | :x: | Идентификатор экземпляра zone |

## Возвращаемые значения

В случае успешного выполнения _resource_ функция **decort_k8s_cp** возвращает в указанную при вызове переменную следующие значения:

| Параметр | Тип | Описание |
| --- | --- | --- |
| acl | Struct{} [см. ниже](#описание-структуры-списка-acl) | acl |
| account_id | int | ID аккаунта |
| account_name | string | Имя аккаунта |
| bservice_id | int | ID bservice |
| k8sci_id | int | ID образа кластера |
| k8s_id | int | ID кластера |
| detailed_info | Struct{} [см.ниже](#описание-структуры-списка-detailed_info) | Информация о ВМ внутри мастер-узла |
| master_id | int | ID мастер-узла |
| master_name | string | Наименование мастер-узла |
| num | int | Кол-во ВМ в мастер-узле |
| cpu | int | Кол-во ядер для мастер-узла |
| ram | int | Кол-во RAM (в мб) для мастер-узла |
| disk | int | Размер диска мастер-узла |
| sep_id | int | Storage Endpoint ID мастер-узла |
| sep_pool | string | SEP пул мастер-узла |
| storage_policy_id | int | ID политики хранения |
| created_by | string | Кем был создан ресурс |
| created_time | int | Время создания ресурса |
| desc | string | Описание |
| deleted_by | string | Кем был удален ресурс |
| deleted_time | int | Время удаления ресурса |
| extnet_id | int | ID внешней сети |
| k8s_ci_name | string | Имя образа кластера |
| lb_id | int | ID балансировщика нагрзуки |
| lb_ip | string | IP балансировщика нагрзуки |
| name | string | Имя ресурса |
| network_plugin | string | Сетевой плагин |
| rg_id | int | ID ресурсной группы |
| rg_name | string | Имя ресурсной группы |
| status | string | Статус ресурса |
| tech_status | string | Технический статус ресурса |
| updated_by | string | Кем был обновлен ресурс |
| updated_time | int | Время последнего обновления ресурса |
| kubeconfig | string | Конфиг |
| vins_id | int | ID виртуальной сети |
| zone_id | int | Идентификатор экземпляра zone |

### Описание структуры списка acl

| Параметр | Тип | Описание |
| --- | --- | --- |
| explicit | bool | explicit |
| guid | string | ID ресурса |
| right | string | right |
| status | string | Статус ресурса |
| type | string | Тип ресурса |
| user_group_id | string | ID группы |

### Описание структуры списка detailed_info

| Параметр | Тип | Описание |
| --- | --- | --- |
| compute_id | int | ID компьюта в составе группы |
| name | string | Имя компьюта в составе группы |
| status | string | Статус компьюта в составе группы |
| tech_status | string | Статус компьюта в составе группы |
| interfaces | []Struct{} [см. ниже](#описание-структуры-списка-interfaces) | Список интерфейсов группы |
| natable_vins_ip | string | IP NAT |
| natable_vins_network | string | IP виртуальной сети |

### Описание структуры списка interfaces

| Параметр | Тип | Описание |
| --- | --- | --- |
| def_gw | string | Шлюз по умолчанию |
| ip_address | string | IP интерфейса |

## Пример использования

Пример вызова _resource_ функции **decort_k8s_cp**:

```terraform
resource "decort_k8s_cp" "cp" {
  #название кластера
  #обязательный параметр
  #тип - строка
  #используется при создании и обновлении
  name = "k8s-cp"

  #k8sCI ID
  #обязательный параметр
  #тип - целое число
  k8sci_id = 55

  #плагин сети (flannel, weavenet или calico)
  #обязательный параметр
  #тип - строка
  #используется при создании
  network_plugin = "flannel"

  #id ресурсной группы
  #обязательный параметр
  #тип - целое число
  #используется при создании
  rg_id = 1387

  #id политики хранения
  #обязательный параметр
  #тип - целое число
  #используется при создании
  storage_policy_id = 111 

  #кол-во ядер мастер-узла
  #опциональный параметр
  #тип - целое число
  #используется при создании
  #cpu = 2

  #объем RAM мастер-узла, в МБ
  #опциональный параметр
  #тип - целое число
  #используется при создании
  #ram = 2048

  #кол-во ВМ мастер-узла (1, 3 или 5)
  #опциональный параметр
  #тип - целое число
  #используется при создании и обновлении
  #num = 1

  #размер диска мастер-узла, в ГБ
  #опциональный параметр
  #тип - целое число
  #используется при создании
  #disk = 10

  #описание кластера
  #опциональный параметр
  #тип - строка
  #используется при создании и обновлении
  #desc = "<DESCRIPTION>"

  #id extnet
  #опциональный параметр
  #тип - целое число
  #используется при создании
  #extnet_id = 0

  #id vins
  #опциональный параметр
  #тип - целое число
  #используется при создании
  #vins_id = 1234

  #storage Endpoint ID
  #опциональный параметр
  #тип - целое число
  #используется при создании
  #sep_id = 0

  #SEP Pool
  #опциональный параметр
  #тип - строка
  #используется при создании
  #sep_pool = "pool"

  #старт/стоп кластера
  #опциональный параметр
  #тип - булев
  #используется при создании и обновлении
  #start = true

  #создать кластер с/без балансировщика нагрузки
  #опциональный параметр
  #тип - булев
  #используется при создании
  #with_lb = true

  #позволяет создать схему отказоустройчивой LB
  #опциональный параметр
  #тип - булев
  #используется при создании
  #ha_mode = true

  #дополнительные SAN (Subject Alternative Names) для использования в процессе автоматического выписывания сертификата Кластера Kubernetes;
  #возможность взаимодействовать с кластером по FQDN
  #параметр получает список строк – IP-адреса и/или DNS (по формату RFC 1123 c поддержкой wildcard)
  #опциональный параметр
  #тип - массив строк
  #используется при создании
  #additional_sans = ["192.168.201.0","192.168.201.1"]

  #используется для определения настроек и действий, которые должны быть выполнены перед запуском любого другого компонента в кластере
  #это позволяет вам настраивать такие вещи, как регистрация node, настройка network и другие задачи инициализации
  #опциональный параметр
  #тип - строка
  #используется при создании
  #init_config = "{JSON string}"

  #используется для определения глобальных настроек и конфигураций для всего кластера
  #он включает в себя такие параметры, как имя кластера, настройки DNS, методы аутентификации и другие конфигурации в масштабах кластера
  #опциональный параметр
  #тип - строка
  #используется при создании
  #cluster_config = "{JSON string}"

  #используется для настройки поведения и параметров Kubelet, который является агентом primary node, запускаемым на каждом node кластера
  #он включает в себя такие параметры, как IP-адрес node, распределение ресурсов, политики удаления модулей и другие конфигурации, специфичные для Kubelet
  #опциональный параметр
  #тип - строка
  #используется при создании
  #kubelet_config = "{JSON string}"

  #используется для настройки поведения и параметров присоединения node к кластеру
  #он включает в себя такие параметры, как режим прокси-сервера, диапазоны IP-адресов кластера и другие конфигурации, специфичные для Kube-proxy
  #опциональный параметр
  #тип - строка
  #используется при создании
  #kube_proxy_config = "{JSON string}"

  #используется для настройки поведения и параметров присоединения node к кластеру
  #он включает в себя такие параметры, как cluster's control plane endpoint, токен и ключ сертификата
  #опциональный параметр
  #тип - строка
  #используется при создании
  #join_config = "{JSON string}"

  #при создании кластре использовать подключение только к сети ExtNet
  #опциональный параметр
  #тип - булев
  #используется при создании
  #extnet_only = true

  #добавить ssl-сертификат в формате x509 pem
  #опциональный параметр
  #тип - файл с форматом в виде x509 pem
  #используется при создании
  #oidc_cert = file("ca.crt")

  #пользовательские значения sysctl для LB
  #опциональный параметр
  #тип - список мап
  #используется при создании и обновлении
  #lb_sysctl_params = [{ key1 = "value1", key2 = "value2" }]

  #флаг для удаления кластера, без возможности восстановления
  #опциональный параметр
  #тип - булев
  #используется при удалении
  #permanently = true
  
  #идентификатор экземпляра zone 
  #опциональный параметр
  #тип - целое число 
  #используется при создании и обновлении
  #zone_id = 1111

}
```

После успешного завершения такого вызова **decort_k8s_cp** в переменной `decort_k8s_cp.cp` будут сохранены возвращаемые значения.
