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

_Resource_ функция **decort_k8s** служит для управления кластером.

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

- добавлено поле _extnet_only_
- добавлено поле _oidc_cert_
- добавлено поле _cloud_init_
- добавлено поле _ha_mode_
- добавлено поле _cluster_config_

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

- Добавлена возможность создавать/удалять воркер-группы напрямую из ресурса k8s
- Исправлены возможные ошибки состояния при модификации воркер-групп

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

- В аргументы добавлено опциональное поле labels.
- В аргументы добавлено опциональное поле taints.
- В аргументы добавлено опциональное поле annotations.
- В аргументы добавлено опциональное поле sep_id в блоке masters.
- В аргументы добавлено опциональное поле sep_pool в блоке masters.
- В аргументы добавлено опциональное поле sep_id в блоке workers.
- В аргументы добавлено опциональное поле sep_pool в блоке workers.

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

- Добавлен id виртуальной сети, которая используется с кластером k8s.
- Добавлены описания IP адресов для группы воркеров.
- Добавлены описания IP адресов для группы мастеров.
- Добавлены описания IP адресов виртуальной сети, которая присоеденена к группе воркеров.

### Работа с 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`

### Работа с cloud_init

Cloud Init позволяет запустить ВМ с предустановленными настройками пользователя, группами и доступами. Подробнее про настройку cloud_init можно прочесть по [ссылке](https://cloudinit.readthedocs.io/en/latest/reference/examples.html).

**Пароли, указанные в cloud_init не сохраняются на платформе и не отображаются в API!**

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

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

### initconfig.tftpl

```
---
users:
- groups: users, wheel
  name: user
  plain_text_passwd: examplePassword
  primary_group: user
  ssh_authorized_keys:
  - ssh-rsa EXAMPLE%id_rsa.pub
  sudo: ALL=(ALL) NOPASSWD:ALL

```

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

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

   cloud_init = file("initconfig.tftpl")

   # ...
}
```

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

**Конфигурация cloud_init применяется только при создании кластера, во всех остальных случаях - игнорируется**

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

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

## Аргументы

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

| Аргумент       | Тип                                          | Обязательный       | Описание                                                                                                                                                                                                                                                                                   |
| -------------- | -------------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| name           | string                                       | :heavy_check_mark: | Наименование кластера, <br/>при изменении - изменяет наименование кластера                                                                                                                                                                                                                 |
| rg_id          | int                                          | :heavy_check_mark: | ID ресурсной группы                                                                                                                                                                                                                                                                        |
| k8sci_id       | int                                          | :heavy_check_mark: | ID catalogue item                                                                                                                                                                                                                                                                          |
| wg_name        | string                                       | :heavy_check_mark: | Имя для первой worker group, <br/> созданной в кластере                                                                                                                                                                                                                                    |
| network_plugin | string                                       | :heavy_check_mark: | Плагин сети для кластера. Допустимые значения: flannel, calico, weavenet                                                                                                                                                                                                                   |
| labels         | []string                                     | :x:                | Список меток для дефолтной worker-группы k8s                                                                                                                                                                                                                                               |
| taints         | []string                                     | :x:                | Список taints для дефолтной worker-группы k8s                                                                                                                                                                                                                                              |
| annotations    | []string                                     | :x:                | Список аннотаций дефолтной worker-группы k8s                                                                                                                                                                                                                                               |
| masters        | Struct{} [см. ниже](#описание-блока-masters) | :x:                | Настройка мастер-группы                                                                                                                                                                                                                                                                    |
| workers        | Struct{} [см. ниже](#описание-блока-workers) | :x:                | Настройка worker-групп                                                                                                                                                                                                                                                                     |
| extnet_id      | int                                          | :x:                | ID внешней сети для соединения workers.<br/>Если не задано,<br/>то сеть будет выбрана платформой.                                                                                                                                                                                          |
| cloud_init     | string                                       | :x:                | Используется на этапе создания вм.<br/>Параметры для утилиты _cloud_init_, которая используется в платформе DECORT для первичного конфигурирования виртуальной машины после её создания.                                                                                                   |
| cluster_config | string                                       | :x:                | используется для определения глобальных настроек и конфигураций для всего кластера. Она включает в себя такие параметры, как имя кластера, настройки DNS, методы аутентификации и другие конфигурации в масштабах кластера. вставьте допустимую строку JSON со всеми уровнями вложенности. |
| oidc_cert      | string                                       | :x:                | ssl-сертификат в формате x509 pem                                                                                                                                                                                                                                                          |
| extnet_only    | bool                                         | :x:                | Использовать только extnet для работы кластера                                                                                                                                                                                                                                             |
| ha_mode        | bool                                         | :x:                | Режим высокой доступностью балансировщика нагрузки                                                                                                                                                                                                                                         |
| start          | bool                                         | :x:                | Старт/Стоп кластера                                                                                                                                                                                                                                                                        |

### Описание блока masters

| Аргумент | Тип    | Обязательный       | Описание                 |
| -------- | ------ | ------------------ | ------------------------ |
| num      | int    | :heavy_check_mark: | Количество nodes         |
| cpu      | int    | :heavy_check_mark: | Количество cpu           |
| ram      | int    | :heavy_check_mark: | Количество RAM в Mбайтах |
| disk     | int    | :heavy_check_mark: | Объем boot диска в ГБ    |
| sep_id   | int    | :x:                | Идентификатор SEP        |
| sep_pool | string | :x:                | Название SEP pool'а      |

### Описание блока workers

| Аргумент    | Тип      | Обязательный       | Описание                   |
| ----------- | -------- | ------------------ | -------------------------- |
| name        | string   | :heavy_check_mark: | Наименование воркер-группы |
| num         | int      | :heavy_check_mark: | Количество nodes           |
| cpu         | int      | :heavy_check_mark: | Количество cpu             |
| ram         | int      | :heavy_check_mark: | Количество RAM в Mбайтах   |
| disk        | int      | :heavy_check_mark: | Объем boot диска в ГБ      |
| sep_id      | int      | :x:                | Идентификатор SEP          |
| sep_pool    | string   | :x:                | Название SEP pool'а        |
| labels      | []string | :x:                | Список labels              |
| annotations | []string | :x:                | Список annotations         |
| taints      | []string | :x:                | Список taints              |

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

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

| Параметр       | Тип                                                | Описание                            |
| -------------- | -------------------------------------------------- | ----------------------------------- |
| acl            | Struct{} [см. ниже](#описание-структуры-acl)       | acl                                 |
| account_id     | int                                                | ID аккаунта                         |
| account_name   | string                                             | Имя аккаунта                        |
| bservice_id    | int                                                | ID bservice                         |
| k8sci_id       | int                                                | ID образа кластера                  |
| created_by     | string                                             | Кем был создан ресурс               |
| created_time   | int                                                | Время создания ресурса              |
| deleted_by     | string                                             | Кем был удален ресурс               |
| deleted_time   | int                                                | Время удаления ресурса              |
| extnet_id      | int                                                | ID внешней сети                     |
| k8s_ci_name    | string                                             | Имя образа кластера                 |
| masters        | []Struct{} [см. ниже](#описание-структуры-masters) | Структура компьютов мастеров        |
| workers        | []Struct{} [см. ниже](#описание-структуры-workers) | Структура компьютов воркеров        |
| 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 виртуальной сети                 |

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

| Параметр    | Тип                                                   | Описание    |
| ----------- | ----------------------------------------------------- | ----------- |
| account_acl | []Struct{} [см. ниже](#описание-структуры-списка-acl) | account_acl |
| k8s_acl     | []Struct{} [см. ниже](#описание-структуры-списка-acl) | k8s_acl     |
| rg_acl      | []Struct{} [см. ниже](#описание-структуры-списка-acl) | rg_acl      |

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

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

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

| Параметр      | Тип                                                             | Описание                              |
| ------------- | --------------------------------------------------------------- | ------------------------------------- |
| cpu           | int                                                             | Кол-во cpu на компьютах master        |
| detailed_info | []Struct{} [см. ниже](#описание-структуры-списка-detailed_info) | Детальная информация masters          |
| disk          | int                                                             | ID диска                              |
| master_id     | int                                                             | ID группы master                      |
| name          | string                                                          | Имя группы master                     |
| num           | int                                                             | Кол-во компьютов в группе master      |
| ram           | int                                                             | Кол-во Ram на компьютах группы master |

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

| Параметр      | Тип                                                             | Описание                               |
| ------------- | --------------------------------------------------------------- | -------------------------------------- |
| annotations   | []string                                                        | Аннотации группы workers               |
| cpu           | int                                                             | Кол-во cpu на компьютах workers        |
| detailed_info | []Struct{} [см. ниже](#описание-структуры-списка-detailed_info) | Детальная информация masters           |
| disk          | int                                                             | ID диска                               |
| guid          | string                                                          | ID ресурса                             |
| id            | int                                                             | ID группы workers                      |
| labels        | []string                                                        | Лейблы группы workers                  |
| name          | string                                                          | Имя ресурса                            |
| num           | int                                                             | Кол-во компьютов в группе workers      |
| ram           | int                                                             | Кол-во Ram на компьютах группы workers |
| taints        | []string                                                        | огранечители группы workers            |

### Описание структуры списка 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**:

```terraform
resource "decort_k8s" "cluster" {
  #имя кластера
  #обязательный параметр
  #при изменении - обновляет имя кластера
  #тип - строка
  name = "tftest"

  #id resource group
  #обязательный параметр
  #тип - число
  rg_id = 776

  #id catalogue item
  #обязательный параметр
  #тип - число
  k8sci_id = 9

  #сетевой плагин
  #обязательный параметр
  #тип - строка
  network_plugin = "flannel"

  #имя для первой worker group, созданной в кластере
  #обязательный параметр
  #тип - строка
  wg_name = "workers_wg"

  # список labels для дефолтной worker группы
  # опциональный параметр
  # В скором времени параметры labels, annotations, taints будут полностью перенесены в блок workers
  # тип - массив строк
  labels = ["key1=val1", "key2=val2"]

  # список annotations для дефолтной worker группы
  # опциональный параметр
  # В скором времени параметры labels, annotations, taints будут полностью перенесены в блок workers
  # тип - массив строк
  annotations = ["key1=val1", "key2=val2"]

  # список taints для дефолтной worker группы
  # опциональный параметр
  # В скором времени параметры labels, annotations, taints будут полностью перенесены в блок workers
  # тип - массив строк
  taints = ["key1=val1", "key2=val2"]

  #настройка мастер node
  #опциональный параметр
  #максимальное кол-во элементов - 1
  #тип - список нод
  masters {
    #кол-во node
    #обязательный параметр
    #тип - число
    num = 1

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

    #Идентификатор SEP
    #опциональный параметр
    #тип - число
    sep_id = 1010

    #Имя SEP pool'a
    #опциональный параметр
    #тип - строка
    sep_pool = "data01"

    #кол-во RAM в Мбайтах
    #обязательный параметр
    #тип - число
    ram = 2048


    #размер диска в Гбайтах
    #обязательный параметр
    #тип - число
    disk = 10
  }

  # настройка worker группы
  # опциональный параметр
  # Первая указанная воркер-группа должна соответствовать изначально созданной вместе с кластером.
  # labels, annotations, taints для дефолтной worker группы указываются в корне ресурса при создании кластера.
  workers {
  	#наименование worker группы
	#обязательный параметр
	#тип - строка
  	name = "workers_wg"

    #кол-во node
    #обязательный параметр
    #тип - число
    num = 1

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

    #кол-во RAM в Мбайтах
    #обязательный параметр
    #тип - число
    ram = 2048

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

    #Идентификатор SEP
    #опциональный параметр
    #тип - число
    sep_id = 1010

    #Имя SEP pool'a
    #опциональный параметр
    #тип - строка
    sep_pool = "data01"

	#Список лейблов
	#опциональный параметр
	#тип - массив строк
	labels = ["label1=value1", "label2=value2"]

	#Список аннотаций
	#опциональный параметр
	#тип - массив строк
	annotations = ["key1=value1", "key2=value2"]

	#Список taints
	#опциональный параметр
	#тип - массив строк
	taints = ["key1=value1:NoSchedule", "key2=value2:NoExecute"]
  }

  #...Далее можно создавать произвольное кол-во дополнительных worker групп
  # labels, annotations и taints для последующих групп указываются непосредственно в блоке workers
  workers {
  	#наименование worker группы
	#обязательный параметр
	#тип - строка
  	name = "additional_wg"

    #кол-во node
    #обязательный параметр
    #тип - число
    num = 2

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

    #кол-во RAM в Мбайтах
    #обязательный параметр
    #тип - число
    ram = 4096

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

    #Идентификатор SEP
    #опциональный параметр
    #тип - число
    sep_id = 1010

    #Имя SEP pool'a
    #опциональный параметр
    #тип - строка
    sep_pool = "data01"

	#Список лейблов
	#опциональный параметр
	#тип - массив строк
	labels = ["label1=value1", "label2=value2"]

	#Список аннотаций
	#опциональный параметр
	#тип - массив строк
	annotations = ["key1=value1", "key2=value2"]

	#Список taints
	#опциональный параметр
	#тип - массив строк
	taints = ["key1=value1:NoSchedule", "key2=value2:NoExecute"]
  }
}
```

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