Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex Compute Cloud
  • Yandex Container Solution
    • Все руководства
    • Настройка синхронизации часов с помощью NTP
      • Обзор
      • Консоль управления
      • Terraform
    • Автомасштабирование группы ВМ для обработки сообщений из очереди
    • Обновление группы ВМ под нагрузкой
    • Развертывание Remote Desktop Gateway
    • Начало работы с Packer
    • Передача логов с ВМ в Yandex Cloud Logging
    • Сборка образа ВМ с набором инфраструктурных инструментов с помощью Packer
    • Миграция в Yandex Cloud с помощью Хайстекс Акура
    • Защита от сбоев с помощью Хайстекс Акура
    • Резервное копирование ВМ с помощью Хайстекс Акура
    • Развертывание отказоустойчивой архитектуры с прерываемыми ВМ
    • Настройка отказоустойчивой архитектуры в Yandex Cloud
    • Создание триггера для бюджетов, который вызывает функцию для остановки ВМ
    • Создание триггеров, которые вызывают функции для остановки ВМ и отправки уведомлений в Telegram
    • Создание веб-приложения на Python с использованием фреймворка Flask
    • Создание SAP-программы в Yandex Cloud
    • Развертывание сервера Minecraft в Yandex Cloud
    • Автоматизация сборки образов с помощью Jenkins и Packer
    • Создание тестовых виртуальных машин через GitLab CI
    • Высокопроизводительные вычисления (HPC) на прерываемых ВМ
    • Настройка SFTP-сервера на Centos 7
    • Развертывание параллельной файловой системы GlusterFS в высокодоступном режиме
    • Развертывание параллельной файловой системы GlusterFS в высокопроизводительном режиме
    • Резервное копирование в Object Storage с помощью Bacula
    • Построение пайплайна CI/CD в GitLab с использованием serverless-продуктов
    • Реализация защищенной высокодоступной сетевой инфраструктуры с выделением DMZ на основе Check Point NGFW
    • Сегментация облачной инфраструктуры с помощью решения Check Point Next-Generation Firewall
    • Настройка защищенного туннеля GRE поверх IPsec
    • Создание бастионного хоста
    • Реализация отказоустойчивых сценариев для сетевых виртуальных машин
    • Создание туннеля между двумя подсетями при помощи OpenVPN Access Server
    • Создание внешней таблицы на базе таблицы из бакета Object Storage с помощью конфигурационного файла
    • Настройка сетевой связности между подсетями BareMetal и Virtual Private Cloud
    • Работа со снапшотами в Managed Service for Kubernetes
    • Запуск языковой модели DeepSeek-R1 в кластере GPU
    • Запуск библиотеки vLLM с языковой моделью Gemma 3 на ВМ с GPU
    • Доставка USB-устройств на виртуальную машину или сервер BareMetal
  • Управление доступом
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • История изменений
  • Обучающие курсы

В этой статье:

  • Подготовьте облако к работе
  • Необходимые платные ресурсы
  • Создайте инфраструктуру
  • Проверьте работу группы ВМ и сетевого балансировщика
  • Проверьте работу автоматического масштабирования
  • Как удалить созданные ресурсы
  1. Практические руководства
  2. Работа с группой ВМ с автоматическим масштабированием
  3. Terraform

Работа с группой виртуальных машин с автоматическим масштабированием с помощью Terraform

Статья создана
Yandex Cloud
Улучшена
kvendingoldo
Обновлена 6 марта 2025 г.
  • Подготовьте облако к работе
    • Необходимые платные ресурсы
  • Создайте инфраструктуру
  • Проверьте работу группы ВМ и сетевого балансировщика
    • Проверьте работу автоматического масштабирования
  • Как удалить созданные ресурсы

Чтобы создать инфраструктуру для группы ВМ с политикой автоматического масштабирования c помощью Terraform:

  1. Подготовьте облако к работе.
  2. Создайте инфраструктуру.
  3. Проверьте работу группы ВМ и сетевого балансировщика.

Если созданные ресурсы вам больше не нужны, удалите их.

Подготовьте облако к работеПодготовьте облако к работе

Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:

  1. Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь.
  2. На странице Yandex Cloud Billing убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе ACTIVE или TRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака.

Подробнее об облаках и каталогах.

  1. Если у вас еще нет интерфейса командной строки Yandex Cloud, установите его.

  2. Чтобы скрипты из пошагового руководства работали корректно, скачайте и установите утилиту jq.

  3. Чтобы проверить работу автоматического масштабирования, установите утилиту wrk для проведения нагрузочного тестирования.

Необходимые платные ресурсыНеобходимые платные ресурсы

В стоимость инфраструктуры входят:

  • плата за постоянно запущенные ВМ (см. тарифы Compute Cloud);
  • плата за сетевые балансировщики и балансировку трафика (см. тарифы Network Load Balancer).

Создайте инфраструктуруСоздайте инфраструктуру

Terraform позволяет быстро создать облачную инфраструктуру в Yandex Cloud и управлять ею с помощью файлов конфигураций. В файлах конфигураций хранится описание инфраструктуры на языке HCL (HashiCorp Configuration Language). При изменении файлов конфигураций Terraform автоматически определяет, какая часть вашей конфигурации уже развернута, что следует добавить или удалить.

Terraform распространяется под лицензией Business Source License, а провайдер Yandex Cloud для Terraform — под лицензией MPL-2.0.

Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform или в зеркале.

Чтобы создать инфраструктуру для автоматического масштабирования группы ВМ с помощью Terraform:

  1. Установите Terraform и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).

  2. Подготовьте файлы с описанием инфраструктуры:

    Готовая конфигурация
    Вручную
    1. Склонируйте репозиторий с конфигурационными файлами:

      git clone https://github.com/yandex-cloud-examples/yc-vm-group-with-autoscale.git
      
    2. Перейдите в директорию с репозиторием. В ней должны появиться файлы:

      • vm-autoscale.tf — конфигурация создаваемой инфраструктуры.
      • declaration.yaml — описание Docker-контейнера с веб-сервером, который будет запущен на ВМ для имитации нагрузки на сервис.
      • config.tpl — описание параметров пользователя ВМ.
      • vm-autoscale.auto.tfvars — пользовательские данные.
    1. Создайте папку для конфигурационных файлов.
    2. Создайте в папке:
      1. Конфигурационный файл vm-autoscale.tf:

        vm-autoscale.tf
        # Объявление переменных для конфиденциальных параметров
        
        variable "folder_id" {
          type = string
        }
        
        variable "vm_user" {
          type = string
        }
        
        variable "ssh_key" {
          type      = string
          sensitive = true
        }
        
        # Настройка провайдера
        
        terraform {
          required_providers {
            yandex = {
              source = "yandex-cloud/yandex"
              version = ">= 0.47.0"
            }
          }
        }
        
        provider "yandex" {
          zone = "ru-central1-a"
        }
        
        # Создание сервисного аккаунта и назначение ему ролей
        
        resource "yandex_iam_service_account" "for-autoscale" {
          name = "for-autoscale"
        }
        
        resource "yandex_resourcemanager_folder_iam_member" "vm-autoscale-sa-role-compute" {
          folder_id = var.folder_id
          role      = "editor"
          member    = "serviceAccount:${yandex_iam_service_account.for-autoscale.id}"
        }
        
        # Создание облачной сети и подсетей
        
        resource "yandex_vpc_network" "vm-autoscale-network" {
          name = "vm-autoscale-network"
        }
        
        resource "yandex_vpc_subnet" "vm-autoscale-subnet-a" {
          name           = "vm-autoscale-subnet-a"
          zone           = "ru-central1-a"
          v4_cidr_blocks = ["192.168.1.0/24"]
          network_id     = yandex_vpc_network.vm-autoscale-network.id
        }
        
        resource "yandex_vpc_subnet" "vm-autoscale-subnet-b" {
          name           = "vm-autoscale-subnet-b"
          zone           = "ru-central1-b"
          v4_cidr_blocks = ["192.168.2.0/24"]
          network_id     = yandex_vpc_network.vm-autoscale-network.id
        }
        
        # Создание группы безопасности
        
        resource "yandex_vpc_security_group" "sg-1" {
          name                = "sg-autoscale"
          network_id          = yandex_vpc_network.vm-autoscale-network.id
          egress {
            protocol          = "ANY"
            description       = "any"
            v4_cidr_blocks    = ["0.0.0.0/0"]
          }
          ingress {
            protocol          = "TCP"
            description       = "ext-http"
            v4_cidr_blocks    = ["0.0.0.0/0"]
            port              = 80
          }
          ingress {
            protocol          = "TCP"
            description       = "healthchecks"
            predefined_target = "loadbalancer_healthchecks"
            port              = 80
          }
        }
        
        # Указание готового образа ВМ
        
        data "yandex_compute_image" "autoscale-image" {
          family = "container-optimized-image"
        }
        
        # Создание группы ВМ
        
        resource "yandex_compute_instance_group" "autoscale-group" {
          name                = "autoscale-vm-ig"
          folder_id           = var.folder_id
          service_account_id  = yandex_iam_service_account.for-autoscale.id
          instance_template {
        
            platform_id = "standard-v3"
            resources {
              memory = 2
              cores  = 2
            }
          
            boot_disk {
              mode = "READ_WRITE"
              initialize_params {
                image_id = data.yandex_compute_image.autoscale-image.id
                size     = 30
              }
            }
        
            network_interface {
              network_id = yandex_vpc_network.vm-autoscale-network.id
              subnet_ids = [
                yandex_vpc_subnet.vm-autoscale-subnet-a.id,
                yandex_vpc_subnet.vm-autoscale-subnet-b.id
              ]
              security_group_ids = [ yandex_vpc_security_group.sg-1.id ]
              nat                = true
            }
        
            metadata = {
              user-data = templatefile("config.tpl", {
                VM_USER = var.vm_user
                SSH_KEY = var.ssh_key
              })
              docker-container-declaration = file("declaration.yaml")
            }
          }
        
          scale_policy {
            auto_scale {
              initial_size           = 2
              measurement_duration   = 60
              cpu_utilization_target = 40
              min_zone_size          = 1
              max_size               = 6
              warmup_duration        = 120
            }
          }
        
          allocation_policy {
            zones = [
              "ru-central1-a",
              "ru-central1-b"
            ]
          }
        
          deploy_policy {
            max_unavailable = 1
            max_expansion   = 0
          }
        
          load_balancer {
            target_group_name        = "auto-group-tg"
            target_group_description = "load balancer target group"
          }
        }
        
        # Создание сетевого балансировщика
        
        resource "yandex_lb_network_load_balancer" "balancer" {
          name = "group-balancer"
        
          listener {
            name        = "http"
            port        = 80
            target_port = 80
          }
        
          attached_target_group {
            target_group_id = yandex_compute_instance_group.autoscale-group.load_balancer[0].target_group_id
            healthcheck {
              name = "tcp"
              tcp_options {
                port = 80
              }
            }
          }
        }
        
      2. Файл declaration.yaml с описанием Docker-контейнера с веб-сервером, который будет запущен на ВМ для имитации нагрузки на сервис:

        declaration.yaml
        spec:
        containers:
        - image: cr.yandex/yc/demo/web-app:v1
          securityContext:
            privileged: false
          tty: false
          stdin: false
        
      3. Файл config.tpl с параметрами пользователя ВМ:

        config.tpl
        users:
          - name: "${VM_USER}"
            groups: sudo
            shell: /bin/bash
            sudo: 'ALL=(ALL) NOPASSWD:ALL'
            ssh_authorized_keys:
              - "${SSH_KEY}"
        
      4. Файл с пользовательскими данными vm-autoscale.auto.tfvars:

        vm-autoscale.auto.tfvars
        folder_id = "<идентификатор_каталога>"
        vm_user   = "<имя_пользователя_ВМ>"
        ssh_key   = "<содержимое_публичного_SSH-ключа>"
        

    Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:

    • Сервисный аккаунт — yandex_iam_service_account.
    • Сеть — yandex_vpc_network.
    • Подсети — yandex_vpc_subnet.
    • Группа безопасности — yandex_vpc_security_group.
    • Группа ВМ — yandex_compute_instance_group.
    • Сетевой балансировщик — yandex_lb_network_load_balancer.
  3. В файле vm-autoscale.auto.tfvars задайте пользовательские параметры:

    • folder_id — идентификатор каталога.
    • vm_user — имя пользователя ВМ.
    • ssh_key — содержимое файла с открытым SSH-ключом для аутентификации пользователя на ВМ. Подробнее см. Создание пары ключей SSH.
  4. Создайте ресурсы:

    1. В терминале перейдите в папку, где вы отредактировали конфигурационный файл.

    2. Проверьте корректность конфигурационного файла с помощью команды:

      terraform validate
      

      Если конфигурация является корректной, появится сообщение:

      Success! The configuration is valid.
      
    3. Выполните команду:

      terraform plan
      

      В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.

    4. Примените изменения конфигурации:

      terraform apply
      
    5. Подтвердите изменения: введите в терминале слово yes и нажмите Enter.

После создания инфраструктуры, проверьте работу группы ВМ и сетевого балансировщика.

Проверьте работу группы ВМ и сетевого балансировщикаПроверьте работу группы ВМ и сетевого балансировщика

  1. Создайте нагрузку на одну из ВМ.

    Для этого сохраните скрипт с именем request.sh в домашнюю директорию. Скрипт через балансировщик group-balancer отправит на одну из ВМ запрос, который будет создавать нагрузку в 100% CPU в течение 30 секунд.

    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"
    
  2. Запустите скрипт:

    CLI
    sh request.sh
    

    Результат:

    projects/b0g12ga82bcv********/zones/ru-central1-b
    
  3. Посмотрите нагрузку на ВМ:

    Консоль управления
    1. В консоли управления выберите каталог, в котором вы создали группу ВМ.

    2. Выберите сервис Compute Cloud.

    3. На панели слева нажмите Группы виртуальных машин.

    4. Выберите группу ВМ auto-group.

    5. Перейдите на вкладку Мониторинг.

      Балансировщик направил запрос на одну из ВМ группы. В зоне доступности этой ВМ среднее потребление CPU (график Average CPU utilization in zone) выше, чем в других.

Проверьте работу автоматического масштабированияПроверьте работу автоматического масштабирования

Чтобы проверить работу автоматического масштабирования группы ВМ, нужно создать повышенную нагрузку на CPU каждой ВМ. В файле specification.yaml в параметре scale_policy.auto_scale.cpu_utilization_rule.utilization_target указано значение 40 — целевой уровень нагрузки 40% CPU. Если превысить целевую нагрузку, количество ВМ в группе увеличится.

  1. Создайте повышенную нагрузку на группу ВМ.

    Для этого сохраните скрипт с именем load.sh в домашнюю директорию. Скрипт в течение 10 минут в 12 потоков отправляет запросы к группе ВМ. При этом у каждой ВМ используется по 20% CPU на каждое ядро, обрабатывающее запрос. Группа ВМ в каждый момент времени будет загружена на 240% CPU. Скрипт специально выполняет несколько параллельных запросов по 20% CPU, а не один в 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"
    
  2. Запустите скрипт:

    CLI
    sh load.sh
    

    Результат:

    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
    
  3. Посмотрите нагрузку:

    Консоль управления
    1. В консоли управления выберите каталог, в котором вы создали группу ВМ auto-group.
    2. Выберите сервис Compute Cloud.
    3. На панели слева нажмите Группы виртуальных машин.
    4. Выберите группу ВМ auto-group.
    5. Перейдите на вкладку Мониторинг.
      На графике Number of instance in zone отображены изменения количества ВМ в каждой зоне доступности. На графике Average CPU utilization in zone — средняя CPU-нагрузка в каждой зоне доступности.
    6. Перейдите на вкладку Логи.
      На странице отображены сообщения о действиях в рамках автоматического масштабирования группы ВМ.

    Суммарная нагрузка в 240% CPU равномерно распределилась между двумя ВМ в двух зонах доступности и превысила целевой уровень нагрузки в 40% CPU. Yandex Compute Cloud создал по дополнительной ВМ в каждой зоне доступности и в группе стало четыре ВМ. Когда скрипт перестал создавать CPU-нагрузку, Compute Cloud автоматически уменьшил количество ВМ в группе до двух.

Как удалить созданные ресурсыКак удалить созданные ресурсы

Чтобы перестать платить за созданные ресурсы:

  1. Откройте конфигурационный файл vm-autoscale.tf и удалите описание создаваемой инфраструктуры из файла.

  2. Примените изменения:

    1. В терминале перейдите в папку, где вы отредактировали конфигурационный файл.

    2. Проверьте корректность конфигурационного файла с помощью команды:

      terraform validate
      

      Если конфигурация является корректной, появится сообщение:

      Success! The configuration is valid.
      
    3. Выполните команду:

      terraform plan
      

      В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.

    4. Примените изменения конфигурации:

      terraform apply
      
    5. Подтвердите изменения: введите в терминале слово yes и нажмите Enter.

См. такжеСм. также

  • Работа с группой виртуальных машин с автоматическим масштабированием с помощью консоли управления, CLI и API

Была ли статья полезна?

Предыдущая
Консоль управления
Следующая
Обзор
Проект Яндекса
© 2025 ООО «Яндекс.Облако»