Масштабирование группы виртуальных машин по расписанию с помощью консоли управления, CLI и API
Чтобы настроить масштабирование группы виртуальных машин по расписанию, выполните следующие шаги:
- Подготовьте облако к работе.
- Создайте группу ВМ.
- Создайте ресурсы Cloud Functions.
- Проверьте масштабирование группы ВМ.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
В качестве примера будет использоваться каталог с именем example-folder
.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входят:
- плата за диски и постоянно запущенные ВМ (см. тарифы Compute Cloud);
- плата за вызовы функции, вычислительные ресурсы, выделенные для выполнения функции, и исходящий трафик (см. тарифы Cloud Functions).
Создайте вспомогательные ресурсы
Создайте сервисный аккаунт
Сервисный аккаунт будет привязан к группе ВМ Compute Cloud и функции Cloud Functions.
- В консоли управления
выберите каталогexample-folder
. - В верхней части экрана перейдите на вкладку Сервисные аккаунты.
- Справа сверху нажмите Создать сервисный аккаунт.
- В поле Имя укажите
vm-scale-scheduled-sa
. - Нажмите
Добавить роль и выберите роли:compute.admin
— для управления группой ВМ.iam.serviceAccounts.user
— для привязки сервисного аккаунта к ВМ, входящим в группу.functions.functionInvoker
— для запуска функции Cloud Functions.
- Нажмите Создать.
-
Создайте сервисный аккаунт:
yc iam service-account create --name vm-scale-scheduled-sa \ --folder-name example-folder
Результат:
id: ajeab0cnib1p******** folder_id: b0g12ga82bcv******** created_at: "2022-03-15T09:44:35.989446Z" name: vm-scale-scheduled-sa
Подробнее о команде
yc iam service-account create
см. в справочнике CLI. -
Назначьте сервисному аккаунту роли:
-
compute.admin
— для управления группой ВМ:yc resource-manager folder add-access-binding example-folder \ --service-account-name vm-scale-scheduled-sa \ --role compute.admin \ --folder-name example-folder
-
iam.serviceAccounts.user
— для привязки сервисного аккаунта к ВМ, входящим в группу:yc resource-manager folder add-access-binding example-folder \ --service-account-name vm-scale-scheduled-sa \ --role iam.serviceAccounts.user \ --folder-name example-folder
-
functions.functionInvoker
— для запуска функции Cloud Functions:yc resource-manager folder add-access-binding example-folder \ --service-account-name vm-scale-scheduled-sa \ --role functions.functionInvoker \ --folder-name example-folder
Подробнее о команде
yc resource-manager folder add-access-binding
см. в справочнике CLI. -
-
Создайте сервисный аккаунт
vm-scale-scheduled-sa
. Для этого воспользуйтесь методом REST API create для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/Create. -
Назначьте сервисному аккаунту в текущем каталоге роли:
compute.admin
— для управления группой ВМ.iam.serviceAccounts.user
— для привязки сервисного аккаунта к ВМ, входящим в группу.functions.functionInvoker
— для запуска функции Cloud Functions.
Для этого воспользуйтесь методом REST API setAccessBindings для ресурса Folder или вызовом gRPC API FolderService/SetAccessBindings.
Создайте облачную сеть
Группа ВМ будет размещена в облачной сети Yandex Virtual Private Cloud и ее подсетях.
- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Virtual Private Cloud.
- Справа сверху нажмите Создать сеть.
- В поле Имя укажите
vm-scale-scheduled-network
. - Выберите опцию Создать подсети.
- Нажмите Создать сеть.
-
Создайте сеть
vm-scale-scheduled-network
:yc vpc network create --name vm-scale-scheduled-network \ --folder-name example-folder
Результат:
id: enpabce123hd******** folder_id: b0g12ga82bcv******** created_at: "2022-03-15T09:55:50.004472Z" name: vm-scale-scheduled-network
Подробнее о команде
yc vpc network create
см. в справочнике CLI. -
Создайте подсеть
vm-scale-scheduled-subnet-a
в зоне доступностиru-central1-a
:yc vpc subnet create --name vm-scale-scheduled-subnet-a \ --folder-name example-folder \ --network-name vm-scale-scheduled-network --range 192.168.1.0/24 \ --zone ru-central1-a
Результат:
id: e1lnabc23r1c******** folder_id: b0g12ga82bcv******** created_at: "2022-03-15T09:56:51.859345Z" name: vm-scale-scheduled-subnet-a network_id: enpabce123hd******** zone_id: ru-central1-a v4_cidr_blocks: - 192.168.1.0/24
Подробнее о команде
yc vpc subnet create
см. в справочнике CLI. -
Создайте подсеть
vm-scale-scheduled-network-b
в зоне доступностиru-central1-b
:yc vpc subnet create --name vm-scale-scheduled-subnet-b \ --folder-name example-folder \ --network-name vm-scale-scheduled-network --range 192.168.2.0/24 \ --zone ru-central1-b
Результат:
id: b1csa2b3clid******** folder_id: b0g12ga82bcv******** created_at: "2022-03-15T09:57:48.934429Z" name: vm-scale-scheduled-subnet-b network_id: enpabce123hd******** zone_id: ru-central1-b v4_cidr_blocks: - 192.168.2.0/24
- Создайте сеть
vm-scale-scheduled-network
с помощью метода REST API create для ресурса Network или вызова gRPC API NetworkService/Create. - Создайте подсети
vm-scale-scheduled-subnet-a
в зоне доступностиru-central1-a
иvm-scale-scheduled-subnet-b
в зонеru-central1-b
с помощью метода REST API create для ресурса Subnet или вызова gRPC API SubnetService/Create.
Создайте группу виртуальных машин
Группа ВМ будет создана с ручным масштабированием, чтобы ее размером могла управлять функция Cloud Functions.
- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Compute Cloud.
- На панели слева выберите
Группы виртуальных машин. - Справа сверху нажмите Создать группу виртуальных машин.
- В блоке Базовые параметры:
- В поле Имя укажите
vm-scale-scheduled-ig
. - Выберите Сервисный аккаунт
vm-scale-scheduled-sa
.
- В поле Имя укажите
- В блоке Распределение в поле Зона доступности выберите
ru-central1-a
иru-central1-b
. - В блоке Шаблон виртуальной машины нажмите Задать и в открывшемся окне:
- В блоке Образ загрузочного диска на вкладке Образ загрузочного диска выберите Ubuntu 20.04.
- В блоке Вычислительные ресурсы укажите следующие настройки:
- Платформа —
Intel Ice Lake
. - vCPU —
2
. - Гарантированная доля vCPU —
20%
. - RAM —
2 ГБ
.
- Платформа —
- В блоке Сетевые настройки:
- В поле Сеть выберите
vm-scale-scheduled-network
. - В поле Публичный адрес выберите
Без адреса
.
- В поле Сеть выберите
- В блоке Доступ:
- В поле Сервисный аккаунт выберите
vm-scale-scheduled-sa
. - В поле Логин укажите имя пользователя, который будет создан на ВМ. Придумайте имя самостоятельно.
- В поле SSH-ключ вставьте содержимое файла открытого ключа SSH. Создать пару ключей можно по инструкции.
- В поле Сервисный аккаунт выберите
- Нажмите Сохранить.
- В блоке В процессе создания и обновления разрешено укажите следующие настройки:
- Добавлять выше целевого значения —
2
. - Уменьшать относительно целевого значения —
2
. - Одновременно создавать —
2
. - Одновременно останавливать —
2
.
- Добавлять выше целевого значения —
- В блоке Масштабирование:
- В поле Тип выберите
Фиксированный
. - Укажите Размер
2
.
- В поле Тип выберите
- Нажмите Создать.
-
Получите идентификаторы ресурсов, созданных ранее:
-
Идентификатор сервисного аккаунта
vm-scale-scheduled-sa
:yc iam service-account get vm-scale-scheduled-sa \ --folder-name example-folder | grep "^id"
Результат:
id: ajeab0cnib1p********
Подробнее о команде
yc iam service-account get
см. в справочнике CLI. -
Идентификатор сети
vm-scale-scheduled-network
:yc vpc network get vm-scale-scheduled-network \ --folder-name example-folder | grep "^id"
Результат:
id: enpabce123hd********
Подробнее о команде
yc vpc network get
см. в справочнике CLI. -
Идентификатор подсети
vm-scale-scheduled-subnet-a
:yc vpc subnet get vm-scale-scheduled-subnet-a \ --folder-name example-folder | grep "^id"
Результат:
id: e1lnabc23r1c********
Подробнее о команде
yc vpc subnet get
см. в справочнике CLI. -
Идентификатор подсети
vm-scale-scheduled-subnet-b
:yc vpc subnet get vm-scale-scheduled-subnet-b \ --folder-name example-folder | grep "^id"
Результат:
id: b1csa2b3clid********
Подробнее о команде
yc vpc subnet get
см. в справочнике CLI.
-
-
Получите идентификатор последней версии публичного образа Ubuntu 20.04 LTS:
yc compute image get-latest-from-family ubuntu-2004-lts \ --folder-id standard-images | grep "^id"
Результат:
id: fd83n3uou8m0********
Подробнее о команде
yc compute image get-latest-from-family
см. в справочнике CLI. -
Вставьте полученные идентификаторы в файл
specification.yaml
со спецификацией группы ВМ:name: vm-scale-scheduled-ig service_account_id: <идентификатор_сервисного_аккаунта> allocation_policy: zones: - zone_id: ru-central1-a - zone_id: ru-central1-b instance_template: platform_id: standard-v3 resources_spec: memory: 2G cores: 2 core_fraction: 20 boot_disk_spec: mode: READ_WRITE disk_spec: type_id: network-hdd size: 15G image_id: <идентификатор_последней_версии_Ubuntu_20.04_LTS> network_interface_specs: - network_id: <идентификатор_сети> subnet_ids: - <идентификатор_подсети_в_зоне_ru-central1-a> - <идентификатор_подсети_в_зоне_ru-central1-b> primary_v4_address_spec: {} scale_policy: fixed_scale: size: 2 deploy_policy: max_unavailable: 2 max_creating: 2 max_expansion: 2 max_deleting: 2
-
Создайте группу ВМ с именем
vm-scale-scheduled-ig
по спецификацииspecification.yaml
:yc compute instance-group create --file specification.yaml \ --folder-name example-folder
Результат:
done (2m18s) id: cl0kabcquk1g******** folder_id: b0g12ga82bcv******** ... service_account_id: ajeab0cnib1p******** status: ACTIVE
-
Получите идентификаторы ресурсов, созданных ранее:
- Идентификатор сервисного аккаунта
vm-scale-scheduled-sa
— с помощью метода REST API get для ресурса ServiceAccount или вызова gRPC API ServiceAccountService/Get. - Идентификатор сети
vm-scale-scheduled-network
— с помощью метода REST API get для ресурса Network или вызова gRPC API NetworkService/Get. - Идентификаторы подсетей
vm-scale-scheduled-subnet-a
иvm-scale-scheduled-subnet-b
— с помощью метода REST API get для ресурса Subnet или вызова gRPC API SubnetService/Get.
- Идентификатор сервисного аккаунта
-
Получите идентификатор последней версии публичного образа Ubuntu 20.04 в семействе
standard-images
с помощью метода REST API getLatestByFamily для ресурса Image или вызова gRPC API ImageService/GetLatestByFamily. -
Вставьте полученные идентификаторы в файл
specification.yaml
со спецификацией группы ВМ:name: vm-scale-scheduled-ig service_account_id: <идентификатор_сервисного_аккаунта> allocation_policy: zones: - zone_id: ru-central1-a - zone_id: ru-central1-b instance_template: platform_id: standard-v3 resources_spec: memory: 2G cores: 2 core_fraction: 20 boot_disk_spec: mode: READ_WRITE disk_spec: type_id: network-hdd size: 15G image_id: <идентификатор_последней_версии_Ubuntu_20.04_LTS> network_interface_specs: - network_id: <идентификатор_сети> subnet_ids: - <идентификатор_подсети_в_зоне_ru-central1-a> - <идентификатор_подсети_в_зоне_ru-central1-b> primary_v4_address_spec: {} scale_policy: fixed_scale: size: 2 deploy_policy: max_unavailable: 2 max_creating: 2 max_expansion: 2 max_deleting: 2
-
Создайте группу ВМ с именем
vm-scale-scheduled-ig
по спецификацииspecification.yaml
с помощью метода REST API createFromYaml для ресурса InstanceGroup или вызова gRPC API InstanceGroupService/CreateFromYaml.
Создайте ресурсы Cloud Functions
Создайте функцию
Функция будет содержать код с командами CLI Yandex Cloud, которые изменяют группу ВМ.
-
В консоли управления
выберите каталогexample-folder
. -
Выберите сервис Cloud Functions.
-
Справа сверху нажмите Создать функцию.
-
В поле Имя укажите
vm-scale-scheduled-function
. -
Нажмите Создать.
-
Выберите среду выполнения Bash.
-
Включите опцию Добавить файлы с примерами кода.
-
Нажмите Продолжить.
-
В блоке Редактор выберите файл
handler.sh
. -
Вставьте вместо содержимого файла следующий код:
# Get ID and current size of the instance group IG_SPEC=$(yc compute instance-group get --name $IG_NAME --folder-id $FOLDER_ID --format json) IG_ID=$(jq -r ".id" <<< $IG_SPEC) IG_SIZE=$(jq -r ".scale_policy.fixed_scale.size" <<< $IG_SPEC) # Calculate new size for the instance group if [ $IG_SIZE = $IG_BASE_SIZE ]; then IG_SIZE="$(($IG_BASE_SIZE + 1))" else IG_SIZE=$IG_BASE_SIZE fi # Update the instance group yc compute instance-group update --id $IG_ID --scale-policy-fixed-scale-size $IG_SIZE
-
В блоке Параметры:
- В поле Таймаут, c укажите значение
60
. - В поле Сервисный аккаунт выберите
vm-scale-scheduled-sa
. - В блоке Переменные окружения добавьте следующие переменные:
IG_NAME
=vm-scale-scheduled-ig
.IG_BASE_SIZE
=2
.FOLDER_ID
= идентификатор каталога. Получить идентификатор можно по инструкции.
- В поле Таймаут, c укажите значение
-
В правом верхнем углу нажмите Сохранить изменения.
-
Создайте файл
handler.sh
со следующим кодом:# Get ID and current size of the instance group IG_SPEC=$(yc compute instance-group get --name $IG_NAME --folder-id $FOLDER_ID --format json) IG_ID=$(jq -r ".id" <<< $IG_SPEC) IG_SIZE=$(jq -r ".scale_policy.fixed_scale.size" <<< $IG_SPEC) # Calculate new size for the instance group if [ $IG_SIZE = $IG_BASE_SIZE ]; then IG_SIZE="$(($IG_BASE_SIZE + 1))" else IG_SIZE=$IG_BASE_SIZE fi # Update the instance group yc compute instance-group update --id $IG_ID --scale-policy-fixed-scale-size $IG_SIZE
-
Создайте функцию:
yc serverless function create vm-scale-scheduled-function \ --folder-name example-folder
Результат:
done (1s) id: d4e7d67ikvmq******** folder_id: b1g9hv2loamq******** ... log_group_id: ckgij6l0845h******** http_invoke_url: https://functions.yandexcloud.net/d4e7d67ikvmq******** status: ACTIVE
-
Создайте версию функции:
yc serverless function version create --folder-name example-folder \ --function-name vm-scale-scheduled-function --runtime bash \ --source-path ./handler.sh --entrypoint "handler.sh" \ --execution-timeout 60s \ --service-account-id <идентификатор_сервисного_аккаунта> \ --environment \ IG_NAME=vm-scale-scheduled-ig,IG_BASE_SIZE=2,FOLDER_ID=<идентификатор_каталога>
Где:
- Опция
--service-account-id
— идентификатор сервисного аккаунтаvm-scale-schedule-sa
. Получить идентификатор можно по инструкции в шаге Создайте группу ВМ, на вкладке CLI. - Переменная
FOLDER_ID
в опции--environment
— идентификатор каталога. Получить идентификатор можно по инструкции.
Результат:
done (1s) id: d4efmv9n3qf1******** function_id: d4e7d67ikvmq******** ... FOLDER_ID: b1g9hv2loamq******** IG_BASE_SIZE: "2" IG_NAME: vm-scale-scheduled-ig
- Опция
-
Создайте функцию
vm-scale-scheduled-function
с помощью метода REST API create для ресурса Function или вызова gRPC API FunctionService/Create. Из ответных данных получите идентификатор созданной функции. -
Создайте версию функции с помощью метода REST API createVersion для ресурса Function или вызова gRPC API FunctionService/CreateVersion. Версия функции должна иметь следующий код:
# Get ID and current size of the instance group IG_SPEC=$(yc compute instance-group get --name $IG_NAME --folder-id $FOLDER_ID --format json) IG_ID=$(jq -r ".id" <<< $IG_SPEC) IG_SIZE=$(jq -r ".scale_policy.fixed_scale.size" <<< $IG_SPEC) # Calculate new size for the instance group if [ $IG_SIZE = $IG_BASE_SIZE ]; then IG_SIZE="$(($IG_BASE_SIZE + 1))" else IG_SIZE=$IG_BASE_SIZE fi # Update the instance group yc compute instance-group update --id $IG_ID --scale-policy-fixed-scale-size $IG_SIZE
Создайте триггер
Триггер определяет условия запуска функции. Для запуска по расписанию используется триггер-таймер.
- В консоли управления
выберите каталогexample-folder
. - Выберите сервис Cloud Functions.
- На панели слева выберите
Триггеры. - Справа сверху нажмите Создать триггер.
- В блоке Базовые параметры:
- В поле Имя укажите
vm-scale-scheduled-trigger
. - В поле Тип выберите
Таймер
. - В поле Запускаемый ресурс выберите
Функция
.
- В поле Имя укажите
- В блоке Настройки таймера в поле Cron-выражение укажите
*/2 * * * ? *
— триггер будет срабатывать каждые две минуты, например, в 09:58, 10:00, 10:02, 10:04 и т. д. - В блоке Настройки функции:
- В поле Функция укажите
vm-scale-scheduled-function
. - В поле Тег версии функции выберите
$latest
. - Выберите Сервисный аккаунт
vm-scale-scheduled-sa
.
- В поле Функция укажите
- В блоке Настройки Dead Letter Queue очистите поле Сервисный аккаунт (
Не выбрано
). - Нажмите Создать триггер.
Выполните следующую команду:
yc serverless trigger create timer --folder-name example-folder \
--name vm-scale-scheduled-trigger \
--cron-expression "*/2 * * * ? *" \
--invoke-function-name vm-scale-scheduled-function \
--invoke-function-tag '$latest' \
--invoke-function-service-account-name vm-scale-scheduled-sa
Результат:
id: a1s22pb0v5i4********
folder_id: b1g9hv2loamq********
created_at: "2022-04-06T14:56:54.253709098Z"
...
function_tag: $latest
service_account_id: aje9s4pud13h********
status: ACTIVE
Используйте метод REST API create для ресурса Trigger или вызов gRPC API TriggerService/Create, чтобы создать триггер типа timer
с cron-выражением */2 * * * ? *
, связанный с функцией vm-scale-scheduled-function
версии $latest
и сервисным аккаунтом vm-scale-scheduled-sa
.
Проверьте масштабирование группы ВМ
- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Compute Cloud.
- На панели слева выберите
Группы виртуальных машин. - Выберите группу
vm-scale-scheduled-ig
. - Убедитесь, что в блоке Состояния виртуальных машин каждые две минуты изменяется количество ВМ: увеличивается с 2 до 3, затем уменьшается с 3 до 2 и т. д. Также вы можете проверить обновление группы на вкладке
Операции.
Несколько раз выполните следующую команду:
yc compute instance-group get vm-scale-scheduled-ig \
--folder-name example-folder
Результат:
id: cl1l0ljqbmkp********
folder_id: b1g9hv2loamq********
created_at: "2022-03-28T13:24:20.693Z"
...
managed_instances_state:
target_size: "2"
running_actual_count: "2"
...
Значение в поле target_size
(целевой размер группы) должно меняться с 2
на 3
и обратно.
Несколько раз получите информацию о группе ВМ vm-scale-scheduled-ig
с помощью метода REST API get для ресурса InstanceGroup или вызова gRPC API InstanceGroupService/Get. Значение в поле target_size
(целевой размер группы) должно меняться с 2
на 3
и обратно.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: