Обновление группы виртуальных машин под нагрузкой
Примечание
В регионе Казахстан доступна только зона доступности kz1-a.
С помощью этого пошагового руководства вы настроите группу ВМ и проверите ее работу при обновлении конфигурации. Для этого:
- Подготовьте облако к работе.
- Подготовьте окружение.
- Создайте группу ВМ с 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. Чтобы изменить каталог по умолчанию, используйте команду
yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров--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 -
Создайте подсеть в зоне
kz1-d:yc vpc subnet create --network-id enpabce123hd******** --range 192.168.1.0/24 --zone kz1-dРезультат выполнения команды:
id: e1lnabc23r1c******** folder_id: b0g12ga82bcv******** created_at: "2021-02-09T17:34:32.561702Z" network_id: enpabce123hd******** zone_id: kz1-d v4_cidr_blocks: - 192.168.1.0/24 -
Создайте подсеть в зоне
kz1-b:yc vpc subnet create --network-id enpabce123hd******** --range 192.168.2.0/24 --zone kz1-bРезультат выполнения команды:
id: b1csa2b3clid******** folder_id: b0g12ga82bcv******** created_at: "2021-02-09T17:35:32.561702Z" network_id: enpabce123hd******** zone_id: kz1-b v4_cidr_blocks: - 192.168.2.0/24
- Создайте сеть:
Воспользуйтесь методом REST API create для ресурса Network или вызовом gRPC API NetworkService/Create. - Создайте подсети в зонах
kz1-dиkz1-b:
Воспользуйтесь методом REST API create для ресурса Subnet или вызовом gRPC API SubnetService/Create.
- В консоли управления
Создайте группу ВМ с Container Optimized Image
-
Все ВМ группы создаются из образа Container Optimized Image. Каждая ВМ содержит Docker-контейнер с веб-сервером, который эмулирует нагрузку на сервис.
Консоль управленияCLIAPI- В консоли управления
выберите каталог, в котором вы хотите создать группу ВМ. - В списке сервисов выберите Compute Cloud.
- На панели слева выберите
Группы виртуальных машин. - Нажмите кнопку Создать группу виртуальных машин.
- В блоке Базовые параметры:
- В поле Имя укажите
group-for-load. - Выберите Сервисный аккаунт
for-load.
- В поле Имя укажите
- В блоке Распределение в поле Зона доступности выберите
kz1-dиkz1-b. - В блоке Шаблон виртуальной машины нажмите Задать и в открывшемся окне:
- В блоке Образ загрузочного диска выберите вкладку Container Solution.
- Нажмите кнопку Настроить.
- В окне Настройка Docker-контейнера:
- В поле Имя укажите
nginx. - В поле Docker-образ нажмите Укажите ссылку и введите
cr.yandexcloud.kz/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: kz1-d - zone_id: kz1-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.yandexcloud.kz/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: kz1-d - zone_id: kz1-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.yandexcloud.kz/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 | kz1 | 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.