Работа с группой виртуальных машин с автоматическим масштабированием
Чтобы создать группу ВМ с автоматическим масштабированием и сетевым балансировщиком нагрузки, необходимо выполнить следующие действия.
Перед началом работы
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите его.
-
Чтобы скрипты из пошагового руководства работали корректно, скачайте и установите утилиту jq.
-
Чтобы проверить работу автоматического масштабирования, установите утилиту wrk для проведения нагрузочного тестирования.
Подготовьте окружение
-
Создайте сервисный аккаунт с именем
for-autoscale
и назначьте ему рольeditor
:Консоль управленияCLIAPI- В консоли управления выберите каталог, в котором вы хотите создать сервисный аккаунт.
- Выберите вкладку Сервисные аккаунты.
- Нажмите кнопку Создать сервисный аккаунт.
- Введите имя
for-autoscale
. - Чтобы назначить сервисному аккаунту роль на текущий каталог, нажмите Добавить роль и выберите роль
editor
. - Нажмите кнопку Создать.
-
Создайте сервисный аккаунт:
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
.yc iam service-account create --name for-autoscale
Результат выполнения команды:
id: ajelabcde12f33nol1v5 folder_id: b0g12ga82bcv0cdeferg created_at: "2020-11-30T14:32:18.900092Z" name: for-autoscale
-
Назначьте роль сервисному аккаунту:
yc resource-manager folder add-access-binding b1g23ga82bcv0cdeferg \ --role editor \ --subject serviceAccount:ajelabcde12f33nol1v5
Воспользуйтесь методом Create для ресурса
ServiceAccount
. -
Создайте сеть с именем
yc-auto-network
и подсети в двух зонах доступности:Консоль управленияCLIAPI- В консоли управления выберите каталог, в котором вы хотите создать сеть.
- Выберите сервис Virtual Private Cloud.
- Нажмите кнопку Создать сеть.
- Задайте имя сети
yc-auto-network
. - Выберите дополнительную опцию Создать подсети.
- Нажмите кнопку Создать сеть.
-
Создайте сеть:
yc vpc network create --name yc-auto-network
Результат выполнения команды:
id: enpabce123hde4ft1r3t folder_id: b0g12ga82bcv0cdeferg created_at: "2020-11-30T14:57:15Z" name: yc-auto-network
-
Создайте подсеть в зоне
ru-central1-a
:yc vpc subnet create \ --network-id enpabce123hde4ft1r3t \ --range 192.168.1.0/24 \ --zone ru-central1-a
Результат выполнения команды:
id: e1lnabc23r1c9d0efoje folder_id: b0g12ga82bcv0cdeferg created_at: "2020-11-30T16:23:12Z" network_id: enpabce123hde4ft1r3t zone_id: ru-central1-a v4_cidr_blocks: - 192.168.1.0/24
-
Создайте подсеть в зоне
ru-central1-b
:yc vpc subnet create \ --network-id enpabce123hde4ft1r3t \ --range 192.168.2.0/24 \ --zone ru-central1-b
Результат выполнения команды:
id: b1csa2b3clideftjb121 folder_id: b0g12ga82bcv0cdeferg created_at: "2020-11-30T16:25:02Z" network_id: enpabce123hde4ft1r3t zone_id: ru-central1-b v4_cidr_blocks: - 192.168.2.0/24
Создайте группу ВМ с автоматическим масштабированием и сетевым балансировщиком нагрузки
-
Все ВМ группы создаются из образа Container Optimized Image. Каждая ВМ содержит Docker-контейнер с веб-сервером, который эмулирует нагрузку на сервис.
Узнайте идентификатор последней версии публичного образа Container Optimized Image.
Образ Container Optimized Image в реестре Yandex Container Registry может обновляться и меняться в соответствии с релизами. При этом образ на виртуальной машине не обновится автоматически до последней версии. Чтобы создать группу ВМ с последней версией Container Optimized Image, необходимо самостоятельно проверить ее наличие:
CLIMarketplaceyc 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 cooldown_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: 10G image_id: fd8iv792kirahcnqnt0q # Идентификатор публичного образа 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
:CLIAPIВыполните команду:
yc compute instance-group create --file=specification.yaml
Результат выполнения команды:
done (2m45s) id: cl0hmabc1nd2hdefgb7k folder_id: b0g12ga82bcv0cdeferg ... name: auto-group-tg service_account_id: ajelabcde12f33nol1v5 status: ACTIVE
Воспользуйтесь методом CreateFromYaml для ресурса
InstanceGroup
. -
Убедитесь, что группа ВМ создана:
Консоль управленияCLIAPI- В консоли управления выберите каталог, в котором вы создали группу ВМ.
- Выберите сервис Compute Cloud.
- Перейдите в раздел Группы виртуальных машин.
- Нажмите на имя группы ВМ
auto-group
.
yc compute instance-group list-instances auto-group
Результат выполнения команды:
+----------------------+---------------------------+----------------+--------------+------------------------+----------------+ | INSTANCE ID | NAME | EXTERNAL IP | INTERNAL IP | STATUS | STATUS MESSAGE | +----------------------+---------------------------+----------------+--------------+------------------------+----------------+ | epdab0c1ji2ad4ef8l1s | cl0habce1nd2hqstgd7e-fned | 84.201.163.202 | 192.168.1.34 | RUNNING_ACTUAL [4m26s] | | | ef0uabc1s2fbde6f5tlu | cl0habce1nd2hqstga7b-craq | 130.193.56.102 | 192.168.2.19 | RUNNING_ACTUAL [4m14s] | | +----------------------+---------------------------+----------------+--------------+------------------------+----------------+
Посмотрите список созданных групп ВМ с помощью метода List для ресурса
InstanceGroup
.
Подключите сетевой балансировщик нагрузки с целевой группой
-
Создайте сетевой балансировщик нагрузки с именем
group-balancer
и подключите его к созданной группе ВМ:Консоль управленияCLIAPI- В консоли управления выберите каталог, в котором хотите создать балансировщик.
- Выберите сервис Network Load Balancer.
- Нажмите кнопку Создать балансировщик.
- Задайте Имя
group-balancer
. - В поле Публичный адрес выберите значение Автоматически.
- В блоке Обработчики нажмите кнопку Добавить обработчик:
- В открывшемся окне введите Имя обработчика
http
. - В поле Порт укажите
80
, на нем балансировщик будет принимать входящий трафик. - В поле Целевой порт укажите
80
, на него балансировщик будет направлять трафик. - Нажмите кнопку Добавить.
- В открывшемся окне введите Имя обработчика
- В блоке Целевые группы нажмите кнопку Добавить целевую группу.
- В поле Целевая группа выберите группу ВМ
auto-group
и нажмите кнопку Настроить:- В открывшемся окне Настройка проверки состояния введите Имя
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=cl0hmabc1nd2hdefgb7k
Результат выполнения команды:
done (16s) id: b0rbabc1m2edfu2ss579 folder_id: b0g12ga82bcv0cdeferg ... healthy_threshold: "2" tcp_options: port: "80"
- Создайте балансировщик нагрузки с помощью метода Create для ресурса
NetworkLoadBalancer
. - Добавьте обработчик к балансировщику с помощью метода AddListener для ресурса
NetworkLoadBalancer
. - Подключите целевую группу к балансировщику с помощью метода AttachTargetGroup для ресурса
NetworkLoadBalancer
. - Подключите балансировщик к группе ВМ с помощью метода AddTargets для ресурса
TargetGroup
.
-
Убедитесь, что сетевой балансировщик
group-balancer
создан и привязан к группе ВМ:Консоль управленияCLIAPI- В консоли управления выберите каталог, в котором вы создали балансировщик.
- Выберите сервис Network Load Balancer.
- Нажмите на имя балансировщика
group-balancer
.
yc load-balancer network-load-balancer list
Результат выполнения команды:
+----------------------+----------------+-------------+----------+----------------+------------------------+--------+ | ID | NAME | REGION ID | TYPE | LISTENER COUNT | ATTACHED TARGET GROUPS | STATUS | +----------------------+----------------+-------------+----------+----------------+------------------------+--------+ | b0rbabc1m2edfu2ss579 | group-balancer | ru-central1 | EXTERNAL | 1 | b0rdabckribed1fbv2l1 | ACTIVE | +----------------------+----------------+-------------+----------+----------------+------------------------+--------+
Воспользуйтесь методом List для ресурса
NetworkLoadBalancer
.
Проверьте работу группы ВМ и сетевого балансировщика
-
Создайте нагрузку на одну из ВМ.
Для этого сохраните скрипт с именем
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/b0g12ga82bcv0cdeferg/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. Если превысить целевую нагрузку, Instance Groups увеличит количество ВМ в группе.
-
Создайте повышенную нагрузку на группу ВМ.
Для этого сохраните скрипт с именем
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. Instance Groups создал по дополнительной ВМ в каждой зоне доступности и в группе стало четыре ВМ. Когда скрипт перестал создавать CPU-нагрузку, Instance Groups автоматически уменьшил количество ВМ в группе до двух.
- В консоли управления выберите каталог, в котором вы создали группу ВМ
Удалите инфраструктуру
-
Удалите сетевой балансировщик нагрузки:
Консоль управленияCLIAPI- В консоли управления выберите каталог, в котором вы создали балансировщик
group-balancer
. - Выберите сервис Network Load Balancer.
- Нажмите значок
в строке балансировщикаgroup-balancer
. - В открывшемся меню нажмите кнопку Удалить.
- В открывшемся окне Удаление балансировщика нажмите кнопку Удалить.
yc load-balancer network-load-balancer delete group-balancer
Результат выполнения команды:
done (15s)
Воспользуйтесь методом Delete для ресурса
NetworkLoadBalancer
. - В консоли управления выберите каталог, в котором вы создали балансировщик
-
Удалите группу ВМ:
Консоль управленияCLIAPI- В консоли управления выберите каталог, в котором вы создали группу ВМ
auto-group
. - Выберите сервис Compute Cloud.
- Перейдите в раздел Группы виртуальных машин.
- Нажмите значок
для группы ВМauto-group
. - В открывшемся меню нажмите кнопку Удалить.
- В открывшемся окне Удаление группы виртуальных машин нажмите кнопку Удалить.
yc compute instance-group delete auto-group
Результат выполнения команды:
done (1m20s)
Воспользуйтесь методом Delete для ресурса
InstanceGroup
. - В консоли управления выберите каталог, в котором вы создали группу ВМ
-
Удалите подсети:
Консоль управленияCLIAPI- В консоли управления выберите каталог, в котором вы создали подсети.
- Откройте раздел Virtual Private Cloud.
- Нажмите на имя сети, в которой находятся подсети.
- Нажмите значок
- В открывшемся меню нажмите кнопку Удалить.
- В открывшемся окне нажмите кнопку Удалить.
- Повторите три предыдущих шага, чтобы удалить остальные подсети.
-
Удалите подсеть в зоне
ru-central1-a
:yc vpc subnet delete e1lnabc23r1c9d0efoje
Результат выполнения команды:
done (1s) id: e1lnabc23r1c9d0efoje folder_id: b0g12ga82bcv0cdeferg created_at: "2020-11-30T16:23:12Z" network_id: enpabce123hde4ft1r3t zone_id: ru-central1-a v4_cidr_blocks: - 192.168.1.0/24
-
Удалите подсеть в зоне
ru-central1-b
:yc vpc subnet delete b1csa2b3clideftjb121
Результат выполнения команды:
done (1s) id: b1csa2b3clideftjb121 folder_id: b0g12ga82bcv0cdeferg created_at: "2020-11-30T16:25:02Z" network_id: enpabce123hde4ft1r3t zone_id: ru-central1-b v4_cidr_blocks: - 192.168.2.0/24
Воспользуйтесь методом Delete для ресурса
Subnet
. -
Удалите сеть:
Консоль управленияCLIAPI- В консоли управления выберите каталог, в котором вы создали сеть.
- Откройте раздел Virtual Private Cloud.
- Нажмите значок
- В открывшемся меню нажмите кнопку Удалить.
- В открывшемся окне нажмите кнопку Удалить.
yc vpc network delete yc-auto-network
Результат выполнения команды:
id: enpabce123hde4ft1r3t folder_id: b0g12ga82bcv0cdeferg created_at: "2020-11-30T14:57:15Z" name: yc-auto-network
Воспользуйтесь методом Delete для ресурса
Network
. -
Удалите сервисный аккаунт:
Консоль управленияCLIAPI- В консоли управления перейдите в каталог, которому принадлежит сервисный аккаунт.
- Выберите вкладку Сервисные аккаунты.
- Нажмите значок
- Подтвердите удаление.
yc iam service-account delete for-autoscale
Результат выполнения команды:
done (2s)
Воспользуйтесь методом Delete для ресурса
ServiceAccount
.