Работа с группой виртуальных машин с автоматическим масштабированием
- Подготовьте облако к работе
- Подготовьте окружение
- Создайте группу ВМ с автоматическим масштабированием и сетевым балансировщиком нагрузки
- Подключите сетевой балансировщик нагрузки с целевой группой
- Проверьте работу группы ВМ и сетевого балансировщика
- Удалите инфраструктуру
- Как создать инфраструктуру с помощью Terraform
В этом руководстве вы развернете группу ВМ с политикой автоматического масштабирования при превышении допустимой нагрузки.
ВМ будут развернуты в двух зонах доступности, а нагрузка на них будет регулироваться с помощью сетевого балансировщика нагрузки Yandex Network Load Balancer.
Чтобы создать группу ВМ:
- Подготовьте облако к работе.
- Подготовьте окружение.
- Создайте группу ВМ с автоматическим масштабированием и сетевым балансировщиком нагрузки.
- Подключите сетевой балансировщик нагрузки с целевой группой.
- Проверьте работу группы ВМ и сетевого балансировщика.
- Проверьте работу автоматического масштабирования.
Если созданные ресурсы вам больше не нужны, удалите их.
Также инфраструктуру для масштабирования группы ВМ можно развернуть через Terraform с помощью готового файла конфигурации.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите его.
-
Чтобы скрипты из пошагового руководства работали корректно, скачайте и установите утилиту jq
. -
Чтобы проверить работу автоматического масштабирования, установите утилиту wrk
для проведения нагрузочного тестирования.
Подготовьте окружение
-
Создайте сервисный аккаунт с именем
for-autoscale
и назначьте ему рольeditor
:Консоль управленияCLITerraformAPI- В консоли управления
выберите каталог, в котором вы хотите создать сервисный аккаунт. - В верхней части экрана перейдите на вкладку Сервисные аккаунты.
- Нажмите кнопку Создать сервисный аккаунт.
- В открывшемся окне:
- В поле Имя укажите
for-autoscale
. - Чтобы назначить сервисному аккаунту роль на текущий каталог, нажмите
Добавить роль и выберите рольeditor
. - Нажмите кнопку Создать.
- В поле Имя укажите
-
Создайте сервисный аккаунт:
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
.yc iam service-account create --name for-autoscale
Результат:
id: ajelabcde12f******** folder_id: b0g12ga82bcv******** created_at: "2020-11-30T14:32:18.900092Z" name: for-autoscale
-
Назначьте роль сервисному аккаунту:
yc resource-manager folder add-access-binding b1g23ga82bcv******** \ --role editor \ --subject serviceAccount:ajelabcde12f********
См. раздел Как создать инфраструктуру с помощью Terraform.
Воспользуйтесь методом REST API create для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/Create.
- В консоли управления
-
Создайте сеть с именем
yc-auto-network
и подсети в двух зонах доступности:Консоль управленияCLITerraformAPI- В консоли управления
выберите каталог, в котором вы хотите создать сеть. - Выберите сервис Virtual Private Cloud.
- Нажмите кнопку Создать сеть.
- В поле Имя задайте имя сети
yc-auto-network
. - В поле Дополнительно включите опцию Создать подсети.
- Нажмите кнопку Создать сеть.
-
Создайте сеть:
yc vpc network create --name yc-auto-network
Результат:
id: enpabce123hd******** folder_id: b0g12ga82bcv******** created_at: "2020-11-30T14:57:15Z" name: yc-auto-network
-
Создайте подсеть в зоне доступности
ru-central1-a
:yc vpc subnet create \ --network-id enpabce123hd******** \ --range 192.168.1.0/24 \ --zone ru-central1-a
Результат:
id: e1lnabc23r1c******** folder_id: b0g12ga82bcv******** created_at: "2020-11-30T16:23:12Z" network_id: enpabce123hd******** zone_id: ru-central1-a v4_cidr_blocks: - 192.168.1.0/24
-
Создайте подсеть в зоне доступности
ru-central1-b
:yc vpc subnet create \ --network-id enpabce123hd******** \ --range 192.168.2.0/24 \ --zone ru-central1-b
Результат:
id: b1csa2b3clid******** folder_id: b0g12ga82bcv******** created_at: "2020-11-30T16:25:02Z" network_id: enpabce123hd******** zone_id: ru-central1-b v4_cidr_blocks: - 192.168.2.0/24
См. раздел Как создать инфраструктуру с помощью Terraform.
-
Создайте сеть.
Воспользуйтесь методом REST API create для ресурса Network или вызовом gRPC API NetworkService/Create.
-
Создайте подсети в зонах доступности
ru-central1-a
иru-central1-b
.Воспользуйтесь методом REST API create для ресурса Subnet или вызовом gRPC API SubnetService/Create.
- В консоли управления
-
Создайте группу безопасности:
Консоль управленияTerraform- В консоли управления
выберите сервис Virtual Private Cloud. - Откройте вкладку Группы безопасности.
- Создайте группу безопасности для балансировщика:
-
Нажмите кнопку Создать группу.
-
Укажите Имя группы:
sg-autoscale
. -
Выберите Сеть
yc-auto-network
. -
В блоке Правила создайте правила по инструкции под таблицей:
Направление
трафикаОписание Диапазон
портовПротокол Тип источника /
назначенияИсточник /
назначениеИсходящий any Весь Любой CIDR 0.0.0.0/0 Входящий ext-http 80 TCP CIDR 0.0.0.0/0 Входящий healthchecks 80 TCP Проверки состояния балансировщика — - Выберите вкладку Исходящий трафик или Входящий трафик.
- Нажмите кнопку Добавить правило.
- В открывшемся окне в поле Диапазон портов укажите один порт или диапазон портов, куда или откуда будет поступать трафик.
- В поле Протокол укажите нужный протокол или оставьте Любой, чтобы разрешить передачу трафика по всем протоколам.
- В поле Назначение или Источник выберите назначение правила:
- CIDR — правило будет применено к диапазону IP-адресов. В поле CIDR блоки укажите CIDR и маски подсетей, в которые или из которых будет поступать трафик. Чтобы добавить несколько CIDR, нажимайте кнопку Добавить CIDR.
- Группа безопасности — правило будет применено к ВМ из текущей группы или из выбранной группы безопасности.
- Проверки состояния балансировщика — правило, которое позволяет балансировщику проверять состояние ВМ.
- Нажмите кнопку Сохранить. Таким образом создайте все правила из таблицы.
-
Нажмите кнопку Сохранить.
-
См. раздел Как создать инфраструктуру с помощью Terraform.
- В консоли управления
Создайте группу ВМ с автоматическим масштабированием и сетевым балансировщиком нагрузки
-
Все ВМ группы создаются из образа Container Optimized Image. Каждая ВМ содержит Docker-контейнер с веб-сервером, который эмулирует нагрузку на сервис.
Узнайте идентификатор последней версии публичного образа Container Optimized Image.
Образ Container Optimized Image в реестре Container Registry может обновляться и меняться в соответствии с релизами. При этом образ на виртуальной машине не обновится автоматически до последней версии. Чтобы создать группу ВМ с последней версией Container Optimized Image, необходимо самостоятельно проверить ее наличие:
CLIYandex Cloud Marketplaceyc compute image get-latest-from-family container-optimized-image --folder-id standard-images
Результат:
id: <идентификатор_последней_версии_COI> folder_id: standard-images ...
- Перейдите на страницу Cloud Marketplace и выберите образ с нужной конфигурацией:
- В блоке Идентификаторы продукта скопируйте значение
image_id
.
-
Сохраните спецификацию группы ВМ с сетевым балансировщиком нагрузки в файл
specification.yaml
:name: auto-group service_account_id: <идентификатор_сервисного_аккаунта> scale_policy: auto_scale: min_zone_size: 1 max_size: 6 measurement_duration: 60s warmup_duration: 120s stabilization_duration: 60s initial_size: 2 cpu_utilization_rule: utilization_target: 40 deploy_policy: max_unavailable: 1 allocation_policy: zones: - zone_id: ru-central1-a - zone_id: ru-central1-b load_balancer_spec: target_group_spec: name: auto-group-tg instance_template: service_account_id: <идентификатор_сервисного_аккаунта> platform_id: standard-v3 resources_spec: memory: 2G cores: 2 core_fraction: 100 metadata: docker-container-declaration: |- spec: containers: - image: cr.yandex/yc/demo/web-app:v1 securityContext: privileged: false tty: false stdin: false boot_disk_spec: mode: READ_WRITE disk_spec: type_id: network-hdd size: 30G image_id: fd8iv792kira******** # Идентификатор публичного образа Container Optimized Image. network_interface_specs: - network_id: <идентификатор_облачной_сети> primary_v4_address_spec: { one_to_one_nat_spec: { ip_version: IPV4 }}
-
Замените в файле
specification.yaml
значения в угловых скобках на реальные, на основе выполнения предыдущих шагов. -
Создайте группу ВМ с именем
auto-group
с помощью спецификацииspecification.yaml
:CLITerraformAPIВыполните команду:
yc compute instance-group create --file=specification.yaml
Результат:
done (2m45s) id: cl0hmabc1nd2******** folder_id: b0g12ga82bcv******** ... target_group_id: enpoi5jhfps3******** ... name: auto-group-tg service_account_id: ajelabcde12f******** status: ACTIVE
См. раздел Как создать инфраструктуру с помощью Terraform.
Воспользуйтесь методом CreateFromYaml для ресурса
InstanceGroup
. -
Убедитесь, что группа ВМ создана:
Консоль управленияCLITerraformAPI- В консоли управления
выберите каталог, в котором вы создали группу ВМ. - Выберите сервис Compute Cloud.
- На панели слева нажмите
Группы виртуальных машин. - Выберите группу ВМ
auto-group
.
yc compute instance-group list-instances auto-group
Результат:
+----------------------+---------------------------+----------------+--------------+------------------------+----------------+ | INSTANCE ID | NAME | EXTERNAL IP | INTERNAL IP | STATUS | STATUS MESSAGE | +----------------------+---------------------------+----------------+--------------+------------------------+----------------+ | epdab0c1ji2a******** | cl0habce1nd2********-fned | 84.201.163.202 | 192.168.1.34 | RUNNING_ACTUAL [4m26s] | | | ef0uabc1s2fb******** | cl0habce1nd2********-craq | 130.193.56.102 | 192.168.2.19 | RUNNING_ACTUAL [4m14s] | | +----------------------+---------------------------+----------------+--------------+------------------------+----------------+
См. раздел Как создать инфраструктуру с помощью Terraform.
Чтобы посмотреть список созданных групп ВМ, воспользуйтесь методом REST API list для ресурса InstanceGroup или вызовом gRPC API InstanceGroupService/List.
- В консоли управления
Подключите сетевой балансировщик нагрузки с целевой группой
-
Создайте сетевой балансировщик нагрузки с именем
group-balancer
и подключите его к созданной группе ВМ:Консоль управленияCLITerraformAPI- В консоли управления
выберите каталог, в котором хотите создать балансировщик. - Выберите сервис Network Load Balancer.
- Нажмите кнопку Создать сетевой балансировщик.
- Укажите имя —
group-balancer
. - В поле Публичный адрес укажите
Автоматически
. - В блоке Обработчики нажмите кнопку Добавить обработчик. В открывшемся окне укажите:
- Имя —
http
. - Порт (на нем балансировщик будет принимать входящий трафик) —
80
. - Целевой порт (на него балансировщик будет направлять трафик) —
80
. - Нажмите кнопку Добавить.
- Имя —
- В блоке Целевые группы нажмите кнопку Добавить целевую группу.
- В поле Целевая группа выберите группу ВМ
auto-group-tg
и нажмите кнопку Настроить. В открывшемся окне укажите:- Имя —
tcp
. - Тип —
TCP
. - Порт —
80
. - Нажмите кнопку Применить.
- Имя —
- Нажмите кнопку Создать.
yc load-balancer network-load-balancer create \ --listener external-ip-version=ipv4,name=http,port=80,protocol=tcp,target-port=80 \ --name group-balancer \ --target-group healthcheck-name=tcp,healthcheck-tcp-port=80,target-group-id=enpoi5jhfps3********
Результат:
done (16s) id: b0rbabc1m2ed******** folder_id: b0g12ga82bcv******** ... healthy_threshold: "2" tcp_options: port: "80"
См. раздел Как создать инфраструктуру с помощью Terraform.
- Создайте балансировщик нагрузки с помощью метода REST API create для ресурса NetworkLoadBalancer или вызова gRPC API NetworkLoadBalancerService/Create.
- Добавьте обработчик к балансировщику с помощью метода REST API addListener для ресурса
NetworkLoadBalancer
или вызова gRPC API NetworkLoadBalancerService/AddListener. - Подключите целевую группу к балансировщику с помощью метода REST API attachTargetGroup для ресурса
NetworkLoadBalancer
или вызова gRPC API NetworkLoadBalancerService/AttachTargetGroup. - Подключите балансировщик к группе ВМ с помощью метода REST API addTargets для ресурса TargetGroup или вызова gRPC API TargetGroupService/AddTargets.
- В консоли управления
-
Убедитесь, что сетевой балансировщик
group-balancer
создан и привязан к группе ВМ:Консоль управленияCLITerraformAPI- В консоли управления
выберите каталог, в котором вы создали балансировщик. - Выберите сервис Network Load Balancer.
- Выберите балансировщик
group-balancer
.
yc load-balancer network-load-balancer list
Результат:
+----------------------+----------------+-----------------+----------+----------------+------------------------+--------+ | ID | NAME | REGION ID | TYPE | LISTENER COUNT | ATTACHED TARGET GROUPS | STATUS | +----------------------+----------------+-----------------+----------+----------------+------------------------+--------+ | b0rbabc1m2ed******** | group-balancer | ru-central1 | EXTERNAL | 1 | b0rdabckribe******** | ACTIVE | +----------------------+----------------+-----------------+----------+----------------+------------------------+--------+
См. раздел Как создать инфраструктуру с помощью Terraform.
Воспользуйтесь методом REST API list для ресурса NetworkLoadBalancer или вызовом gRPC API NetworkLoadBalancerService/List.
- В консоли управления
Проверьте работу группы ВМ и сетевого балансировщика
-
Создайте нагрузку на одну из ВМ.
Для этого сохраните скрипт с именем
request.sh
в домашнюю директорию. Скрипт через балансировщикgroup-balancer
отправит на одну из ВМ запрос, который будет создавать нагрузку в 100% CPU в течение 30 секунд.EXTERNAL_IP=$(yc load-balancer network-load-balancer get group-balancer --format=json | jq -r .listeners[0].address) curl "http://$EXTERNAL_IP/burn-cpu?time=30000&load=100"
-
Запустите скрипт:
CLIsh request.sh
Результат:
projects/b0g12ga82bcv********/zones/ru-central1-b
-
Посмотрите нагрузку на ВМ:
Консоль управления-
В консоли управления
выберите каталог, в котором вы создали группу ВМ. -
Выберите сервис Compute Cloud.
-
На панели слева нажмите
Группы виртуальных машин. -
Выберите группу ВМ
auto-group
. -
Перейдите на вкладку Мониторинг.
Балансировщик направил запрос на одну из ВМ группы. В зоне доступности этой ВМ среднее потребление CPU (график Average CPU utilization in zone) выше, чем в других.
-
Проверьте работу автоматического масштабирования
Чтобы проверить работу автоматического масштабирования группы ВМ, нужно создать повышенную нагрузку на CPU каждой ВМ. В файле specification.yaml
в параметре scale_policy.auto_scale.cpu_utilization_rule.utilization_target
указано значение 40
— целевой уровень нагрузки 40% CPU. Если превысить целевую нагрузку, количество ВМ в группе увеличится.
-
Создайте повышенную нагрузку на группу ВМ.
Для этого сохраните скрипт с именем
load.sh
в домашнюю директорию. Скрипт в течение 10 минут в 12 потоков отправляет запросы к группе ВМ. При этом у каждой ВМ используется по 20% CPU на каждое ядро, обрабатывающее запрос. Группа ВМ в каждый момент времени будет загружена на 240% CPU. Скрипт специально выполняет несколько параллельных запросов по 20% CPU, а не один в 240% CPU, чтобы запросы равномерно распределялись между ВМ в группе.EXTERNAL_IP=$(yc load-balancer network-load-balancer get group-balancer --format=json | jq -r .listeners[0].address) wrk -H "Connection: close" -t12 -c12 -d10m "http://$EXTERNAL_IP/burn-cpu?time=5000&load=20"
-
Запустите скрипт:
CLIsh load.sh
Результат:
Running 10m test @ http://130.193.56.111/burn-cpu?time=5000&load=20 12 threads and 12 connections Thread Stats Avg Stdev Max +/- Stdev ... Requests/sec: 15.04 Transfer/sec: 3.20KB
-
Посмотрите нагрузку:
Консоль управления- В консоли управления
выберите каталог, в котором вы создали группу ВМauto-group
. - Выберите сервис Compute Cloud.
- На панели слева нажмите
Группы виртуальных машин. - Выберите группу ВМ
auto-group
. - Перейдите на вкладку Мониторинг.
На графике Number of instance in zone отображены изменения количества ВМ в каждой зоне доступности. На графике Average CPU utilization in zone — средняя CPU-нагрузка в каждой зоне доступности. - Перейдите на вкладку Логи.
На странице отображены сообщения о действиях в рамках автоматического масштабирования группы ВМ.
Суммарная нагрузка в 240% CPU равномерно распределилась между двумя ВМ в двух зонах доступности и превысила целевой уровень нагрузки в 40% CPU. Yandex Compute Cloud создал по дополнительной ВМ в каждой зоне доступности и в группе стало четыре ВМ. Когда скрипт перестал создавать CPU-нагрузку, Compute Cloud автоматически уменьшил количество ВМ в группе до двух.
- В консоли управления
Удалите инфраструктуру
-
Удалите сетевой балансировщик нагрузки:
Консоль управленияCLIAPI- В консоли управления
выберите каталог, в котором вы создали балансировщикgroup-balancer
. - Выберите сервис Network Load Balancer.
- В строке балансировщика
group-balancer
нажмите значок и выберите Удалить. - В открывшемся окне нажмите кнопку Удалить.
yc load-balancer network-load-balancer delete group-balancer
Результат:
done (15s)
Воспользуйтесь методом REST API delete для ресурса NetworkLoadBalancer или вызовом gRPC API NetworkLoadBalancerService/Delete.
- В консоли управления
-
Удалите группу ВМ:
Консоль управленияCLIAPI- В консоли управления
выберите каталог, в котором вы создали группу ВМauto-group
. - Выберите сервис Compute Cloud.
- На панели слева нажмите
Группы виртуальных машин. - В строке группы ВМ
auto-group
нажмите значок и выберите Удалить. - В открывшемся окне нажмите кнопку Удалить.
yc compute instance-group delete auto-group
Результат:
done (1m20s)
Воспользуйтесь методом REST API delete для ресурса InstanceGroup или вызовом gRPC API InstanceGroupService/Delete.
- В консоли управления
-
Удалите подсети:
Консоль управленияCLIAPI- В консоли управления
выберите каталог, в котором вы создали подсети. - Откройте раздел Virtual Private Cloud.
- Выберите сеть, в которой находятся нужные подсети.
- В строке нужной подсети нажмите значок
и выберите Удалить. - В открывшемся окне нажмите кнопку Удалить.
- Повторите три предыдущих шага, чтобы удалить остальные подсети.
-
Удалите подсеть в зоне доступности
ru-central1-a
:yc vpc subnet delete e1lnabc23r1c********
Результат:
done (1s) id: e1lnabc23r1c******** folder_id: b0g12ga82bcv******** created_at: "2020-11-30T16:23:12Z" network_id: enpabce123hd******** zone_id: ru-central1-a v4_cidr_blocks: - 192.168.1.0/24
-
Удалите подсеть в зоне доступности
ru-central1-b
:yc vpc subnet delete b1csa2b3clid********
Результат:
done (1s) id: b1csa2b3clid******** folder_id: b0g12ga82bcv******** created_at: "2020-11-30T16:25:02Z" network_id: enpabce123hd******** zone_id: ru-central1-b v4_cidr_blocks: - 192.168.2.0/24
Воспользуйтесь методом REST API delete для ресурса Subnet или вызовом gRPC API SubnetService/Delete.
- В консоли управления
-
Удалите сеть:
Консоль управленияCLIAPI- В консоли управления
выберите каталог, в котором вы создали сеть. - Откройте раздел Virtual Private Cloud.
- В строке нужной сети нажмите значок
и выберите Удалить. - В открывшемся окне нажмите кнопку Удалить.
yc vpc network delete yc-auto-network
Результат:
id: enpabce123hd******** folder_id: b0g12ga82bcv******** created_at: "2020-11-30T14:57:15Z" name: yc-auto-network
Воспользуйтесь методом REST API delete для ресурса Network или вызовом gRPC API NetworkService/Delete.
- В консоли управления
-
Удалите сервисный аккаунт:
Консоль управленияCLIAPI- В консоли управления
перейдите в каталог, которому принадлежит сервисный аккаунт. - В верхней части экрана перейдите на вкладку Сервисные аккаунты.
- В строке нужного сервисного аккаунта нажмите значок
и выберите Удалить. - Подтвердите удаление.
yc iam service-account delete for-autoscale
Результат:
done (2s)
Воспользуйтесь методом REST API delete для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/Delete.
- В консоли управления
Как создать инфраструктуру с помощью Terraform
Terraform
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
При изменении файлов конфигураций Terraform автоматически определяет, какая часть вашей конфигурации уже развернута, что следует добавить или удалить.
Чтобы настроить масштабирование группы ВМ с помощью Terraform:
-
Установите Terraform и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файлы с описанием инфраструктуры:
Готовый архивВручную-
Склонируйте репозиторий с конфигурационными файлами:
git clone https://github.com/yandex-cloud-examples/yc-vm-group-with-autoscale.git
-
Перейдите в директорию с репозиторием. В ней должны появиться файлы:
vm-autoscale.tf
— конфигурация создаваемой инфраструктуры.declaration.yaml
— описание Docker-контейнера с веб-сервером, который будет запущен на ВМ для имитации нагрузки на сервис.config.tpl
— описание параметров пользователя ВМ.vm-autoscale.auto.tfvars
— пользовательские данные.
- Создайте папку для конфигурационных файлов.
- Создайте в папке:
-
Конфигурационный файл
vm-autoscale.tf
:vm-autoscale.tf# Объявление переменных для конфиденциальных параметров variable "folder_id" { type = string } variable "vm_user" { type = string } variable "ssh_key" { type = string sensitive = true } # Настройка провайдера terraform { required_providers { yandex = { source = "yandex-cloud/yandex" version = ">= 0.47.0" } } } provider "yandex" { zone = "ru-central1-a" } # Создание сервисного аккаунта и назначение ему ролей resource "yandex_iam_service_account" "for-autoscale" { name = "for-autoscale" } resource "yandex_resourcemanager_folder_iam_member" "vm-autoscale-sa-role-compute" { folder_id = var.folder_id role = "editor" member = "serviceAccount:${yandex_iam_service_account.for-autoscale.id}" } # Создание облачной сети и подсетей resource "yandex_vpc_network" "vm-autoscale-network" { name = "vm-autoscale-network" } resource "yandex_vpc_subnet" "vm-autoscale-subnet-a" { name = "vm-autoscale-subnet-a" zone = "ru-central1-a" v4_cidr_blocks = ["192.168.1.0/24"] network_id = yandex_vpc_network.vm-autoscale-network.id } resource "yandex_vpc_subnet" "vm-autoscale-subnet-b" { name = "vm-autoscale-subnet-b" zone = "ru-central1-b" v4_cidr_blocks = ["192.168.2.0/24"] network_id = yandex_vpc_network.vm-autoscale-network.id } # Создание группы безопасности resource "yandex_vpc_security_group" "sg-1" { name = "sg-autoscale" network_id = yandex_vpc_network.vm-autoscale-network.id egress { protocol = "ANY" description = "any" v4_cidr_blocks = ["0.0.0.0/0"] } ingress { protocol = "TCP" description = "ext-http" v4_cidr_blocks = ["0.0.0.0/0"] port = 80 } ingress { protocol = "TCP" description = "healthchecks" predefined_target = "loadbalancer_healthchecks" port = 80 } } # Указание готового образа ВМ data "yandex_compute_image" "autoscale-image" { family = "container-optimized-image" } # Создание группы ВМ resource "yandex_compute_instance_group" "autoscale-group" { name = "autoscale-vm-ig" folder_id = var.folder_id service_account_id = yandex_iam_service_account.for-autoscale.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.autoscale-image.id size = 30 } } network_interface { network_id = yandex_vpc_network.vm-autoscale-network.id subnet_ids = [ yandex_vpc_subnet.vm-autoscale-subnet-a.id, yandex_vpc_subnet.vm-autoscale-subnet-b.id ] security_group_ids = [ yandex_vpc_security_group.sg-1.id ] nat = true } metadata = { user-data = templatefile("config.tpl", { VM_USER = var.vm_user SSH_KEY = var.ssh_key }) docker-container-declaration = file("declaration.yaml") } } scale_policy { auto_scale { initial_size = 2 measurement_duration = 60 cpu_utilization_target = 40 min_zone_size = 1 max_size = 6 warmup_duration = 120 } } allocation_policy { zones = [ "ru-central1-a", "ru-central1-b" ] } deploy_policy { max_unavailable = 1 max_expansion = 0 } load_balancer { target_group_name = "auto-group-tg" target_group_description = "load balancer target group" } } # Создание сетевого балансировщика resource "yandex_lb_network_load_balancer" "balancer" { name = "group-balancer" listener { name = "http" port = 80 target_port = 80 } attached_target_group { target_group_id = yandex_compute_instance_group.autoscale-group.load_balancer[0].target_group_id healthcheck { name = "tcp" tcp_options { port = 80 } } } }
-
Файл
declaration.yaml
с описанием Docker-контейнера с веб-сервером, который будет запущен на ВМ для имитации нагрузки на сервис:declaration.yamlspec: containers: - image: cr.yandex/yc/demo/web-app:v1 securityContext: privileged: false tty: false stdin: false
-
Файл
config.tpl
с параметрами пользователя ВМ:config.tplusers: - name: "${VM_USER}" groups: sudo shell: /bin/bash sudo: 'ALL=(ALL) NOPASSWD:ALL' ssh_authorized_keys: - "${SSH_KEY}"
-
Файл с пользовательскими данными
vm-autoscale.auto.tfvars
:vm-autoscale.auto.tfvarsfolder_id = "<идентификатор_каталога>" vm_user = "<имя_пользователя_ВМ>" ssh_key = "<содержимое_публичного_SSH-ключа>"
-
Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:
-
-
В файле
vm-autoscale.auto.tfvars
задайте пользовательские параметры:folder_id
— идентификатор каталога.vm_user
— имя пользователя ВМ.ssh_key
— содержимое файла с открытым SSH-ключом для аутентификации пользователя на ВМ. Подробнее см. Создание пары ключей SSH.
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-