Обновление группы виртуальных машин под нагрузкой
С помощью этого пошагового руководства вы настроите группу ВМ и проверите ее работу при обновлении конфигурации. Для этого:
- Подготовьте облако к работе.
- Подготовьте окружение.
- Создайте группу ВМ с Container Optimized Image.
- Создайте нагрузку на ВМ.
- Обновите группу ВМ под нагрузкой.
- Остановите нагрузку и получите результаты.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите его.
-
Чтобы скрипты из пошагового руководства работали корректно, скачайте и установите утилиту jq.
-
Чтобы проверить работу автоматического масштабирования, установите утилиту wrk для проведения нагрузочного тестирования.
Необходимые платные ресурсы
В стоимость поддержки группы ВМ Yandex Cloud входит плата за:
- Диски и постоянно запущенные ВМ – тарифы Yandex Compute Cloud.
- Использование динамического или статического публичного IP-адреса – тарифы Yandex Virtual Private Cloud.
Подготовьте окружение
-
Создайте сервисный аккаунт с именем
for-load
и назначьте ему рольeditor
:Консоль управленияCLIAPI- В консоли управления выберите каталог, в котором вы хотите создать сервисный аккаунт.
- Выберите вкладку Сервисные аккаунты.
- Нажмите кнопку Создать сервисный аккаунт.
- Введите имя
for-load
. - Чтобы назначить сервисному аккаунту роль на текущий каталог, нажмите Добавить роль и выберите роль
editor
. - Нажмите кнопку Создать.
-
Создайте сервисный аккаунт:
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
.yc iam service-account create --name for-load
Результат выполнения команды:
id: ajeab0cnib1pdefe21dm folder_id: b0g12ga82bcv0cdeferg created_at: "2021-02-09T17:31:32.561702Z" name: for-load
-
Назначьте роль сервисному аккаунту:
yc resource-manager folder add-access-binding b0g12ga82bcv0cdeferg \ --role editor \ --subject serviceAccount:ajeab0cnib1pdefe21dm
Воспользуйтесь методами:
- create для ресурса
ServiceAccount
, чтобы создать сервисный аккаунтfor-load
. - setAccessBindings для ресурса
Folder
, чтобы назначить сервисному аккаунту в текущем каталоге рольeditor
.
-
Создайте сеть с именем
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: "2021-02-09T17:33:32.561702Z" 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: "2021-02-09T17:34:32.561702Z" 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: "2021-02-09T17:35:32.561702Z" network_id: enpabce123hde4ft1r3t zone_id: ru-central1-b v4_cidr_blocks: - 192.168.2.0/24
Создайте группу ВМ с Container Optimized Image
-
Все ВМ группы создаются из образа Container Optimized Image. Каждая ВМ содержит Docker-контейнер с веб-сервером, который эмулирует нагрузку на сервис.
Консоль управленияCLIAPI- В консоли управления выберите каталог, в котором вы хотите создать сеть.
- Выберите сервис Compute Cloud.
- На странице Виртуальные машины перейдите на вкладку Группы виртуальных машин.
- Нажмите кнопку Создать группу.
- В блоке Базовые параметры:
- Введите Имя группы
group-for-load
. - Выберите Сервисный аккаунт
for-load
.
- Введите Имя группы
- В блоке Распределение выберите Зоны доступности
ru-central1-a
иru-central1-b
. - В блоке Шаблон виртуальной машины нажмите кнопку Задать:
- В блоке Выбор образа/загрузочного диска выберите вкладку Container Solution.
- Нажмите кнопку Настроить.
- В окне Настройка Docker-контейнера:
- Введите Имя
nginx
. - В поле Docker-образ нажмите кнопку Укажите ссылку и введите
cr.yandex/yc/demo/autoscaling-example-app:v1
. - Нажмите кнопку Применить.
- Введите Имя
- В блоке Диски:
- Для загрузочного диска укажите Размер 30 ГБ.
- В блоке Сетевые настройки:
- Выберите Сеть
for-load
.
- Выберите Сеть
- В блоке Доступ:
- Выберите Сервисный аккаунт
for-load
. - В поле Логин укажите имя пользователя, который будет создан на ВМ.
- В поле SSH-ключ вставьте содержимое файла открытого ключа.
- Выберите Сервисный аккаунт
- Нажмите кнопку Сохранить.
- В блоке В процессе создания и обновления разрешено:
- В поле Уменьшать относительно целевого значения введите
4
.
- В поле Уменьшать относительно целевого значения введите
- В блоке Масштабирование:
- Выберите Тип
Фиксированный
. - Введите Размер
6
.
- Выберите Тип
- В блоке Интеграция с Load Balancer:
- Включите опцию Создайте целевую группу.
- Введите Имя целевой группы
load-generator
.
- Нажмите кнопку Создать.
-
Узнайте идентификатор последней версии публичного образа Container Optimized Image.
Образ Container Optimized Image в реестре Yandex Container Registry может обновляться и меняться в соответствии с релизами. При этом образ на ВМ не обновится автоматически до последней версии. Чтобы создать группу ВМ с последней версией Container Optimized Image, необходимо самостоятельно проверить ее наличие:
yc compute image get-latest-from-family container-optimized-image --folder-id standard-images
Результат выполнения команды:
id: fd8iv792kirahcnqnt0q folder_id: standard-images created_at: "2021-01-29T13:30:22Z" ... status: READY os: type: LINUX
-
Сохраните спецификацию группы ВМ с сетевым балансировщиком нагрузки в файл
specification.yaml
:name: group-for-load # Имя группы ВМ, уникальное в рамках каталога. service_account_id: ajeab0cnib1pdefe21dm # Идентификатор сервисного аккаунта. allocation_policy: # Политика распределения ВМ в группе. zones: - zone_id: ru-central1-a - zone_id: ru-central1-b instance_template: service_account_id: ajeab0cnib1pdefe21dm # Идентификатор сервисного аккаунта для доступа к приватным Docker-образам. platform_id: standard-v1 # Идентификатор платформы. resources_spec: memory: 2G # Количество памяти (RAM). cores: 2 # Количество ядер процессора (vCPU). boot_disk_spec: mode: READ_WRITE # Режим доступа к диску: чтение и запись. disk_spec: image_id: <идентификатор последней версии COI> type_id: network-ssd # Тип диска. size: 30G # Размер диска. network_interface_specs: - network_id: enplhg4nncc7mctv7kpf # Идентификатор сети. subnet_ids: - e1lnabc23r1c9d0efoje # Идентификатор подсети. - b1csa2b3clideftjb121 primary_v4_address_spec: { one_to_one_nat_spec: { ip_version: IPV4 # Спецификация версии интернет-протокола IPv4 для публичного доступа к ВМ. } } metadata: # Значения, которые будут переданы в метаданные ВМ. docker-container-declaration: |- # Ключ в метаданных ВМ, при котором используется Docker Container спецификация. spec: containers: - image: cr.yandex/yc/demo/autoscaling-example-app:v1 name: nginx securityContext: privileged: false restartPolicy: Always tty: false stdin: false ssh-keys: | # Параметр для передачи SSH-ключа на ВМ. yc-user:ssh-ed25519 ABC...d01 user@desktop.ru # Имя пользователя для подключения к ВМ. deploy_policy: # Политика развертывания ВМ в группе. max_unavailable: 4 scale_policy: # Политика масштабирования ВМ в группе. fixed_scale: size: 6 load_balancer_spec: # Сетевой балансировщик нагрузки. target_group_spec: name: load-generator
Примечание
Передать SSH-ключ в метаданных ВМ можно с помощью параметра
ssh-keys
или в строке с пользовательскими метаданнымиuser-data
. В этом руководстве используется первый вариант. -
Создайте группу ВМ с именем
group-for-load
с помощью спецификацииspecification.yaml
:yc compute instance-group create --file=specification.yaml
Результат выполнения команды:
done (2m18s) id: cl0kabcquk1gomdefbkk folder_id: b0g12ga82bcv0cdeferg ... service_account_id: ajeab0cnib1pdefe21dm status: ACTIVE application_load_balancer_state: {}
Воспользуйтесь методами:
-
getLatestByFamily для ресурса
Image
, чтобы получить идентификатор последней версии образаcontainer-optimized-image
в семействеstandard-images
; -
createFromYaml для ресурса
InstanceGroup
, чтобы создать группу ВМ по следующей спецификации:name: group-for-load # Имя группы ВМ, уникальное в рамках каталога. service_account_id: ajeab0cnib1pdefe21dm # Идентификатор сервисного аккаунта. allocation_policy: # Политика распределения ВМ в группе. zones: - zone_id: ru-central1-a - zone_id: ru-central1-b instance_template: service_account_id: ajeab0cnib1pdefe21dm # Идентификатор сервисного аккаунта для доступа к приватным Docker-образам. platform_id: standard-v1 # Идентификатор платформы. resources_spec: memory: 2G # Количество памяти (RAM). cores: 2 # Количество ядер процессора (vCPU). boot_disk_spec: mode: READ_WRITE # Режим доступа к диску: чтение и запись. disk_spec: image_id: <идентификатор последней версии COI> type_id: network-ssd # Тип диска. size: 30G # Размер диска. network_interface_specs: - network_id: enplhg4nncc7mctv7kpf # Идентификатор сети. subnet_ids: - e1lnabc23r1c9d0efoje # Идентификатор подсети. - b1csa2b3clideftjb121 primary_v4_address_spec: { one_to_one_nat_spec: { ip_version: IPV4 # Спецификация версии интернет-протокола IPv4 для публичного доступа к ВМ. } } metadata: # Значения, которые будут переданы в метаданные ВМ. docker-container-declaration: |- # Ключ в метаданных ВМ, при котором используется Docker Container спецификация. spec: containers: - image: cr.yandex/yc/demo/autoscaling-example-app:v1 name: nginx securityContext: privileged: false restartPolicy: Always tty: false stdin: false ssh-keys: | # Параметр для передачи SSH-ключа на ВМ. yc-user:ssh-ed25519 ABC...d01 user@desktop.ru # Имя пользователя для подключения к ВМ. deploy_policy: # Политика развертывания ВМ в группе. max_unavailable: 4 scale_policy: # Политика масштабирования ВМ в группе. fixed_scale: size: 6 load_balancer_spec: # Сетевой балансировщик нагрузки. target_group_spec: name: load-generator
-
Убедитесь, что группа ВМ создана:
Консоль управленияCLIAPI- В консоли управления выберите каталог, в котором вы создали группу ВМ.
- Выберите сервис Compute Cloud.
- Перейдите в раздел Группы виртуальных машин.
- Нажмите на имя группы ВМ
group-for-load
.
yc compute instance-group list-instances group-for-load
Результат выполнения команды:
+----------------------+---------------------------+-----------------+-------------+----------------------+----------------+ | INSTANCE ID | NAME | EXTERNAL IP | INTERNAL IP | STATUS | STATUS MESSAGE | +----------------------+---------------------------+-----------------+-------------+----------------------+----------------+ ... | fhmab0cfsfd125efpvn1 | cl0kabcquk1gomdefbkk-oxig | 178.154.226.108 | 10.130.0.8 | RUNNING_ACTUAL [49m] | | | epdabchpdef0f1e21j14 | cl0kabcquk1gomdefbkk-aqyg | 130.193.40.55 | 10.129.0.20 | RUNNING_ACTUAL [43m] | | +----------------------+---------------------------+-----------------+-------------+----------------------+----------------+
Посмотрите список созданных групп ВМ с помощью метода list для ресурса
InstanceGroup
.
Подключите сетевой балансировщик нагрузки к созданной группе виртуальных машин
-
Создайте сетевой балансировщик нагрузки с именем
load-generator
и подключите его к созданной группе ВМ:Консоль управленияCLIAPI- В консоли управления выберите каталог, в котором хотите создать балансировщик.
- В списке сервисов выберите Network Load Balancer.
- Нажмите кнопку Создать сетевой балансировщик.
- Задайте Имя
load-generator
. - В поле Публичный адрес выберите значение Автоматически.
- В блоке Обработчики нажмите кнопку Добавить обработчик:
- В открывшемся окне введите Имя обработчика
http
. - В поле Порт укажите
80
— на нем балансировщик будет принимать входящий трафик. - В поле Целевой порт укажите
80
— на него балансировщик будет направлять трафик. - Нажмите кнопку Добавить.
- В открывшемся окне введите Имя обработчика
- В блоке Целевые группы нажмите кнопку Добавить целевую группу.
- В выпадающем списке Целевая группа выберите
load-generator
. - В блоке целевой группы нажмите кнопку Настроить:
- В открывшемся окне укажите Путь
/hello
— по этому пути балансировщик будет отправлять запросы для проверки состояния ВМ из целевой группы. - Нажмите кнопку Применить.
- В открывшемся окне укажите Путь
- Нажмите кнопку Создать.
-
Получите идентификатор целевой группы
load-generator
:yc load-balancer target-group get load-generator | grep "^id"
Результат выполнения команды:
id: enpsa475ej51enuam897
-
Создайте балансировщик:
yc load-balancer network-load-balancer create \ --name load-generator \ --listener external-ip-version=ipv4,name=http,port=80,protocol=tcp,target-port=80 \ --target-group healthcheck-http-port=80,healthcheck-http-path=/hello,target-group-id=<ID целевой группы>
Результат выполнения команды:
done (14s) id: b0ruab1ccvpd26efgii4 folder_id: b1csa2b3clideftjb121 ... healthy_threshold: "2" http_options: port: "80" path: /hello
- Создайте балансировщик нагрузки с помощью метода create для ресурса
NetworkLoadBalancer
. - Добавьте обработчик к балансировщику с помощью метода addListener для ресурса
NetworkLoadBalancer
. - Подключите целевую группу к балансировщику с помощью метода attachTargetGroup для ресурса
NetworkLoadBalancer
. - Подключите балансировщик к группе ВМ с помощью метода addTargets для ресурса
TargetGroup
.
-
Убедитесь, что сетевой балансировщик
load-generator
создан и привязан к группе ВМ:Консоль управленияCLIAPI- В консоли управления выберите каталог, в котором вы создали сетевой балансировщик.
- Выберите сервис Network Load Balancer.
- Нажмите на имя сетевого балансировщика
load-generator
.
yc load-balancer network-load-balancer list
Результат выполнения команды:
+----------------------+----------------+-----------------+----------+----------------+------------------------+--------+ | ID | NAME | REGION ID | TYPE | LISTENER COUNT | ATTACHED TARGET GROUPS | STATUS | +----------------------+----------------+-----------------+----------+----------------+------------------------+--------+ | b0ruab1ccvpd26efgii4 | load-generator | ru-central1 | EXTERNAL | 1 | b0r1tabcphde28fj1dd3 | ACTIVE | +----------------------+----------------+-----------------+----------+----------------+------------------------+--------+
Воспользуйтесь методом list для ресурса
NetworkLoadBalancer
.
Создайте нагрузку на ВМ
-
Получите IP-адрес созданного балансировщика:
Консоль управленияCLIAPI- В консоли управления выберите каталог, в котором хотите создать балансировщик.
- В списке сервисов выберите Network Load Balancer.
- Скопируйте IP-адрес балансировщика.
yc load-balancer network-load-balancer get load-generator | grep "address"
Результат выполнения команды:
address: 84.252.133.110
Воспользуйтесь методом get для ресурса
NetworkLoadBalancer
. -
Выполните команду для создания нагрузки:
wrk -t20 -c20 -d20m --timeout 20s http://<IP-адрес балансировщика>/sleep
Команда запустит утилиту
wrk
, которая будет отправлять запросы в 20 потоков по 20 подключений к сетевому балансировщику в течение 20 минут. Таймаут запроса 20 секунд. Полученную нагрузку балансировщик распределит между ВМ из группы.После запуска
wrk
на экране появится сообщение о начале тестирования:Running 20m test @ http://84.252.133.110/sleep 20 threads and 20 connections
Переходите к следующему шагу, не дожидаясь окончания выполнения команды.
Обновите группу ВМ под нагрузкой
- В консоли управления выберите каталог, в котором вы создали группу ВМ.
- Выберите сервис Compute Cloud.
- Перейдите в раздел Группы виртуальных машин.
- Нажмите на имя группы ВМ
group-for-load
. - На странице группы нажмите кнопку
Изменить. - В блоке Шаблон виртуальной машины нажмите кнопку
- В блоке Диски укажите новый размер диска — 35 ГБ.
- Нажмите кнопку Сохранить.
- Нажмите кнопку Сохранить изменения.
- В блоке Состояния виртуальных машин поэтапно отобразятся изменения размера диска для всех ВМ группы.
-
В спецификации
specification.yaml
укажите новый размер диска — 35 ГБ — и сохраните файл:... size: 35G ...
-
Обновите группу ВМ:
yc compute instance-group update --name=group-for-load --file=specification.yaml
Результат выполнения команды:
done (9m24s) id: cl10kktrjcn8polprdav folder_id: b1g7gvsi89m34qmcm3ke ... name: load-generator service_account_id: ajehbk07uus3s73pcq13 status: ACTIVE
-
В спецификации укажите новый размер диска — 35 ГБ:
... size: 35G ...
-
Воспользуйтесь методом updateFromYaml для ресурса
InstanceGroup
, чтобы обновить группу ВМload-generator
по новой спецификации.
Остановите нагрузку и получите результаты
Остановите работу wrk
, нажав сочетание клавиш Ctrl + C.
Результат выполнения команды:
Thread Stats Avg Stdev Max +/- Stdev
Latency 10.00s 1.70ms 10.01s 68.21%
Req/Sec 0.00 0.00 0.00 100.00%
1148 requests in 17.47m, 211.89KB read
Requests/sec: 1.09
Transfer/sec: 206.94B
Если в результате нет строки об ошибках, например Socket errors
, все запросы были обработаны.
Как удалить созданные ресурсы
Чтобы удалить созданные ресурсы:
- Удалите балансировщик нагрузки:
- Перейдите в корень каталога.
- В списке сервисов выберите Network Load Balancer.
- Справа в строке балансировщика
load-generator
нажмите кнопку - В открывшемся окне нажмите кнопку Удалить.
- Удалите группу ВМ:
- Перейдите в корень каталога.
- В списке сервисов выберите Compute Cloud.
- Перейдите на вкладку Группы виртуальных машин.
- Справа в строке группы
load-generator
нажмите кнопку - В открывшемся окне нажмите кнопку Удалить.
- Удалите сервисный аккаунт:
- Перейдите в корень каталога.
- Перейдите на вкладку Сервисные аккаунты.
- Справа в строке аккаунта
yc-auto-sa
нажмите кнопку - В открывшемся окне нажмите кнопку Удалить.
- Удалите сеть и подсети:
- Перейдите в корень каталога.
- В списке сервисов выберите Virtual Private Cloud.
- Выберите сеть
yc-auto-network
. - В блоке Подсети:
- Справа в строке подсети
yc-auto-subnet-1
нажмите кнопку - В открывшемся окне нажмите кнопку Удалить.
- Также удалите подсеть
yc-auto-subnet-2
.
- Справа в строке подсети
- В правом верхнем углу нажмите кнопку Удалить.
Выполните последовательно команды:
yc load-balancer network-load-balancer delete load-generator
yc compute instance-group delete load-generator
yc iam service-account delete yc-auto-sa
yc vpc subnet delete yc-auto-subnet-1
yc vpc subnet delete yc-auto-subnet-2
yc vpc network delete yc-auto-network
Воспользуйтесь методами:
- delete для ресурса
NetworkLoadBalancer
, чтобы удалить балансировщикload-generator
. - delete для ресурса
InstanceGroup
, чтобы удалить группу ВМload-generator
. - delete для ресурса
ServiceAccount
, чтобы удалить сервисный аккаунтyc-auto-sa
. - delete для ресурса
Subnet
, чтобы удалить подсетиyc-auto-subnet-1
иyc-auto-subnet-2
. - delete для ресурса
Network
, чтобы удалить сетьyc-auto-network
.