Создать группу виртуальных машин с фиксированными IP-адресами
Вы можете использовать теги и переменные, чтобы создать группу ВМ с заранее заданными внутренними и публичными IP-адресами.
Чтобы создать группу ВМ с фиксированными IP-адресами:
-
По умолчанию все операции в Instance Groups выполняются от имени сервисного аккаунта. Если сервисного аккаунта нет, создайте его.
-
Создайте облачную сеть и подсети, например в двух зонах доступности, если у вас их нет.
-
Если вы хотите, чтобы ВМ из группы были доступны из интернета, зарезервируйте необходимое количество статических публичных IP-адресов. Для примера, приведенного ниже, вам будет достаточно четырех IP-адресов.
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
. -
Посмотрите описание команды CLI для создания группы ВМ:
yc compute instance-group create --help
-
Выберите один из публичных образов Yandex Cloud Marketplace, например Ubuntu 22.04 LTS.
Чтобы получить список доступных образов с помощью CLI, выполните следующую команду:
yc compute image list --folder-id standard-images
Результат:
+----------------------+-------------------------------------+--------------------------+----------------------+--------+ | ID | NAME | FAMILY | PRODUCT IDS | STATUS | +----------------------+-------------------------------------+--------------------------+----------------------+--------+ ... | fdvk34al8k5n******** | centos-7-1549279494 | centos-7 | dqni65lfhvv2******** | READY | | fdv7ooobjfl3******** | windows-2016-gvlk-1548913814 | windows-2016-gvlk | dqnnc72gj2is******** | READY | | fdv4f5kv5cvf******** | ubuntu-1604-lts-1549457823 | ubuntu-1604-lts | dqnnb6dc7640******** | READY | ... +----------------------+-------------------------------------+--------------------------+----------------------+--------+
-
Подготовьте файл с YAML-спецификацией группы ВМ с произвольным именем, например
specification.yaml
.Чтобы назначить ВМ группы фиксированные IP-адреса, добавьте в спецификацию:
-
В поле
allocation_policy
— вложенное полеzones
с парными параметрамиzone_id
иinstance_tags_pool
для каждой из зон доступности, в которых будут создаваться ВМ. Например, если ВМ группы будут расположены в зонах доступностиru-central1-a
иru-central1-b
, полеallocation_policy
будет выглядеть так:allocation_policy: zones: - zone_id: ru-central1-a instance_tags_pool: - <тег1_зоны_ru-central1-a> - <тег2_зоны_ru-central1-a> - zone_id: ru-central1-b instance_tags_pool: - <тег1_зоны_ru-central1-b> - <тег2_зоны_ru-central1-b>
Где:
zone_id
— идентификатор зоны доступности.instance_tags_pool
— список уникальных тегов для привязки IP-адресов к ВМ группы. Значение тега участвует в формировании имен ВМ, а также в формировании переменных, содержащих IP-адреса ВМ. Количество тегов для каждой зоны доступности должно соответствовать количеству ВМ, создаваемых в этой зоне. Примеры возможных значений тегов:ru1-a1
,ru1-b2
и т.п.
-
Поле
variables
, содержащее набор переменных, через которые с помощью шаблонов в группу ВМ передаются IP-адреса создаваемых ВМ:variables: - key: ip_<тег1_зоны_ru-central1-a> value: <внутренний_IP-адрес1> - key: external_ip_<тег1_зоны_ru-central1-a> value: <публичный_IP-адрес1> ... - key: ip_<тег2_зоны_ru-central1-b> value: <внутренний_IP-адрес_4> - key: external_ip_<тег2_зоны_ru-central1-b> value: <публичный_IP-адрес_4>
Где:
-
key
— имя переменной, в формате<префикс>_<тег>
:-
<префикс>
определяет тип IP-адреса. Например, для внутренних адресов можно использовать префиксip
, а для публичных IP-адресов —external_ip
. -
<тег>
должен быть идентичен значению соответствующего тега, заданного для данной ВМ в полеallocation_policy
, напримерru1-a1
.
-
-
value
— значение переменной: внутренний или публичный IP-адрес создаваемой ВМ.Внутренние IP-адреса должны принадлежать диапазону IP-адресов, выделенному для указанной подсети в соответствующей зоне доступности.
Если виртуальные машины группы будут создаваться без привязанных публичных IP-адресов, не задавайте переменные с префиксом
external_ip
.
Подробнее об использовании переменных в шаблоне ВМ см. в разделе Переменные в шаблоне виртуальной машины.
-
-
В поле
instance_template.name
— имя виртуальной машины, содержащее шаблон тега. Например:sample-vm-{instance.tag}
. После подстановки значений тегов в этот шаблон имена ВМ будут выглядеть какsample-vm-ru1-a1
,sample-vm-ru1-b2
и т.д. -
В поле
instance_template.network_interface_specs
— идентификаторы подсетей и шаблоны IP-адресов:instance_template: ... network_interface_specs: - subnet_ids: - <идентификатор_подсети_в_ru-central1-a> - <идентификатор_подсети_в_ru-central1-b> primary_v4_address_spec: address: "{ip_{instance.tag}}" one_to_one_nat_spec: ip_version: IPV4 address: "{<external_ip_{instance.tag}}"
Где:
subnet_ids
— список идентификаторов подсетей, в которых должны располагаться ВМ. Требуется указать одну подсеть в каждой из зон доступности, в которых будут созданы ВМ группы.primary_v4_address_spec.address
— шаблон внутренних IP-адресов. В шаблон будет подставлено значение из переменной, заданной для данной ВМ в полеvariables
.primary_v4_address_spec.one_to_one_nat_spec.address
— шаблон для публичных IP-адресов. В шаблон будет подставлено значение из переменной, заданной для данной ВМ в полеvariables
.
Если виртуальные машины группы будут создаваться без привязанных публичных IP-адресов, не добавляйте в спецификацию поле
primary_v4_address_spec.one_to_one_nat_spec
.
Пример YAML-спецификации:
service_account_id: ajegtlf2q28a******** name: my-vm-group-with-fixed-ips description: Example of using tags for managing ips. Created with CLI scale_policy: fixed_scale: size: 4 deploy_policy: max_unavailable: 2 allocation_policy: zones: - zone_id: ru-central1-a instance_tags_pool: - ru1-a1 - ru1-a2 - zone_id: ru-central1-b instance_tags_pool: - ru1-b1 - ru1-b2 variables: - key: ip_ru1-a1 value: 192.168.2.5 - key: external_ip_ru1-a1 value: 84.201.***.** - key: ip_ru1-a2 value: 192.168.2.15 - key: external_ip_ru1-a2 value: 130.193.**.** - key: ip_ru1-b1 value: 192.168.1.5 - key: external_ip_ru1-b1 value: 84.201.***.** - key: ip_ru1-b2 value: 192.168.1.15 - key: external_ip_ru1-b2 value: 84.201.***.* instance_template: name: sample-vm-{instance.tag} platform_id: standard-v2 resources_spec: memory: 2G cores: 2 boot_disk_spec: mode: READ_WRITE disk_spec: image_id: fd8dlvgiatiqd8tt2qke type_id: network-hdd size: 20g network_interface_specs: - subnet_ids: - e2l3qffk0h6t******** - e9bijtoprmcu******** primary_v4_address_spec: address: "{ip_{instance.tag}}" one_to_one_nat_spec: address: "{external_ip_{instance.tag}}"
В данном примере приведена спецификация для создания группы ВМ фиксированного размера с фиксированными внутренними и публичными IP-адресами.
Подробнее о параметрах спецификации группы ВМ см. в разделе Спецификация группы виртуальных машин в формате YAML.
-
-
Создайте группу ВМ в каталоге по умолчанию:
yc compute instance-group create --file specification.yaml
Данная команда создаст группу ВМ со следующими характеристиками:
- С именем
my-vm-group-with-fixed-ips
. - С OC
Ubuntu 22.04 LTS
. - С четырьмя ВМ — по две в зонах доступности
ru-central1-a
иru-central1-b
. - С двумя vCPU и двумя ГБ RAM.
- С сетевым HDD-диском объемом 20 ГБ.
- К каждой ВМ группы будут привязаны фиксированные внутренний и публичный IP-адреса.
- С именем
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
-
Опишите в конфигурационном файле параметры ресурсов, которые вы хотите создать:
resource "yandex_compute_instance_group" "ig-1" { name = "fixed-ig" folder_id = "<идентификатор_каталога>" service_account_id = "${yandex_iam_service_account.ig-sa.id}" deletion_protection = false depends_on = [yandex_resourcemanager_folder_iam_member.editor] instance_template { name = "sample-vm-{instance.tag}" platform_id = "standard-v3" resources { memory = 2 cores = 2 } boot_disk { mode = "READ_WRITE" initialize_params { image_id = "fd8dlvgiatiqd8tt2qke" } } network_interface { network_id = "${yandex_vpc_network.ig-network.id}" subnet_ids = ["${yandex_vpc_subnet.ig-subnet-a.id}", "${yandex_vpc_subnet.ig-subnet-b.id}"] nat = true ip_address = "{ip_{instance.tag}}" nat_ip_address = "{external_ip_{instance.tag}}" } metadata = { user-data = "#cloud-config\n datasource:\n Ec2:\n strict_id: false\n ssh_pwauth: no\n users:\n - name: <имя_пользователя_ВМ>\n sudo: ALL=(ALL) NOPASSWD:ALL\n shell: /bin/bash\n ssh_authorized_keys:\n - <публичный_SSH-ключ>\n runcmd: []" } } variables = { ip_ru1-a1 = "192.168.2.5" external_ip_ru1-a1 = "${yandex_vpc_address.external-address-a1.external_ipv4_address[0].address}" ip_ru1-a2 = "192.168.2.15" external_ip_ru1-a2 = "${yandex_vpc_address.external-address-a2.external_ipv4_address[0].address}" ip_ru1-b1 = "192.168.1.5" external_ip_ru1-b1 = "${yandex_vpc_address.external-address-b1.external_ipv4_address[0].address}" ip_ru1-b2 = "192.168.1.15" external_ip_ru1-b2 = "${yandex_vpc_address.external-address-b2.external_ipv4_address[0].address}" } scale_policy { fixed_scale { size = 4 } } allocation_policy { zones = ["ru-central1-a","ru-central1-b"] instance_tags_pool { zone = "ru-central1-a" tags = ["ru1-a1","ru1-a2"] } instance_tags_pool { zone = "ru-central1-b" tags = ["ru1-b1","ru1-b2"] } } deploy_policy { max_unavailable = 1 max_expansion = 0 } } resource "yandex_iam_service_account" "ig-sa" { name = "instance-group-sa" description = "Сервисный аккаунт для управления группой ВМ." } resource "yandex_resourcemanager_folder_iam_member" "editor" { folder_id = "<идентификатор_каталога>" role = "editor" member = "serviceAccount:${yandex_iam_service_account.ig-sa.id}" depends_on = [ yandex_iam_service_account.ig-sa, ] } resource "yandex_vpc_network" "ig-network" { name = "ig-network" } resource "yandex_vpc_subnet" "ig-subnet-a" { name = "ig-subnet-a" zone = "ru-central1-a" network_id = "${yandex_vpc_network.ig-network.id}" v4_cidr_blocks = ["192.168.2.0/24"] } resource "yandex_vpc_subnet" "ig-subnet-b" { name = "ig-subnet-b" zone = "ru-central1-b" network_id = "${yandex_vpc_network.ig-network.id}" v4_cidr_blocks = ["192.168.1.0/24"] } resource "yandex_vpc_address" "external-address-a1" { name = "external-address-a1" external_ipv4_address { zone_id = "ru-central1-a" } } resource "yandex_vpc_address" "external-address-a2" { name = "external-address-a2" external_ipv4_address { zone_id = "ru-central1-a" } } resource "yandex_vpc_address" "external-address-b1" { name = "external-address-b1" external_ipv4_address { zone_id = "ru-central1-b" } } resource "yandex_vpc_address" "external-address-b2" { name = "external-address-b2" external_ipv4_address { zone_id = "ru-central1-b" } }
Где:
-
yandex_compute_instance_group
— описание группы ВМ:-
Общая информация о группе ВМ:
name
— имя группы ВМ.folder_id
— идентификатор каталога.service_account_id
— идентификатор сервисного аккаунта.deletion_protection
— защита группы ВМ от удаления:true
илиfalse
. Пока опция включена, группу ВМ удалить невозможно. Значение по умолчаниюfalse
.
-
instance_template
— шаблон ВМ:-
name
— имя виртуальной машины, содержащее шаблон тега, напримерsample-vm-{instance.tag}
. После подстановки значений тегов в этот шаблон имена ВМ будут выглядеть какsample-vm-ru1-a1
,sample-vm-ru1-b2
и т.д. -
platform_id
— платформа. -
resources
— количество ядер vCPU и объем RAM, доступные ВМ. Значения должны соответствовать выбранной платформе. -
boot_disk
— настройки загрузочного диска:mode
— режим доступа к диску:READ_ONLY
(чтение) илиREAD_WRITE
(чтение и запись).image_id
— идентификатор выбранного образа. Вы можете получить идентификатор образа из списка публичных образов.
-
network_interface
— настройка сети:subnet_ids
— список идентификаторов подсетей, в которых должны располагаться ВМ. Требуется указать одну подсеть в каждой из зон доступности, в которых будут созданы ВМ группы.nat
— параметр, задающий привязку публичного IP-адреса к ВМ. Возможные значенияtrue
иfalse
.ip_address
— внутренний IP-адрес ВМ. В качестве значения используется шаблон, в который будет подставлено значение из переменной, заданной для данной ВМ в блокеvariables
.nat_ip_address
— публичный IP-адрес ВМ. В качестве значения используется шаблон, в который будет подставлено значение из переменной, заданной для данной ВМ в полеvariables
.
-
metadata
— в метаданных передайте имя пользователя ВМ и открытый ключ для SSH-доступа этого пользователя на ВМ.Подробнее см. в разделе Метаданные виртуальной машины.
-
-
variables
— переменные, назначаемые группе ВМ. Блок содержит список переменных в формате<имя> = <значение>
. Через переменные с помощью шаблонов в группу ВМ передаются IP-адреса создаваемых ВМ:-
имя переменной: должно быть в формате
<префикс>_<тег>
:-
<префикс>
определяет тип IP-адреса. Например, для внутренних IP-адресов можно использовать префиксip
, а для публичных IP-адресов —external_ip
. -
<тег>
должен быть идентичен значению соответствующего тега, заданного для данной ВМ в полеallocation_policy
, напримерru1-a1
.
-
-
значение переменной: внутренний или публичный IP-адрес создаваемой ВМ.
Внутренние IP-адреса должны принадлежать диапазону IP-адресов, выделенному для указанной подсети в соответствующей зоне доступности.
Если виртуальные машины группы будут создаваться без привязанных публичных IP-адресов, не задавайте переменные с префиксом
external_ip
.
Подробнее об использовании переменных в шаблоне ВМ см. в разделе Переменные в шаблоне виртуальной машины.
-
-
deploy_policy
— политика развертывания ВМ в группе.scale_policy
— политика масштабирования ВМ в группе.allocation_policy
— политика распределения ВМ по зонам доступности и регионам:-
zones
— массив, содержащий идентификаторы зон доступности, в которых будут создаваться ВМ группы. -
instance_tags_pool
— список уникальных тегов, необходимых для привязки IP-адресов к ВМ группы. Задается отдельно для каждой зоны доступности, в которых будут создаваться ВМ группы.Значение тегов, заданных в массиве
tags
, участвует в формировании имен ВМ, а также в формировании переменных, содержащих IP-адреса ВМ. Количество тегов в массивеtags
для каждой зоны доступности должно соответствовать количеству ВМ, создаваемых в этой зоне. Примеры возможных значений тегов:ru1-a1
,ru1-b2
и т.п.
-
-
-
yandex_iam_service_account
— описание сервисного аккаунта. Все операции в Instance Groups выполняются от имени сервисного аккаунта.Сервисный аккаунт нельзя удалить, пока он связан с группой виртуальных машин.
-
yandex_resourcemanager_folder_iam_member
— описание прав доступа к каталогу, которому принадлежит сервисный аккаунт. Чтобы иметь возможность создавать, обновлять и удалять ВМ в группе, назначьте сервисному аккаунту рольeditor
. -
yandex_vpc_network
— описание облачной сети. -
yandex_vpc_subnet
— описание подсетей, к которым будут подключены ВМ группы. -
yandex_vpc_address
— описание зарезервированного статического публичного IP-адреса.Примечание
Если у вас уже есть подходящие ресурсы (сервисный аккаунт, облачная сеть и подсети, зарезервированные статические IP-адреса), описывать их повторно не нужно. Используйте их имена и идентификаторы в соответствующих параметрах.
Более подробную информацию о ресурсах, которые вы можете создать с помощью Terraform, см. в документации провайдера
. -
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
После этого в указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Воспользуйтесь методом REST API create для ресурса InstanceGroup или вызовом gRPC API InstanceGroupService/Create.