Обновление группы виртуальных машин под нагрузкой
С помощью этого пошагового руководства вы настроите группу ВМ и проверите ее работу при обновлении конфигурации. Для этого:
- Подготовьте облако к работе.
- Подготовьте окружение.
- Создайте группу ВМ с Container Optimized Image.
- Создайте нагрузку на ВМ.
- Обновите группу ВМ под нагрузкой.
- Остановите нагрузку и получите результаты.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите его.
-
Чтобы скрипты из пошагового руководства работали корректно, скачайте и установите утилиту jq
. -
Чтобы проверить работу автоматического масштабирования, установите утилиту wrk
для проведения нагрузочного тестирования.
Необходимые платные ресурсы
В стоимость поддержки группы ВМ Yandex Cloud входит плата за:
- Диски и постоянно запущенные ВМ – тарифы Yandex Compute Cloud.
- Использование динамического или статического публичного IP-адреса – тарифы Yandex Virtual Private Cloud.
Подготовьте окружение
-
Создайте сервисный аккаунт с именем
for-load
. Чтобы иметь возможность создавать, обновлять и удалять ВМ в группе, а также интегрировать группу с сетевым балансировщиком Network Load Balancer, назначьте сервисному аккаунту роли compute.editor и load-balancer.editor:Консоль управленияCLIAPI- В консоли управления
выберите каталог, в котором вы хотите создать сервисный аккаунт. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- В поле Имя укажите
for-load
. - Нажмите значок
Добавить роль. Чтобы иметь возможность создавать, обновлять и удалять ВМ в группе, а также интегрировать группу с сетевым балансировщиком Network Load Balancer, назначьте сервисному аккаунту роли compute.editor и load-balancer.editor. - Нажмите кнопку Создать.
-
Создайте сервисный аккаунт:
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
.yc iam service-account create --name for-load
Результат выполнения команды:
id: ajeab0cnib1p******** folder_id: b0g12ga82bcv******** created_at: "2021-02-09T17:31:32.561702Z" name: for-load
-
Назначьте роль сервисному аккаунту роль compute.editor:
yc resource-manager folder add-access-binding <идентификатор_каталога> \ --role compute.editor \ --subject serviceAccount:<идентификатор_сервисного_аккаунта>
-
Назначьте роль сервисному аккаунту роль load-balancer.editor:
yc resource-manager folder add-access-binding <идентификатор_каталога> \ --role load-balancer.editor \ --subject serviceAccount:<идентификатор_сервисного_аккаунта>
- Создайте сервисный аккаунт
for-load
:
Воспользуйтесь методом REST API create для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/Create. - Чтобы иметь возможность создавать, обновлять и удалять ВМ в группе, а также интегрировать группу с сетевым балансировщиком Network Load Balancer, назначьте сервисному аккаунту роли compute.editor и load-balancer.editor:
Воспользуйтесь методом REST API setAccessBindings для ресурса Folder или вызовом gRPC API FolderService/SetAccessBindings.
- В консоли управления
-
Создайте сеть с именем
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: "2021-02-09T17:33:32.561702Z" name: yc-auto-network
-
Создайте подсеть в зоне
ru-central1-d
:yc vpc subnet create --network-id enpabce123hd******** --range 192.168.1.0/24 --zone ru-central1-d
Результат выполнения команды:
id: e1lnabc23r1c******** folder_id: b0g12ga82bcv******** created_at: "2021-02-09T17:34:32.561702Z" network_id: enpabce123hd******** zone_id: ru-central1-d 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: "2021-02-09T17:35:32.561702Z" 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-d
иru-central1-b
:
Воспользуйтесь методом REST API create для ресурса Subnet или вызовом gRPC API SubnetService/Create.
- В консоли управления
Создайте группу ВМ с Container Optimized Image
-
Все ВМ группы создаются из образа Container Optimized Image. Каждая ВМ содержит Docker-контейнер с веб-сервером, который эмулирует нагрузку на сервис.
Консоль управленияCLIAPI- В консоли управления
выберите каталог, в котором вы хотите создать группу ВМ. - В списке сервисов выберите Compute Cloud.
- На панели слева выберите
Группы виртуальных машин. - Нажмите кнопку Создать группу виртуальных машин.
- В блоке Базовые параметры:
- В поле Имя укажите
group-for-load
. - Выберите Сервисный аккаунт
for-load
.
- В поле Имя укажите
- В блоке Распределение в поле Зона доступности выберите
ru-central1-d
иru-central1-b
. - В блоке Шаблон виртуальной машины нажмите Задать и в открывшемся окне:
- В блоке Образ загрузочного диска выберите вкладку Container Solution.
- Нажмите кнопку Настроить.
- В окне Настройка Docker-контейнера:
- В поле Имя укажите
nginx
. - В поле Docker-образ нажмите Укажите ссылку и введите
cr.yandex/yc/demo/autoscaling-example-app:v1
. - Нажмите кнопку Применить.
- В поле Имя укажите
- В блоке Диски и файловые хранилища:
- Для загрузочного диска укажите Размер
30 ГБ
.
- Для загрузочного диска укажите Размер
- В блоке Сетевые настройки:
- В поле Сеть выберите
for-load
.
- В поле Сеть выберите
- В блоке Доступ:
- В поле Сервисный аккаунт выберите
for-load
. - В поле Логин укажите имя пользователя, который будет создан на ВМ.
- В поле SSH-ключ вставьте содержимое файла открытого ключа.
- В поле Сервисный аккаунт выберите
- Нажмите кнопку Сохранить.
- В блоке В процессе создания и обновления разрешено:
- В поле Уменьшать относительно целевого значения введите
4
.
- В поле Уменьшать относительно целевого значения введите
- В блоке Масштабирование:
- В поле Тип выберите
Фиксированный
. - Введите Размер
6
.
- В поле Тип выберите
- В блоке Интеграция с Network 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: fd8iv792kira******** 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: ajeab0cnib1p******** # Идентификатор сервисного аккаунта. allocation_policy: # Политика распределения ВМ в группе. zones: - zone_id: ru-central1-d - zone_id: ru-central1-b instance_template: service_account_id: ajeab0cnib1p******** # Идентификатор сервисного аккаунта для доступа к приватным 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: enplhg4nncc7******** # Идентификатор сети. subnet_ids: - e1lnabc23r1c******** # Идентификатор подсети. - b1csa2b3clid******** 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: cl0kabcquk1g******** folder_id: b0g12ga82bcv******** ... service_account_id: ajeab0cnib1p******** status: ACTIVE application_load_balancer_state: {}
-
Получите идентификатор последней версии образа
container-optimized-image
в семействеstandard-images
:
Воспользуйтесь методом REST API getLatestByFamily для ресурса Image или вызовом gRPC API ImageService/GetLatestByFamily. -
Создайте группу ВМ по следующей спецификации:
name: group-for-load # Имя группы ВМ, уникальное в рамках каталога. service_account_id: ajeab0cnib1p******** # Идентификатор сервисного аккаунта. allocation_policy: # Политика распределения ВМ в группе. zones: - zone_id: ru-central1-d - zone_id: ru-central1-b instance_template: service_account_id: ajeab0cnib1p******** # Идентификатор сервисного аккаунта для доступа к приватным 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: enplhg4nncc7******** # Идентификатор сети. subnet_ids: - e1lnabc23r1c******** # Идентификатор подсети. - b1csa2b3clid******** 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
Воспользуйтесь методом REST API createFromYaml для ресурса InstanceGroup или вызовом gRPC API InstanceGroupService/CreateFromYaml.
- В консоли управления
-
Убедитесь, что группа ВМ создана:
Консоль управления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 | +----------------------+---------------------------+-----------------+-------------+----------------------+----------------+ ... | fhmab0cfsfd1******** | cl0kabcquk1g********-oxig | 178.154.226.108 | 10.130.0.8 | RUNNING_ACTUAL [49m] | | | epdabchpdef0******** | cl0kabcquk1g********-aqyg | 130.193.40.55 | 10.129.0.20 | RUNNING_ACTUAL [43m] | | +----------------------+---------------------------+-----------------+-------------+----------------------+----------------+
Чтобы посмотреть список созданных групп ВМ, воспользуйтесь методом REST API list для ресурса InstanceGroup или вызовом gRPC API InstanceGroupService/List.
- В консоли управления
Подключите сетевой балансировщик нагрузки к созданной группе виртуальных машин
-
Создайте сетевой балансировщик нагрузки с именем
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: enpsa475ej51********
-
Создайте балансировщик:
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=<идентификатор_целевой_группы>
Результат выполнения команды:
done (14s) id: b0ruab1ccvpd******** folder_id: b1csa2b3clid******** ... healthy_threshold: "2" http_options: port: "80" path: /hello
- Создайте балансировщик нагрузки с помощью метода 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.
- В консоли управления
-
Убедитесь, что сетевой балансировщик
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 | +----------------------+----------------+-----------------+----------+----------------+------------------------+--------+ | b0ruab1ccvpd******** | load-generator | ru-central1 | EXTERNAL | 1 | b0r1tabcphde******** | ACTIVE | +----------------------+----------------+-----------------+----------+----------------+------------------------+--------+
Воспользуйтесь методом REST API list для ресурса NetworkLoadBalancer или вызовом gRPC API NetworkLoadBalancerService/List.
- В консоли управления
Создайте нагрузку на ВМ
-
Получите IP-адрес созданного балансировщика:
Консоль управленияCLIAPI- В консоли управления
выберите каталог, в котором находится балансировщик. - В списке сервисов выберите Network Load Balancer.
- Скопируйте IP-адрес балансировщика
load-generator
.
yc load-balancer network-load-balancer get load-generator | grep "address"
Результат выполнения команды:
address: 84.252.133.110
Воспользуйтесь методом REST API get для ресурса NetworkLoadBalancer или вызовом gRPC API NetworkLoadBalancerService/Get.
- В консоли управления
-
Выполните команду для создания нагрузки:
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: cl10kktrjcn8******** folder_id: b1g7gvsi89m3******** ... name: load-generator service_account_id: ajehbk07uus3******** status: ACTIVE
-
В спецификации укажите новый размер диска — 35 ГБ:
... size: 35G ...
-
Чтобы обновить группу ВМ
load-generator
по новой спецификации, воспользуйтесь методом REST API updateFromYaml для ресурса InstanceGroup или вызовом gRPC API InstanceGroupService/UpdateFromYaml.
Остановите нагрузку и получите результаты
Остановите работу 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
нажмите и выберите Удалить. - В открывшемся окне нажмите Удалить.
- В консоли управления
- Удалите сервисный аккаунт:
- В консоли управления
выберите каталог, в котором вы создали сервисный аккаунт. - В списке сервисов выберите Identity and Access Management.
- На панели слева выберите
Сервисные аккаунты. - В открывшемся списке в строке с сервисным аккаунтом
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
- Удалите балансировщик
load-generator
: воспользуйтесь методом REST API delete для ресурса NetworkLoadBalancer или вызовом gRPC API NetworkLoadBalancerService/Delete. - Удалите группу ВМ
load-generator
: воспользуйтесь методом REST API delete для ресурса InstanceGroup или вызовом gRPC API InstanceGroupService/Delete. - Удалите сервисный аккаунт
yc-auto-sa
: воспользуйтесь методом REST API delete для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/Delete. - Удалите подсети
yc-auto-subnet-1
иyc-auto-subnet-2
: воспользуйтесь методом REST API delete для ресурса Subnet или вызовом gRPC API SubnetService/Delete. - Удалите сеть
yc-auto-network
: воспользуйтесь методом REST API delete для ресурса Network или вызовом gRPC API NetworkService/Delete.