Создание ВМ и группы ВМ с Container Optimized Image с помощью Terraform
Чтобы с помощью Terraform создать конфигурации и запустить виртуальную машину или группу виртуальных машин на базе образа Container Optimized Image, выполните следующие действия.
Перед началом работы
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
В сценарии используется конфигурационный файл с названием example.tf
, который находится в директории ~/cloud-terraform
.
Создание и запуск виртуальной машины с образом Container Optimized Image
Создайте файлы конфигурации ВМ
-
Используйте образ Container Optimized Image из семейства образов Yandex Cloud. Для этого в конфигурационный файл
example.tf
добавьте строки:data "yandex_compute_image" "container-optimized-image" { family = "container-optimized-image" }
-
Опишите ВМ, добавив в конфигурационный файл
example.tf
строки:resource "yandex_compute_instance" "instance-based-on-coi" { boot_disk { initialize_params { image_id = data.yandex_compute_image.container-optimized-image.id } } network_interface { subnet_id = "<идентификатор_подсети>" nat = true } resources { cores = 2 memory = 2 } metadata = { docker-container-declaration = file("${path.module}/declaration.yaml") user-data = file("${path.module}/cloud_config.yaml") } }
Где
subnet_id
— идентификатор подсети.Если вы используете Docker Compose спецификацию, то ключ
docker-container-declaration
вmetadata
необходимо заменить на ключdocker-compose
:metadata = { docker-compose = file("${path.module}/docker-compose.yaml") user-data = file("${path.module}/cloud_config.yaml") }
-
Создайте файл спецификации облака
cloud_config.yaml
в директории~/cloud-terraform
. Опишите спецификацию:#cloud-config ssh_pwauth: no users: - name: yc-user sudo: ALL=(ALL) NOPASSWD:ALL shell: /bin/bash ssh_authorized_keys: - "<публичный_SSH-ключ>"
Где
ssh_authorized_keys
— значение публичного SSH-ключа. -
Создайте файл спецификации Container Optimized Image с именем
declaration.yaml
в директории~/cloud-terraform
. Опишите спецификацию:spec: containers: - image: cr.yandex/yc/demo/coi:v1 securityContext: privileged: false stdin: false tty: false
-
Создайте файл
output.tf
в директории~/cloud-terraform
, чтобы отобразить публичный IP-адрес ВМ:output "external_ip" { value = yandex_compute_instance.instance-based-on-coi.network_interface.0.nat_ip_address }
Создайте ВМ с Container Optimized Image
Запустите ВМ с Container Optimized Image, используя конфигурацию Terraform.
-
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в директорию
~/cloud-terraform
с конфигурационными файлами:cd /Users/<имя_пользователя>/cloud-terraform
-
Выполните проверку с помощью команды:
terraform plan
Результат:
Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. ... Note: You didn't specify an "-out" parameter to save this plan, so Terraform can't guarantee that exactly these actions will be performed if "terraform apply" is subsequently run.
-
-
Разверните ресурсы в Yandex Cloud.
-
Выполните команду:
terraform apply
Результат:
data.yandex_compute_image.container-optimized-image: Refreshing state... An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: ... Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value:
-
Подтвердите создание ресурсов. Для этого введите значение
yes
:Enter a value: yes
Результат:
yandex_compute_instance.instance-based-on-coi: Creating... yandex_compute_instance.instance-based-on-coi: Still creating... [10s elapsed] yandex_compute_instance.instance-based-on-coi: Still creating... [20s elapsed] ... Apply complete! Resources: 1 added, 0 changed, 0 destroyed. Outputs: external_ip = <публичный_IP-адрес>
В каталоге будут созданы требуемые ресурсы. При создании ВМ назначаются публичный IP-адрес и имя хоста (FQDN).
-
-
Проверьте ресурсы и их настройки в консоли управления
. -
Подключитесь к ВМ с образом Container Optimized Image.
-
Выполните команду:
ssh yc-user@<публичный_IP-адрес>
Результат:
The authenticity of host '<публичный_IP-адрес> (<публичный_IP-адрес>)' can't be established. ECDSA key fingerprint is SHA256:JPq.... Are you sure you want to continue connecting (yes/no/[fingerprint])?
-
Подтвердите подключение к ВМ. Для этого введите значение
yes
:Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Результат:
Warning: Permanently added '<публичный_IP-адрес>' (ECDSA) to the list of known hosts. Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 5.4.0-52-generic x86_64) * Documentation: https://help.ubuntu.com ... Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law.
-
-
Выполните HTTP-запрос к ВМ:
curl <публичный_IP-адрес>
Результат:
<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="refresh" content="3"> <title>Yandex.Scale</title> </head> <body> <h1>Hello v1</h1> </body> </html>
Создание и запуск группы виртуальных машин с образом Container Optimized Image
Создайте файлы конфигурации группы ВМ
-
Сохраните конфигурационный файл с именем
example.tf
в директории~/cloud-terraform
:provider "yandex" { token = "<OAuth-токен>" cloud_id = "<идентификатор_облака>" folder_id = "<идентификатор_каталога>" zone = "ru-central1-a" } data "yandex_compute_image" "container-optimized-image" { family = "container-optimized-image" } resource "yandex_compute_instance_group" "ig-with-coi" { name = "ig-with-coi" folder_id = "<идентификатор_каталога>" service_account_id = "<идентификатор_сервисного_аккаунта>" instance_template { platform_id = "standard-v3" resources { memory = 2 cores = 2 } boot_disk { mode = "READ_WRITE" initialize_params { image_id = data.yandex_compute_image.container-optimized-image.id } } network_interface { network_id = "<идентификатор_сети>" subnet_ids = ["<идентификаторы_подсетей>"] nat = true } metadata = { docker-container-declaration = file("${path.module}/declaration.yaml") user-data = file("${path.module}/cloud_config.yaml") } } scale_policy { fixed_scale { size = 2 } } allocation_policy { zones = ["<зоны_доступности>"] } deploy_policy { max_unavailable = 2 max_creating = 2 max_expansion = 2 max_deleting = 2 } }
Где:
token
— OAuth-токен для доступа к Yandex Cloud.name
— имя группы ВМ.folder_id
— идентификатор каталога.instance_template.network_interface.network_id
— идентификатор сети.instance_template.network_interface.subnet_ids
— список идентификаторов подсетей.instance_template.service_account_id
— идентификатор сервисного аккаунта, авторизованного для данной группы ВМ.allocation_policy.zones
— список зон доступности.
-
Используйте файлы
cloud_config.yaml
иdeclaration.yaml
из раздела Создайте файлы конфигурации ВМ. -
Создайте файл
output.tf
в директории~/cloud-terraform
, чтобы отобразить публичные IP-адреса каждой ВМ из группы:output "external_ip" { value = [yandex_compute_instance_group.ig-with-coi.instances[*].network_interface[0].nat_ip_address] }
Создайте группу ВМ с Container Optimized Image
Запустите группу ВМ с Container Optimized Image, используя конфигурацию Terraform.
-
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в директорию
~/cloud-terraform
с конфигурационными файлами:cd /Users/<имя_пользователя>/cloud-terraform
-
Выполните проверку с помощью команды:
terraform plan
Результат:
Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. ... Note: You didn't specify an "-out" parameter to save this plan, so Terraform can't guarantee that exactly these actions will be performed if "terraform apply" is subsequently run.
-
-
Разверните ресурсы в Yandex Cloud.
-
Выполните команду:
terraform apply
Результат:
data.yandex_compute_image.container-optimized-image: Refreshing state... An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: ... Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value:
-
Подтвердите создание ресурсов. Для этого введите значение
yes
:Enter a value: yes
Результат:
yandex_compute_instance_group.ig-with-coi: Creating... yandex_compute_instance_group.ig-with-coi: Still creating... [10s elapsed] yandex_compute_instance_group.ig-with-coi: Still creating... [20s elapsed] ... external_ip = [ [ "<публичный_IP-адрес_ВМ_1>", "<публичный_IP-адрес_ВМ_2>", ], ]
В каталоге будут созданы требуемые ресурсы. При создании каждой ВМ назначаются публичный IP-адрес и имя хоста (FQDN).
-
-
Проверьте ресурсы и их настройки в консоли управления
. -
Подключитесь к одной из ВМ с образом Container Optimized Image.
-
Выполните команду:
ssh yc-user@<публичный_IP-адрес_ВМ_1>
Результат:
The authenticity of host '<публичный_IP-адрес_ВМ_1> (<публичный_IP-адрес_ВМ_1>)' can't be established. ECDSA key fingerprint is SHA256:JPq.... Are you sure you want to continue connecting (yes/no/[fingerprint])?
-
Подтвердите подключение к ВМ. Для этого введите значение
yes
:Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Результат:
Warning: Permanently added '<публичный_IP-адрес_ВМ_1>' (ECDSA) to the list of known hosts. Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 5.4.0-52-generic x86_64) * Documentation: https://help.ubuntu.com ... Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law.
-
-
Выполните HTTP-запрос к одной из ВМ группы:
curl <публичный_IP-адрес_ВМ_1>
Результат:
<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="refresh" content="3"> <title>Yandex.Scale</title> </head> <body> <h1>Hello v1</h1> </body> </html>