Running a VM group with autoscaling using the management console, CLI, and API
To configure a VM group with an autoscaling policy:
- Prepare your cloud.
- Prepare the environment.
- Create an instance group with autoscaling and a network load balancer.
- Add a network load balancer with a target group.
- Test your instance group and network load balancer.
If you no longer need the resources you created, delete them.
Prepare your cloud
Sign up for Yandex Cloud and create a billing account:
- Go to the management console
and log in to Yandex Cloud or create an account if you do not have one yet. - On the Yandex Cloud Billing
page, make sure you have a billing account linked and it has theACTIVE
orTRIAL_ACTIVE
status. If you do not have a billing account, create one.
If you have an active billing account, you can go to the cloud page
Learn more about clouds and folders.
-
If you don't have the Yandex Cloud command line interface yet, install it.
-
For the scripts from the tutorial to run correctly, download and install the jq
utility. -
To check auto scaling, install the wrk
benchmarking tool.
Required paid resources
The infrastructure cost includes:
- Fee for continuously running VMs (see Compute Cloud pricing).
- Fee for network load balancers and traffic balancing (see Network Load Balancer pricing).
Prepare the environment
-
Create a service account named
for-autoscale
and assign it theeditor
role:Management consoleCLIAPI- In the management console
, select the folder where you want to create your service account. - At the top of the screen, go to the Service accounts tab.
- Click Create service account.
- In the window that opens:
- In the Name field, specify
for-autoscale
. - To assign the service account the
editor
role for the current folder, click Add role and selecteditor
. - Click Create.
- In the Name field, specify
-
Create a service account:
The folder specified in the CLI profile is used by default. You can specify a different folder using the
--folder-name
or--folder-id
parameter.yc iam service-account create --name for-autoscale
Result:
id: ajelabcde12f******** folder_id: b0g12ga82bcv******** created_at: "2020-11-30T14:32:18.900092Z" name: for-autoscale
-
Assign the role to the service account:
yc resource-manager folder add-access-binding b1g23ga82bcv******** \ --role editor \ --subject serviceAccount:ajelabcde12f********
Use the create REST API method for the ServiceAccount resource or the ServiceAccountService/Create gRPC API call.
- In the management console
-
Create a network named
yc-auto-network
and subnets in two availability zones:Management consoleCLIAPI- In the management console
, select the folder where you want to create your network. - Select Virtual Private Cloud.
- Click Create network.
- In the Name field, enter
yc-auto-network
as the network name. - In the Advanced field, enable the Create subnets option.
- Click Create network.
-
Create a network:
yc vpc network create --name yc-auto-network
Result:
id: enpabce123hd******** folder_id: b0g12ga82bcv******** created_at: "2020-11-30T14:57:15Z" name: yc-auto-network
-
Create a subnet in the
ru-central1-a
availability zone:yc vpc subnet create \ --network-id enpabce123hd******** \ --range 192.168.1.0/24 \ --zone ru-central1-a
Result:
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
-
Create a subnet in the
ru-central1-b
availability zone:yc vpc subnet create \ --network-id enpabce123hd******** \ --range 192.168.2.0/24 \ --zone ru-central1-b
Result:
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
-
Create a network.
Use the create REST API method for the Network resource or the NetworkService/Create gRPC API call.
-
Create subnets in the
ru-central1-a
andru-central1-b
availability zones.Use the create REST API method for the Subnet resource or the SubnetService/Create gRPC API call.
- In the management console
-
Create a security group:
Management console- In the management console
, select Virtual Private Cloud. - Open the Security groups tab.
- Create a security group for the load balancer:
-
Click Create group.
-
Enter a Name for the group:
sg-autoscale
. -
Select
yc-auto-network
for Network. -
Under Rules, create rules using the instructions below the table:
Traffic
directionDescription Port
rangeProtocol Source /
target typeSource /
targetOutgoing any All Any CIDR 0.0.0.0/0 Incoming ext-http 80 TCP CIDR 0.0.0.0/0 Incoming healthchecks 80 TCP Load balancer health checks — - Select the Outgoing traffic or Incoming traffic tab.
- Click Add rule.
- In the Port range field of the window that opens, specify a single port or a range of ports that traffic will come to or from.
- In the Protocol field, specify the appropriate protocol or leave Any to allow traffic transmission over any protocol.
- In the Purpose or Source field, select the purpose of the rule:
- CIDR: Rule will apply to the range of IP addresses. In the CIDR blocks field, specify the CIDR and masks of subnets that traffic will come to or from. To add multiple CIDRs, click Add CIDR.
- Security group: Rule will apply to the VMs from the current group or the selected security group.
- Load balancer health checks: Rule allowing a load balancer to health check VMs.
- Click Save. Repeat the steps to create all the rules from the table.
-
Click Save.
-
- In the management console
Create an instance group with autoscaling and a network load balancer
-
All instance groups are created from Container Optimized Image. Each instance contains a Docker container running a web server that emulates the service utilization.
Find out the ID of the latest version of the public Container Optimized Image.
A Container Optimized Image in a Container Registry registry may be updated and changed with new releases. This will not automatically update the VM image to the latest version. To create an instance group with the latest Container Optimized Image version, you need to check whether it is available yourself:
CLIYandex Cloud Marketplaceyc compute image get-latest-from-family container-optimized-image --folder-id standard-images
Result:
id: <ID_of_latest_COI_version> folder_id: standard-images ...
- Go to the Cloud Marketplace page and select the image with the configuration you need:
- Under Product IDs, copy the value of
image_id
.
-
Save the specification of the instance group with network load balancer to the
specification.yaml
file:name: auto-group service_account_id: <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: <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******** # ID of the public . Container Optimized Image network_interface_specs: - network_id: <cloud_network_ID> primary_v4_address_spec: { one_to_one_nat_spec: { ip_version: IPV4 }}
-
In
specification.yaml
, replace the values in angle brackets for the real values you got in the previous steps. -
Create an instance group named
auto-group
using thespecification.yaml
specification:CLIAPIRun this command:
yc compute instance-group create --file=specification.yaml
Result:
done (2m45s) id: cl0hmabc1nd2******** folder_id: b0g12ga82bcv******** ... target_group_id: enpoi5jhfps3******** ... name: auto-group-tg service_account_id: ajelabcde12f******** status: ACTIVE
Use the CreateFromYaml method for the
InstanceGroup
resource. -
Make sure that the instance group was created:
Management consoleCLIAPI- In the management console
, select the folder where you created the instance group. - Select Compute Cloud.
- In the left-hand panel, click
Instance groups. - Select the
auto-group
instance group.
yc compute instance-group list-instances auto-group
Result:
+----------------------+---------------------------+----------------+--------------+------------------------+----------------+ | 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] | | +----------------------+---------------------------+----------------+--------------+------------------------+----------------+
To view the list of created instance groups, use the list REST API method for the InstanceGroup resource or the InstanceGroupService/List gRPC API call.
- In the management console
Add a network load balancer with a target group
-
Create a network load balancer named
group-balancer
and connect it to the instance group you created:Management consoleCLIAPI- In the management console
, select the folder you want to create a load balancer in. - Select Network Load Balancer.
- Click Create a network load balancer.
- Enter
group-balancer
for name. - In the Public address field, specify
Auto
. - Under Listeners, click Add listener. In the window that opens, specify:
- Name:
http
. - Port (port the load balancer will accept incoming traffic at):
80
. - Target port (port the load balancer will route traffic to):
80
. - Click Add.
- Name:
- Under Target groups, click Add target group.
- In the Target group field, select the
auto-group-tg
instance group and click Configure. In the window that opens, specify:- Name:
tcp
. - Type:
TCP
. - Port:
80
. - Click Apply.
- Name:
- Click Create.
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********
Result:
done (16s) id: b0rbabc1m2ed******** folder_id: b0g12ga82bcv******** ... healthy_threshold: "2" tcp_options: port: "80"
- Create a load balancer using the create REST API method for the NetworkLoadBalancer resource or the NetworkLoadBalancerService/Create gRPC API call.
- Add a listener to the load balancer using the addListener REST API method for the
NetworkLoadBalancer
resource or the NetworkLoadBalancerService/AddListener gRPC API call. - Connect the target group to the load balancer using the attachTargetGroup REST API method for the
NetworkLoadBalancer
resource or the NetworkLoadBalancerService/AttachTargetGroup gRPC API call. - Add the load balancer to the instance group using the addTargets REST API method for the TargetGroup resource or the TargetGroupService/AddTargets gRPC API call.
- In the management console
-
Check that the network load balancer named
group-balancer
has been created and linked to the instance group:Management consoleCLIAPI- In the management console
, select the folder you created the load balancer in. - Select Network Load Balancer.
- Select
group-balancer
.
yc load-balancer network-load-balancer list
Result:
+----------------------+----------------+-----------------+----------+----------------+------------------------+--------+ | ID | NAME | REGION ID | TYPE | LISTENER COUNT | ATTACHED TARGET GROUPS | STATUS | +----------------------+----------------+-----------------+----------+----------------+------------------------+--------+ | b0rbabc1m2ed******** | group-balancer | ru-central1 | EXTERNAL | 1 | b0rdabckribe******** | ACTIVE | +----------------------+----------------+-----------------+----------+----------------+------------------------+--------+
Use the list REST API method for the NetworkLoadBalancer resource or the NetworkLoadBalancerService/List gRPC API call.
- In the management console
Test your instance group and network load balancer
-
Create a load on an instance.
To do this, save the script named
request.sh
to the home directory. The script will send a request to one of the VMs through thegroup-balancer
load balancer. The request will utilize 100% CPU for 30 seconds.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"
-
Run the script:
CLIsh request.sh
Result:
projects/b0g12ga82bcv********/zones/ru-central1-b
-
View the instance utilization:
Management console-
In the management console
, select the folder where you created the instance group. -
Select Compute Cloud.
-
In the left-hand panel, click
Instance groups. -
Select
auto-group
. -
Go to the Monitoring tab.
The load balancer sent the request to an instance in the group. In the availability zone this instance belongs to, the average CPU utilization is higher than in other zones (see the Average CPU utilization in zone chart).
-
Test autoscaling
To test autoscaling for your instance group, increase the CPU utilization of each instance. In the specification.yaml
file, the scale_policy.auto_scale.cpu_utilization_rule.utilization_target
parameter is set to 40
: it means that the target utilization level is 40% CPU. If you exceed the target utilization, the number of VMs in the group will increase.
-
Increase the utilization for the instance group.
To do this, save the script named
load.sh
to the home directory. The script sends requests to the instance group through 12 threads for 10 minutes. Each VM instance utilizes 20% CPU on each core that processes the request. The instance group utilization is 240% CPU at any given time. To be sure that requests are evenly distributed across the instances in the group, the script executes multiple parallel requests utilizing 20% CPU rather than one request utilizing 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"
-
Run the script:
CLIsh load.sh
Result:
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
-
View the utilization levels:
Management console- In the management console
, select the folder where you created theauto-group
instance group. - Select Compute Cloud.
- In the panel on the left, click
Instance groups. - Select
auto-group
. - Go to the Monitoring tab.
The chart Number of instances in zone shows how the number of instances changed in each availability zone. The chart Average CPU utilization in zone shows average CPU utilization in each availability zone. - Go to the Logs tab.
The page displays messages relating to the instance group autoscaling.
The total utilization of 240% CPU was evenly distributed between two instances in two availability zones and exceeded the target utilization of 40% CPU. Yandex Compute Cloud created one instance more in each availability zone to result in four instances in the group. When the script stopped utilizing the CPU, Compute Cloud automatically decreased the number of instances in the group to two.
- In the management console
How to delete the resources you created
To stop paying for the resources you created: