Работа с группой виртуальных машин с автоматическим масштабированием с помощью консоли управления, CLI и API
Чтобы настроить группу ВМ с политикой автоматического масштабирования:
- Подготовьте облако к работе.
- Подготовьте окружение.
- Создайте группу ВМ с автоматическим масштабированием и сетевым балансировщиком нагрузки.
- Подключите сетевой балансировщик нагрузки с целевой группой.
- Проверьте работу группы ВМ и сетевого балансировщика.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите его.
-
Чтобы скрипты из пошагового руководства работали корректно, скачайте и установите утилиту jq
. -
Чтобы проверить работу автоматического масштабирования, установите утилиту wrk
для проведения нагрузочного тестирования.
Необходимые платные ресурсы
В стоимость инфраструктуры входят:
- плата за постоянно запущенные ВМ (см. тарифы Compute Cloud);
- плата за сетевые балансировщики и балансировку трафика (см. тарифы Network Load Balancer).
Подготовьте окружение
-
Создайте сервисный аккаунт с именем
for-autoscale
и назначьте ему рольeditor
:Консоль управленияCLIAPI- В консоли управления
выберите каталог, в котором вы хотите создать сервисный аккаунт. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт. В открывшемся окне:
- В поле Имя укажите
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********
Воспользуйтесь методом REST API create для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/Create.
- В консоли управления
-
Создайте сеть с именем
yc-auto-network
и подсети в двух зонах доступности:Консоль управленияCLIAPI- В консоли управления
выберите каталог, в котором вы хотите создать сеть. - Выберите сервис 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
-
Создайте сеть.
Воспользуйтесь методом REST API create для ресурса Network или вызовом gRPC API NetworkService/Create.
-
Создайте подсети в зонах доступности
ru-central1-a
иru-central1-b
.Воспользуйтесь методом REST API create для ресурса Subnet или вызовом gRPC API SubnetService/Create.
- В консоли управления
-
Создайте группу безопасности:
Консоль управления- В консоли управления
выберите сервис 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.
- Группа безопасности — правило будет применено к ВМ из текущей группы или из выбранной группы безопасности.
- Проверки состояния балансировщика — правило, которое позволяет балансировщику проверять состояние ВМ.
- Нажмите кнопку Сохранить. Таким образом создайте все правила из таблицы.
-
Нажмите кнопку Сохранить.
-
- В консоли управления
Создайте группу ВМ с автоматическим масштабированием и сетевым балансировщиком нагрузки
-
Все ВМ группы создаются из образа 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
:CLIAPIВыполните команду:
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
Воспользуйтесь методом 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 | +----------------------+---------------------------+----------------+--------------+------------------------+----------------+ | 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] | | +----------------------+---------------------------+----------------+--------------+------------------------+----------------+
Чтобы посмотреть список созданных групп ВМ, воспользуйтесь методом REST API list для ресурса InstanceGroup или вызовом gRPC API InstanceGroupService/List.
- В консоли управления
Подключите сетевой балансировщик нагрузки с целевой группой
-
Создайте сетевой балансировщик нагрузки с именем
group-balancer
и подключите его к созданной группе ВМ:Консоль управленияCLIAPI- В консоли управления
выберите каталог, в котором хотите создать балансировщик. - Выберите сервис 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"
- Создайте балансировщик нагрузки с помощью метода 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
создан и привязан к группе ВМ:Консоль управленияCLIAPI- В консоли управления
выберите каталог, в котором вы создали балансировщик. - Выберите сервис 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 | +----------------------+----------------+-----------------+----------+----------------+------------------------+--------+
Воспользуйтесь методом 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 автоматически уменьшил количество ВМ в группе до двух.
- В консоли управления
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: